题目链接:

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;
}

  

浙江省赛C.Array in the Pocket(贪心+线段树)的更多相关文章

  1. BZOJ4391 High Card Low Card [Usaco2015 dec](贪心+线段树/set库

    正解:贪心+线段树/set库 解题报告: 算辣直接甩链接qwq 恩这题就贪心?从前往后从后往前各推一次然后找一遍哪个地方最大就欧克了,正确性很容易证明 (这里有个,很妙的想法,就是,从后往前推从前往后 ...

  2. 2018 ACMICPC上海大都会赛重现赛 H - A Simple Problem with Integers (线段树,循环节)

    2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 H - A Simple Problem with Integers (线段树,循环节) 链接:https://ac.nowcoder.co ...

  3. 【题解】P1712 [NOI2016]区间(贪心+线段树)

    [题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...

  4. UVALive 8519 Arrangement for Contests 2017西安区域赛H 贪心+线段树优化

    题意 等价于给一个数列,每次对一个长度为$K$的连续区间减一 为最多操作多少次 题解: 看样例猜的贪心,10分钟敲了个线段树就交了... 从1开始,找$[i,i+K]$区间的最小值,然后区间减去最小值 ...

  5. Codeforces 675E Trains and Statistic(DP + 贪心 + 线段树)

    题目大概说有n(<=10W)个车站,每个车站i卖到车站i+1...a[i]的票,p[i][j]表示从车站i到车站j所需买的最少车票数,求所有的p[i][j](i<j)的和. 好难,不会写. ...

  6. poj 2010 Moo University - Financial Aid (贪心+线段树)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 骗一下访问量.... 题意大概是:从c个中选出n个 ...

  7. Codeforces 626G Raffles(贪心+线段树)

    G. Raffles time limit per test:5 seconds memory limit per test:256 megabytes input:standard input ou ...

  8. BZOJ1828[USACO 2010 Mar Gold 2.Barn Allocation]——贪心+线段树

    题目描述 输入 第1行:两个用空格隔开的整数:N和M * 第2行到N+1行:第i+1行表示一个整数C_i * 第N+2到N+M+1行: 第i+N+1行表示2个整数 A_i和B_i 输出 * 第一行: ...

  9. BZOJ 5249: [2018多省省队联测]IIIDX(贪心 + 线段树)

    题意 这一天,\(\mathrm{Konano}\) 接到了一个任务,他需要给正在制作中的游戏 \(\mathrm{<IIIDX>}\) 安排曲目 的解锁顺序.游戏内共有\(n\) 首曲目 ...

随机推荐

  1. 沿路径动画(Animation Along a Path)

    Silverlight 提供一个好的动画基础,但缺少一种方便的方法沿任意几何路径对象进行动画处理.在Windows Presentation Foundation中提供了动画处理类DoubleAnim ...

  2. 阿里云=>RHSA-2019:1884-中危: libssh2 安全更新

    由于项目构建时间比较长,近期安全检查发现openssh有漏洞.所以要升级openssh到7.9p1版本.由于ssh用于远程连接,所以要谨慎操作. 建议生成环境要先做测试,之后再在生产环境升级. 1 前 ...

  3. 使用cublas 矩阵库函数实现矩阵相乘

    2014-08-10 cublas中执行矩阵乘法运算的函数 首先要注意的是cublas使用的是以列为主的存储方式,和c/c++中的以行为主的方式是不一样的.处理方法可参考下面的注释代码 // SOME ...

  4. 主流RPC框架详解,以及与SOA、REST的区别

    什么是RPC RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. 简言之,RPC使 ...

  5. python初始化定长列表

    >>> lst = ['x' for n in range(5)] >>> print(lst) ['x', 'x', 'x', 'x', 'x'] >> ...

  6. 9.SpringMVC注解式开发-处理器的请求映射规则的定义

    1.对请求URI的命名空间的定义 @RequestMapping的value属性用于定义所匹配请求的URI.但对于注解在方法上和注解在类上, 其value 属性 所指定的URI,意义是不同的 一个@C ...

  7. 12.JDBC

    /*使用JDBC处理大数据*/ 在实际开发中,程序需要把大文本或二进制数据保存到数据库中 大数据LOB(Large Objects),LOB又分为clob和blob clob用来存储大文本 blob用 ...

  8. JavaSpring【二、IOC】

    概述: 接口及面向接口编程 接口:用于沟通的中介物的抽象,实体把自己提供给外界的方法的抽象化说明,将声明和实现分离,使其能够改变内部而不影响与外部的交互方式 面向接口编程:在结构设计中,分清层次及调用 ...

  9. 浅谈String、StringBuffer与StringBuilder

    浅谈String.StringBuffer与StringBuilder   先详细介绍一下String.StringBuffer与StringBuilder String: 官方对String的说明: ...

  10. nodejs建站+github page 建站问题总结

    本文介绍 昨天吃晚饭的时候,在B站偶然看到一个关于搭建自己博客的视频,过程讲的很详细,于是就有了自己想尝试一下的冲动,所以,在晚上的时候,尝试了下,但是,过程并没有视频中说的那么顺利,看了网上很多帖子 ...