贪心~

#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. Linux /dev/sda1磁盘满了,清理办法

    转:https://blog.csdn.net/h_8410435/article/details/86303995 查看内存使用情况 df -lh Filesystem      Size  Use ...

  2. STA之RC网

    STA的主要工作是计算电路网络的延时,如今的电路网络还是由CMOS cell和net组成的,所以STA所要计算的延时仍是电容的充放电时间.等量子计算机普及的时候,如今的这一套理论都将随着科技的进步被丢 ...

  3. XFire客户端调用CXF服务端(四)

    前面章节:http://www.cnblogs.com/xiehongwei/p/8082337.html 已经开发出了CXF服务端,现在用XFire开发客户端调用CXF服务端,代码如下: impor ...

  4. C++子类虚函数表指针

    最近看剑指offer,记录一下 #include <iostream> #include <string> #include <cctype> #include&l ...

  5. [C++]蛇形填数

    [从左下角开始,逆时针蛇形填数] #include <iostream> using namespace std; int main() { int n; cin>>n; in ...

  6. 如何让DOS命令在新窗口打开

    可以调用别外的批处理如 start a.batstart b.batstart c.bat 新建a.bat.B.BAT.C.CAT,在这几个批处理中输入你的命令. 以上我自己测试通过.

  7. Git储藏工作现场

    假设你现在在dev分支工作,此时你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,你当前工作只进行到一半,还没法提交,预计完成还需1天时间 ...

  8. java使用bitmap求两个数组的交集

    一般来说int代表一个数字,但是如果利用每一个位 ,则可以表示32个数字 ,在数据量极大的情况下可以显著的减轻内存的负担.我们就以int为例构造一个bitmap,并使用其来解决一个简单的问题:求两个数 ...

  9. redis-py相关

    一 redis客户端命令 cmd进入redis客户端管理程序路径xx:\windows redis\redis-2.4.0-win32-win64\64bit 执行:redis-cli.exe -h ...

  10. mcast_get_loop函数

    #include <errno.h> #include <net/if.h> #include <sys/socket.h> #include <netine ...