贪心~

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int a[maxn];
int b[maxn];
int vis[maxn];
set<int>s;
set<int>::iterator it;
vector<int>va[maxn],vb[maxn];
vector<int>v1,v2;
int main()
{
int T;
scanf ("%d",&T);
while (T--) {
int n;
bool flag=true;
scanf ("%d",&n);
for (int i=;i<=n;i++) {
scanf("%d",&a[i]);
vis[a[i]]++;
if(vis[a[i]]>n/) flag=false;
s.insert(a[i]);
}
if(flag) {
for(int i=;i<=n;i++) {
it=s.begin();
if(*it==a[i]&&s.size()==) {
for(int j=i+;j<=n;j++)
if(a[j]!=a[i]) {
b[j]=a[i];
vis[a[i]]--;
}
for(int j=i;j<=n;j++)
if(a[j]==a[i]&&b[j]==) v1.push_back(j);
for(int j=i-;j>=;j--) {
if(vis[a[i]]==) break;
if(a[j]!=a[i]&&b[j]!=a[i]) {
v2.push_back(b[j]);
b[j]=a[i];
vis[a[i]]--;
}
}
s.erase((*it));
sort(v1.begin(),v1.end());
sort(v2.begin(),v2.end());
for(int i=;i<v1.size();i++) b[v1[i]]=v2[i];
v1.clear();v2.clear();
break;
}
else {
if(*it==a[i])
it++;
b[i]=(*it);
vis[*it]--;
if(vis[*it]==)
s.erase(*it);
}
}
for(int i=;i<=n;i++) va[a[i]].push_back(i),vb[a[i]].push_back(b[i]);
for(int i=;i<=n;i++) {
sort(va[a[i]].begin(),va[a[i]].end());
sort(vb[a[i]].begin(),vb[a[i]].end());
for(int j=;j<va[a[i]].size();j++)
b[va[a[i]][j]]=vb[a[i]][j];
va[a[i]].clear();
vb[a[i]].clear();
}
for(int i=;i<=n;i++) printf(i==n?"%d\n":"%d ",b[i]);
}
else printf("Impossible\n");
for(int i=;i<=n;i++) vis[i]=,b[i]=;
s.clear();
}
return ;
}

ZOJ4102 Array in the Pocket(2019浙江省赛)的更多相关文章

  1. ZOJ4110 Strings in the Pocket(2019浙江省赛)

    给出两个字符串,询问有多少种反转方法可以使字符串1变成字符串2. 如果两个串相同,就用马拉车算法找回文串的数量~ 如果两个串不同,从前往后找第一个不同的位置l,从后往前找第二个不同的位置r,反转l和r ...

  2. ZOJ4104 Sequence in the Pocket(2019浙江省赛)

    思维~ #include<bits/stdc++.h> using namespace std; ; int a[maxn]; int b[maxn]; int N; int main ( ...

  3. 2019浙江省赛 Strings in the Pocket【manacher】

    Strings in the Pocket 题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意 给你两个字符 ...

  4. 2019浙江省赛K zoj4110 Strings in the Pocket(manachar)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意 给你两个串,可以翻转a串的一个区间,问有多少对l,r使得翻转后的a ...

  5. 2019浙江省赛B zoj4101 Element Swapping(推公式)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6003 题意 \(数组a通过交换一对数字,得到了b数组,给出x=\sum^n_{ ...

  6. ZOJ4109 Welcome Party(2019浙江省赛)

    并查集算连通块的数量,集合的个数就是必然不开心的人数,再跑bfs,用优先队列维护~ #include<bits/stdc++.h> using namespace std; ; vecto ...

  7. ZOJ4103 Traveler(2019浙江省赛)

    构造+思维~ #include<bits/stdc++.h> using namespace std; ; int N,M,T; int visit[maxn]; stack<int ...

  8. hdu6578 2019湖南省赛D题Modulo Nine 经典dp

    目录 题目 解析 AC_Code @ 题目 第一题题意是一共有{0,1,2,3}四种数字供选择,问有多少个长度为n的序列满足所有m个条件,每个条件是说区间[L,R]内必须有恰好x个不同的数字. 第二题 ...

  9. 浙江省赛C.Array in the Pocket(贪心+线段树)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4102 题意: 给出一个长度为n的数组,重排它们,让相同位置的数 ...

随机推荐

  1. 概率dp 期望 逆推

    题目大意: 从起点0点开始到达点n,通过每次掷色子前进,可扔出1,2,3,4,5,6这6种情况,扔到几前进几,当然对应飞行通道可以通过x直达一点y,x<y,计算到达n点或超过n 点要扔色子的次数 ...

  2. 跨平台C++ IDE

    参考博客:https://blog.csdn.net/m0_37314675/article/details/77881287

  3. vue 获得当前无素并做相应处理

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. 数据提取之JSON与JsonPATH

    数据提取之JSON与JsonPATH JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.适 ...

  5. PHP基础学习笔记2

    一.数组 1.1 数值数组 1)自动分配 ID 键 ) ); ?> 即二维数组: 100 100 96 20 60 59 40 110 100 上面创建的二维数组自动分配ID键:下面以指定键的方 ...

  6. app内区域截图利用html2Canvals保存到手机 截屏 (html2Canvals2版本1.0.0)

    html2canvas($(], {scale:,logging:false,useCORS:true}).then(function(canvas) { var dataUrl = canvas.t ...

  7. Java面向对象编程 -5.2

    静态代码块 静态代码块主要指的是使用static关键字定义的代码块 静态块的定义需要考虑到两种情况: 主类中定义静态块 非主类中定义静态块 静态块执行主要是给static属性进行初始化的 此时可以发现 ...

  8. dp(完全背包)

    有 NN 种物品和一个容量是 VV 的背包,每种物品都有无限件可用. 第 ii 种物品的体积是 vivi,价值是 wiwi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大. ...

  9. Vue组件介绍及开发

    一. 通过axios实现数据请求 1.json json是 JavaScript Object Notation 的首字母缩写,单词的意思是javascript对象表示法,这里说的json指的是类似于 ...

  10. Python爬虫学习教程:天猫商品数据爬虫

    天猫商品数据爬虫使用教程 下载chrome浏览器 查看chrome浏览器的版本号,下载对应版本号的chromedriver驱动 pip安装下列包 pip install selenium pip in ...