multiset不去重 自动排序 直接贪心二分查找第一个>=差值的数
找不到取当前最小值
#include<bits/stdc++.h>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int INF=0x3f3f3f3f;
const ll mod=1e9+7;
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
ll gcd(ll a,ll b)
{
return b!=0?gcd(b,a%b):a;
}
//c的字典序尽量小 尽可能以0开头 贪心即可 找不到>=差值的数 取b[i]最小值即可
multiset<int> s;//自动排序 不去重
int a[maxn],b[maxn],c[maxn];
int main()
{
IO;
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
s.insert(b[i]);
}
int temp=0;
for(int i=1;i<=n;i++)
{
temp=n-a[i];
auto pos=s.lower_bound(temp);
if(pos==s.end())
{
pos=s.begin();//贪心找不到取最小值
}
c[i]=*pos;//存差值
s.erase(pos);
}
for(int i=1;i<=n;i++)
{
cout<<(a[i]+c[i])%n;
if(i!=n)
cout<<" ";
}
return 0;
}