题目链接:

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4102

题意:

给出一个长度为n的数组,重排它们,让相同位置的数不同,并且字典序最小

数据范围:

$1 \le n \le 10^5$
$1 \le a_i \le n$

分析:

不可能构造的情况:

  1. 有一个数的数量大于$n$的一半

可以构造的情况:

  1. 当前位置一定要填$x$,如果后面的坑位数量等于剩余的非$x$数量(线段树维护)
  2. 填第一小的数或者第二小的数(set维护)

ac代码:

#include<bits/stdc++.h>
#define ll long long
#define pa pair<int,int>
using namespace std;
const int maxn=1e5+10;
const int maxm=1e7+10;
const int mod=1e9+7;
set<int>se;
pa tree[maxn*4];
int lazy[maxn*4],num[maxn],book[maxn],n;
int see(int x)
{
set<int>::iterator i=se.begin();
if(x==2)i++;
return (*i);
}
void build(int st,int en,int rt)
{
if(st==en)
{
if(num[st])
tree[rt]=make_pair(n-book[st]*2,st);
else
tree[rt]=make_pair(1e9,st);
return ;
}
int md=(st+en)/2;
build(st,md,rt*2);
build(md+1,en,rt*2+1);
tree[rt]=min(tree[rt*2],tree[rt*2+1]);
}
void updata(int l,int r,int x,int st,int en,int rt)
{
if(r<st||l>en)
return ;
if(l<=st&&r>=en)
{
tree[rt].first+=x;
lazy[rt]+=x;
return ;
}
if(lazy[rt])
{
tree[rt*2].first+=lazy[rt];
tree[rt*2+1].first+=lazy[rt];
lazy[rt*2]+=lazy[rt];
lazy[rt*2+1]+=lazy[rt];
lazy[rt]=0;
}
int md=(st+en)/2;
updata(l,r,x,st,md,rt*2);
updata(l,r,x,md+1,en,rt*2+1);
tree[rt]=min(tree[rt*2],tree[rt*2+1]);
}
void intit()
{
memset(lazy,0,sizeof(lazy));
for(int i=1;i<=n;i++)book[i]=0;
}
void del(int x)
{
book[x]--;
if(book[x]==0)se.erase(x);
updata(1,n,-1,1,n,1);
updata(x,x,1,1,n,1);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
intit();
for(int i=1; i<=n; i++)
{
int x;
scanf("%d",&x);
book[x]++;
num[i]=x;
}
build(1,n,1);
if(tree[1].first<0)
{
printf("Impossible\n");
continue;
}
for(int i=1;i<=n;i++)
if(book[i])se.insert(i);
for(int i=1; i<=n; i++)
{
updata(num[i],num[i],1,1,n,1);
//int g=se(1);
if(tree[1].first==0)
{
printf("%d",tree[1].second);
del(tree[1].second);
}
else
{
int g=see(1);
if(g==num[i])g=see(2);
printf("%d",g);
del(g);
}
if(i==n)printf("\n");
else printf(" ");
}
}
return 0;
}

  

最新文章

  1. [转载]C#读写txt文件的两种方法介绍
  2. Techparty-广州 10 月 31 日 Docker 专场沙龙 后记
  3. eclipse的安装与配置
  4. [moka同学笔记]Yii下国家省市三级联动
  5. flume+elasticsearch
  6. json2.js的初步学习与了解
  7. matlab提速技巧(自matlab帮助文件)
  8. T-SQL视图
  9. PHP短信发送服务 youe短信企业服务
  10. java的配置环境简介
  11. 在O(n)时间复杂度内找到出现超过一半的数
  12. 对于ArrayList中的泛型进行分析
  13. Django1.6版本的PG数据库定义手动升级
  14. DS控件库 DS按钮多种样式
  15. JS设置Cookie过期时间
  16. RxJS核心概念之Subjet在angular2+上的应用
  17. Java第二课 项目的导入和导出
  18. 台式电脑、笔记本快捷选择启动项Boot 快捷键大全
  19. JavaScript获取键盘事件
  20. GSON中Java对象与JSON互相转换——(一)

热门文章

  1. Python 变量作用域与函数
  2. MySQL create table语法详解
  3. Sharepoint2010设置自定义母版页
  4. linux 打包与解压命令--常用
  5. Python应用范围seo
  6. JavaScript中的setTimeout、setInterval和随机函数制作简易抽奖小程序
  7. ajax 传参数 java后台接收
  8. 13.SpringMVC核心技术-异常处理
  9. functools.lru_cache装饰器
  10. git回退到历史版本