题意:1~n这n个数,给你一个初始的顺序,再告诉你那两个数的大小关系发生了变化,求变化后的 顺序,不存在则输出IMPOSSIBLE

思路:这题很遗憾没在比赛的时候过掉,结束后加了一行就AC了。题目真的不难,我就是根据原顺序和变化得到任意两个数之间的大小关系。然后枚举变化后的这些数对,用构造法构造一个合法的序列,最后再和原顺序进行不重复的合并。两个数组,两个指针,合并的时候未发生变化的当前数若大于变化的当前数,则输出原数,否则输出变化后的数,并将对应数组指针后移。再对得到的新顺序进行合法判断,若大小关系和要求的完全一致,则输出答案,否则无解。

这题还有更简单的拓扑排序做法,我正在研究,稍后更新。

 #pragma comment(linker, "/STACK:1000000000")
#include <bits/stdc++.h>
#define LL long long
#define INF 0x3f3f3f3f
#define IN freopen("E.in","r",stdin);
#define OUT freopen("out.txt", "w", stdout);
using namespace std;
#define MAXN 505
#define MAXM 25005
int s[MAXM], t[MAXM];
int a[MAXN], b[MAXN], pos[MAXN], c[MAXN];
bool dayu[MAXN][MAXN], res[MAXN][MAXN], u[MAXN][MAXN];
bool vis[MAXN];
int main()
{
int T;
scanf("%d", &T);
int cas = ;
while(T--){
cas++;
int n;
scanf("%d", &n);
for(int i = ; i <= n; i++){
scanf("%d", &a[i]);
}
memset(dayu, , sizeof(dayu));
memset(vis, , sizeof(vis));
memset(b, , sizeof(b));
for(int i = ; i <= n; i++){
for(int j = i + ; j <= n; j++){
dayu[a[i]][a[j]] = true;
}
}
int m;
scanf("%d", &m);
memset(u, , sizeof(u));
for(int i = ; i <= m; i++){
scanf("%d%d", &s[i], &t[i]);
if(u[s[i]][t[i]]) continue;
u[s[i]][t[i]] = true;
dayu[s[i]][t[i]] = !dayu[s[i]][t[i]];
dayu[t[i]][s[i]] = !dayu[t[i]][s[i]];
}
int x, y;
int p = ;
bool noans = false;
for(int i = ; i <= m; i++){
if(dayu[s[i]][t[i]]){
x = t[i];
y = s[i];
}else{
x = s[i];
y = t[i];
}
if(!vis[x]){
vis[x] = true;
int j = p;
if(p == ){
b[++p] = x;
}
else{
while(j >= && dayu[x][b[j]]){
j--;
}
for(int k = p; k > j; k--){
pos[b[k]]++;
b[k + ] = b[k];
}
b[j + ] = x;
p++;
}
pos[x] = j + ;
}
if(!vis[y]){
vis[y] = true;
int j = pos[x] - ;
while(j >= && dayu[y][b[j]]){
j--;
}
for(int k = p; k > j; k--){
pos[b[k]]++;
b[k + ] = b[k];
}
p++;
b[j + ] = y;
pos[y] = j + ;
}
}
int j = ;
memset(pos, , sizeof(pos));
for(int i = ; i <= n; i++){
if(vis[a[i]]){
c[i] = b[j++];
}
else{
if(dayu[a[i]][b[j]] || j > p){
c[i] = a[i];
}
else{
c[i] = b[j++];
}
}
pos[c[i]] = i;
}
memset(res, , sizeof(res));
for(int i = ; i <= n; i++){
for(int j = i + ; j <= n; j++){
res[c[i]][c[j]] = true;
}
}
for(int i = ; i <= n; i++){
for(int j = ; j <= n; j++){
if(res[i][j] != dayu[i][j]){
noans = true;
break;
}
}
if(noans){
break;
}
}
if(noans){
printf("IMPOSSIBLE\n");
continue;
}
for(int i = ; i < n; i++){
printf("%d ", c[i]);
}
printf("%d\n", c[n]);
}
return ;
}

UVA - 12263 Rankings 模拟(拓扑排序)的更多相关文章

  1. UVA 12263 Rankings(拓扑排序)

    给出一个n个数的序列1,然后有m个改动(a, b),在序列2中a跟b在序列中的相对顺序改变.求符合题意的序列2. 题中说道如果一个数的位置不确定,则输出‘?' ,仔细想想,这种情况是不会存在的,因为在 ...

  2. UVA215-Spreadsheet Calculator(模拟+拓扑排序)

    Problem UVA215-Spreadsheet Calculator Accept:401  Submit:2013 Time Limit: 3000 mSec Problem Descript ...

  3. UVA.10305 Ordering Tasks (拓扑排序)

    UVA.10305 Ordering Tasks 题意分析 详解请移步 算法学习 拓扑排序(TopSort) 拓扑排序的裸题 基本方法是,indegree表示入度表,vector存后继节点.在tops ...

  4. UVA 1572 Self-Assembly(拓扑排序)

    1 // 把一个图的所有结点排序,使得每一条有向边(u,v)对应的u都排在v的前面. 2 // 在图论中,这个问题称为拓扑排序.(toposort) 3 // 不难发现:如果图中存在有向环,则不存在拓 ...

  5. Uva 10305 - Ordering Tasks 拓扑排序基础水题 队列和dfs实现

    今天刚学的拓扑排序,大概搞懂后发现这题是赤裸裸的水题. 于是按自己想法敲了一遍,用queue做的,也就是Kahn算法,复杂度o(V+E),调完交上去,WA了... 于是检查了一遍又交了一发,还是WA. ...

  6. UVa 1572 Self-Assembly (拓扑排序)

    题目链接: https://cn.vjudge.net/problem/UVA-1572 Automatic Chemical Manufacturing is experimenting with ...

  7. UVa 10305 - Ordering Tasks (拓扑排序裸题)

    John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...

  8. POJ——1308Is It A Tree?(模拟拓扑排序判断有向图是否为树)

    Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28399   Accepted: 9684 De ...

  9. UVA 10305 Ordering Tasks(拓扑排序的队列解法)

    题目链接: https://vjudge.net/problem/UVA-10305#author=goodlife2017 题目描述 John有n个任务,但是有些任务需要在做完另外一些任务后才能做. ...

随机推荐

  1. python 比较数字大小按从大到小输出

    主要用到的python 的知识点 1:   内置函数max 2:     列表的操作 3:   while 循环 4 :  错误处理 代码如下: #!/usr/bin/python #coding=u ...

  2. java 对象 拆箱装箱 编译和反编译的验证

    创建对象 package 创建对象的个数; public class main { public static void main(String[] agrs){ Check c1=new Check ...

  3. iOS基础UI控件介绍-Swift版

    iOS基础UI控件总结 iOS基础控件包括以下几类: 1.继承自NSObject:(暂列为控件) UIColor //颜色 UIImage //图像 2.继承自UIView: 只能相应手势UIGest ...

  4. Spring学习总结(14)——Spring10种常见异常解决方法

    在程序员生涯当中,提到最多的应该就是SSH三大框架了.作为第一大框架的Spring框架,我们经常使用. 然而在使用过程中,遇到过很多的常见异常,我在这里总结一下,大家共勉. 一.找不到配置文件的异常 ...

  5. 集团公司(嵌入ETL工具)財务报表系统解决方式

    集团公司(嵌入ETL工具)財务报表系统解决方式 一.项目背景: 某集团公司是一家拥有100多家子公司的大型集团公司,旗下子公司涉及各行各业,包含:金矿.铜矿.房产.化纤等.因为子公司在业务上的差异.子 ...

  6. duplicate报ORA-01017权限问题

    duplicate报ORA-01017权限问题   环境: OS:RedHat EnterPrise Linux 5.8 x64 Cluster:Oracle Grid 11.2.0.4 Databa ...

  7. 12、NIO、AIO、BIO一

    1.NIO概述 什么是NIO:NIO是New I/O的简称,与旧式的基于流的I/O方式相对,从名字看,他表示新的一套JAVA I/O标准.它是在java1.4中被纳入到JDK中的,并具有以下特性: - ...

  8. Windows API Hook

    原文地址:http://blog.sina.com.cn/s/blog_628821950100xmuc.html 原文对我的帮助极大,正是由于看了原文.我才学会了HOOK.鉴于原文的排版不是非常好, ...

  9. OpenCV问题集锦,图片显示不出来的问题,cvWaitKey(0),不能读图片,未经处理的异常,等问题集合

    昨天根据uc伯克利的人工图像分割文件.seg,显示图像的时候调用了OpenCV的库函数,图片都能用imwrite写好,但是imshow死活显示不出来. 今天早上发现原来是imshow()后面应该加上: ...

  10. 【DNN 系列】 模块开发 8.0.1

    1.创建第一个模块需要准备的东西有 https://github.com/dnnsoftware/DNN.Templates/releases/tag/1.0.1 VS 2015 插件 创建一个项目M ...