题意: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. myeclipse2017+ssm+tomcat8+jdk1.8

    练习上手ssm项目 工具:myeclipse2017,spring4,jdk1.8,tomcat8 搭建链接:https://www.cnblogs.com/cuglkb/p/6734666.html ...

  2. gitkraken clone报错 Configured SSH key is invalid

    gitkraken clone远程仓库时报错 Configured SSH key is invalid. Please confirm that is properly associated wit ...

  3. Linux命令:内建命令

    本文对内建命令进行归类,便于学习和记忆. 分类 内建命令 同义词 功能相反命令 定义&声明类 alias   unalias declare typeset   local     reado ...

  4. The message port closed before a response was received.

    问题描述:Chrome控制台报错:Unchecked runtime.lastError: The message port closed before a response was received ...

  5. FileStream说明

    FileStream(String, FileMode)    FileStream(String path, FileMode) 文件打开模式:(FileMode)包括6个枚举 Append:追加  ...

  6. jquery中的 parseJSON() 源码分析

    parseJSON: function( data ) { // Attempt to parse using the native JSON parser first if ( window.JSO ...

  7. Tensorflow的验证码识别

    最近在弄深度学习,从网上找了一些资料.这是基于Tensorflow的深度学习的验证码识别.https://cuijiahua.com/blog/2018/01/dl_5.html http://blo ...

  8. IIS启动应用程序池报错"服务无法在此时接受控制信息"

    用管理员方式打开命令行 输入命令netsh winsock reset 这个命令在百科上的解释是 netsh winsock reset命令,作用是重置 Winsock 目录.如果一台机器上的Wins ...

  9. Python数据结构与算法相关问题与解决技巧

      1.如何在列表, 字典, 集合中根据条件筛选数据¶ In [1]: from random import randint In [2]: data = [randint(-10,10) for _ ...

  10. c#Socket Tcp服务端编程

    创建一个socket服务类,绑定监听端口, 然后创建一个线程listen连接的客户端, 把监听到的客户端加入dictionary里面,以便于管理, 同时创建receive线程,循环接收数据加入list ...