题意:b数组可以自由排序,c[i]=(a[i]+b[i])%n.

题目中要求c数组的字典序是最小的。那么我们需要尽量满足前面的c[i],才能使字典序最小。

我们知道a[i]和b[i]都是[0,n-1]的范围内。那么我们容易得到

如果a[i]+b[i]>=n,(a[i]+b[i])%n<a[i]且(a[i]+b[i])%n<b[i]。得出这样的结论之后,我们就可以进行模拟了。

如果当前a[i]能找到一个b[i]使得a[i]+b[i]>=n,那么我们就找符合条件最小的元素,否则的话a[i]加上最小的b[i]才满足的字典序最小。

我们需要做的就是维护b数组中哪些元素是已经使用的就可以了,下面是两种方法。

二分加树状数组维护

#include<iostream>
#include<vector>
#include<stack>
#include<algorithm>
#include<cstdio>
#include<map>
#include<string>
#include<cstring>
using namespace std;
map<int,int>p;
int a[];
int b[];
int c[];
bool vis[];
int sum[];
int n;
inline int lowbit(int x)
{
return x&(-x);
}
void update(int x,int num)
{
while(x<=n)
{
sum[x]+=num;
x+=lowbit(x);
}
}
int getsum(int x)
{
int s=;
while(x>)
{
s+=sum[x];
x-=lowbit(x);
}
return s;
}
int main()
{ int t,i,maxi,l,r,t1,t2,l1,r1,m1,m2,m;
while(cin>>n)
{
memset(sum,,sizeof(sum));
for(i=; i<=n; i++)
scanf("%d",&a[i]),update(i,);
for(i=; i<=n; i++)
scanf("%d",&b[i]);
sort(b+,b+n+);
memset(vis,false,sizeof(vis));
m1=; for(i=;i<=n;i++)
{
t=lower_bound(b+,b+n+,n-a[i])-(b);
while(m1<=n&&vis[m1])
m1++;
l=t-;
r=n+;
if(t!=n+)
while(l+<r)
{
m=(l+r)>>;
if(getsum(m)-getsum(t-)>)
r=m;
else
l=m;
}
t=r;
if(t>n)
{
c[i]=(a[i]+b[m1])%n;
vis[m1]=true;
update(m1,-);
while(vis[m1]&&m1<=n)
m1++;
}
else
{
c[i]=(a[i]+b[t])%n;
update(t,-);
vis[t]=true;
}
}
for(i=;i<=n-;i++)
printf("%d ",c[i]);
printf("%d\n",c[i]); } return ;
}

mutilset删除元素来维护

#include<iostream>
#include<vector>
#include<stack>
#include<algorithm>
#include<cstdio>
#include<map>
#include<string>
#include<cstring>
#include<set>
using namespace std;
map<int,int>p;
int a[];
int b[];
int c[];
bool vis[];
int sum[];
int n;
int main()
{ int t,i,maxi,l,r,t1,t2,l1,r1,m1,m2,m;
while(cin>>n)
{
multiset<int>mm;
for(i=; i<=n; i++)
scanf("%d",&a[i]);
for(i=; i<=n; i++)
scanf("%d",&b[i]),mm.insert(b[i]);
memset(vis,false,sizeof(vis));
m1=;
for(i=;i<=n;i++)
{
multiset<int>::iterator it=mm.lower_bound(n-a[i]);
if(it!=mm.end())
{
c[i]=((*it)+a[i])%n;
mm.erase(it);
}
else
{
it=mm.begin();
c[i]=(*it)+a[i];
mm.erase(it);
}
}
for(i=;i<=n-;i++)
printf("%d ",c[i]);
printf("%d\n",c[i]);
} return ;
}

Codeforces Round #555 (Div. 3) E. Minimum Array的更多相关文章

  1. Codeforces Round #555 (Div. 3) E. Minimum Array 【数据结构 + 贪心】

    一 题面 E. Minimum Array 二 分析 注意前提条件:$0 \le  a_{i} \lt n$ 并且 $0 \le  b_{i} \lt n$.那么,我们可以在$a_{i}$中任取一个数 ...

  2. Codeforces Round #555 (Div. 3) E. Minimum Array (贪心,二分,set)

    题意:给你两个长度为\(n\)的数组\(a\)和\(b\),元素值在\([0,n-1]\),可以对\(b\)数组的元素任意排序,求新数组\(c\),满足\(c_i=(a_i+b_i)\ mod\ n\ ...

  3. 老年OIer的Python实践记—— Codeforces Round #555 (Div. 3) solution

    对没错下面的代码全部是python 3(除了E的那个multiset) 题目链接:https://codeforces.com/contest/1157 A. Reachable Numbers 按位 ...

  4. CodeForces Round #555 Div.3

    A. Reachable Numbers 代码: #include <bits/stdc++.h> using namespace std; ; int N; set<int> ...

  5. Codeforces Round #555 (Div. 3)[1157]题解

    不得不说这场div3是真的出的好,算得上是从我开始打开始最有趣的一场div3.因为自己的号全都蓝了,然后就把不经常打比赛的dreagonm的号借来打这场,然后...比赛结束rank11(帮dreago ...

  6. Codeforces Round #555 (Div. 3) c2 d e f

    c2:Increasing Subsequence (hard version) 那边小取那边,然后相等比较后面的长度 #include<bits/stdc++.h> using name ...

  7. Codeforces Round #258 (Div. 2) . Sort the Array 贪心

    B. Sort the Array 题目连接: http://codeforces.com/contest/451/problem/B Description Being a programmer, ...

  8. Codeforces Round #555 (Div. 3) AB

    A:    http://codeforces.com/contest/1157/problem/A 题意:每次加到10的整数倍之后,去掉后面的0,问最多有多少种可能. #include <io ...

  9. Codeforces Round #411 div 2 D. Minimum number of steps

    D. Minimum number of steps time limit per test 1 second memory limit per test 256 megabytes input st ...

随机推荐

  1. samba实现CentOS和window上的数据同步

    前言 之前做了一个项目,需要写python脚本来修改组件的安装方式,脚本是在windows下面的pycharm下面进行编写,但是编译要在linux上面进行分模块的maven编译,虽然之前也写了pych ...

  2. 4.Linux开机设置项

    开机建议优化项: //关闭防火墙 systemctl stop firewalld systemctl disable firewalld //关闭SELinux: setenforce 0 sed ...

  3. 【398】COMP9021 - Polynomial

    构建 Polynomial 类,实现 +, -, , / and +=, -=, =, /= 参考:如何用python编程求解二元一次方程组.如x+y=3;x-y=1 参考:python对重载运算符的 ...

  4. SHA-256算法和区块链原理初探

    组内技术分享的内容,目前网上相关资料很多,但读起来都不太合自己的习惯,于是自己整理并编写一篇简洁并便于(自己)理解和分享的文章. 因为之前对密码学没有专门研究,自己的体会或理解会特别标注为" ...

  5. [Flutter] 写第一个 Flutter app,part1 要点

    模拟器中调试元素的布局: Android Studio 右侧边栏 Flutter Inspector,选择 Toggle Debug Paint 打开. 格式化代码: 编辑器中右键 Reformat ...

  6. 用 ghostscript 转化PDF文件为图片 的参数设置

    example: gswin32 -dSAFER -dBATCH -dNOPAUSE -r300 -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sDEVICE=jp ...

  7. java mybatis后台判断表是否存在mysql

    <select id="isTableExist" parameterType="string" resultType="int"&g ...

  8. (项目六)Mha-Atlas-MySQL高可用方案实践

    mha-mysql环境准备: 三台虚拟机,都安装了mysql,都关闭防火墙和selinux,同时在每台虚拟机上都做映射 软件包 1) mha管理节点安装包: mha4mysql-manager-0.5 ...

  9. python 编程

    1.一个str A,列表B的所有元素都在A中时返回True A = 'HeooWoldHomeUbuntuCentOSFedora'B = ['Ubuntu', 'CentOS', 'Home', ' ...

  10. JMETER java.net.SocketTimeoutException: Read timed out

    将JMETER脚本里的请求超时时间由1000ms 修改为 10000ms,该错误不再出现.