Minimum Array

2002 ワード

https://codeforces.com/contest/1157/problem/E
題意:ci=(ai+bi)%nの辞書順が最小になるようにb配列を並べ替える
問題解:multisetでb配列を格納し、lower_boundクエリー、vectorを使わないで、TLEを簡単にします
/*
*@Author:   STZG
*@Language: C++
*/
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#define DEBUG
#define RI register int
#define endl "
" using namespace std; typedef long long ll; //typedef __int128 lll; const int N=200000+10; const int M=100000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,p,l,r,u,v; int ans,cnt,flag,temp,sum; int a[N],b[N],c[N]; multisetd; char str; struct node{}; int main() { #ifdef DEBUG freopen("input.in", "r", stdin); //freopen("output.out", "w", stdout); #endif //ios::sync_with_stdio(false); //cin.tie(0); //cout.tie(0); //scanf("%d",&t); //while(t--){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } for(int i=1;i<=n;i++){ scanf("%d",&b[i]); d.insert(b[i]); } multiset::iterator id; for(int i=1;i<=n;i++){ m=n-a[i]; id=d.lower_bound(m); if(id==d.end()){ id=d.lower_bound(0); } c[i]=((*id)+a[i])%n; d.erase(id); } for(int i=1;i<=n;i++) printf("%d%c",c[i],"
"[i==n]); //} #ifdef DEBUG printf("Time cost : %lf s
",(double)clock()/CLOCKS_PER_SEC); #endif //cout << "Hello world!" << endl; return 0; }