链接
https://codeforces.com/contest/1157/problem/E
题解
又被水题关了一个晚上
我一开始想用并查集,但是发现越写越复杂
我就觉得肯定不是并查集,毕竟
d
i
v
3
div3
div3
然后我右写了一发暴力(加了点优化),结果
T
T
T了
无奈点开题解,竟然发现是
m
u
l
t
i
s
e
t
multiset
multiset
就是我要找
≥
n
−
a
i
\geq n-a_i
≥n−ai的最小的数字,这其实就是一个lower_bound嘛
代码
#include<bits/stdc++.h>
#define maxn 200010
#define linf (1ll<<60)
#define iinf 0x3f3f3f3f
#define eps 1e-8
#define cl(x) memset(x,0,sizeof(x))
#define mod 998244353ll
using namespace std;
typedef long long ll;
int read(int x=0)
{
int c, f=1;
for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
for(;isdigit(c);c=getchar())x=x*10+c-48;
return f*x;
}
int N, a[maxn];
multiset<int> b;
int main()
{
ll n, m, i;
n=read();
for(i=1;i<=n;i++)a[i]=read();
for(i=1;i<=n;i++)b.emplace(read());
for(i=1;i<=n;i++)
{
int x=(n-a[i])%n;
auto it=b.lower_bound(x);
if(it==b.end())it=b.begin();
printf("%d ",(*it+a[i])%n);
b.erase(it);
}
return 0;
}