题意: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. 运行UMAT:+ABQ和VS、IVF绑定

    运行UMAT: 1.run-script----xxxx.py2.属性---编辑材料---通用---非独立变量---用户材料3.job---编辑作业---通用----用户子程序.for4.parall ...

  2. NSIS 查找目录下的所有文件夹

    在制作安装包的时候,需要查看下某一目录下的所有文件夹的名称.经过查资料发现需要用到NSIS 的一个插件Locate.下载该插件后,会在NSIS的安装目录 ...Program Files\NSIS\P ...

  3. python并发编程基础之守护进程、队列、锁

    并发编程2 1.守护进程 什么是守护进程? 表示进程A守护进程B,当被守护进程B结束后,进程A也就结束. from multiprocessing import Process import time ...

  4. Jdbc使用SSH连接mysql

    pom.xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-ja ...

  5. centos病毒

    #!/bin/bash exec &>/dev/null {echo,ZXhlYyAmPi9kZXYvbnVsbApleHBvcnQgUEFUSD0kUEFUSDovYmluOi9zYm ...

  6. centos 7.2 同步北京时间 ,多台机器同步时间

    linux 系统没有北京时间,同步的是上海时间 linux 系统有两个时钟:一个是硬件时钟,即BIOS时间:另一个是系统时钟,是linux系统Kernel(内核)时间. 系统开启时,系统会读取硬件时间 ...

  7. css中有三个显示和隐藏的单词比较常见,display visibility 和 overflow我们需要区分开来

    display display 设置或检索对象是否及如何显示 display: none 隐藏对象与它相反的是display:block 除了转换为块级元素之外,同时还有显示元素的意思 特点: 隐藏之 ...

  8. python中logging模块

    1. 日志的等级 DEBUG.INFO.NOTICE.WARNING.ERROR.CRITICAL.ALERT.EMERGENCY 级别 何时使用 DEBUG 详细信息,典型地调试问题时会感兴趣. 详 ...

  9. opencv 之 transformation

    getAffineTransform() : calculates an affine transform from three pairs of the corresponding points. ...

  10. soa 和微服务的区别

    soa beased applications are compromised of more loosely coupled componets that use an enterprise ser ...