[HDU5764] After a Sleepless Night [2016 Multi-University Training Contest 4(2016多校联合训练4) B]
来源:互联网 发布:cf淘宝刷枪是真的吗 编辑:程序博客网 时间:2024/04/28 11:49
比赛rank15,第一次这么靠前诶
题意
一棵节点数为
给出这棵新树的描述,问是否可以还原为原树?输出原图节点
题解
考虑原图变为新图后新图的性质。
- 权值
n 一定出现在新图中 - 新图中每种权值必然连成一条链
- 新图中从根开始向下遍历遇到的权值一定是非严格递减的
于是这三条性质成为我们判断
读入数据后先判定是否存在权值
找到权值
下面从根开始
遍历到一个节点
如果
如果
遍历
如果
跳出
从
如果当前权值已经被确定位置,即为某一条权值链的最下端,则取出这条权值链中其它节点的位置,存到一个大根堆中。注意这些位置对之后枚举的权值都是可行的位置,因为是从大到小枚举的权值。
如果当前权值未被确定位置,则从大根堆中取出堆顶,将此权值放入取出的位置上。这个地方是贪心使得字典序最小,若当前权值不使用这个最大的位置,通过交换当前权值和这个位置上的权值可以得到更优解。
如果当前权值未被确定位置,而堆空了,则
代码
// team646// by ztx// 2016-07-28 Multi University 1002#include <cstdio>#define Rep(i,l,r) for(i=(l);i<=(r);i++)#define rep(i,l,r) for(i=(l);i< (r);i++)#define Rev(i,r,l) for(i=(r);i>=(l);i--)#define rev(i,r,l) for(i=(r);i> (l);i--)typedef long long ll ;typedef double lf ;int CH , NEG ;template <typename TP>inline void read(TP& ret) { ret = NEG = 0 ; while (CH=getchar() , CH<'!') ; if (CH == '-') NEG = true , CH = getchar() ; while (ret = ret*10+CH-'0' , CH=getchar() , CH>'!') ; if (NEG) ret = -ret ;}template <typename TP>inline void readc(TP& ret) { while (ret=getchar() , ret<'!') ; while (CH=getchar() , CH>'!') ;}template <typename TP>inline void reads(TP *ret) { ret[0]=0;while (CH=getchar() , CH<'!') ; while (ret[++ret[0]]=CH,CH=getchar(),CH>'!') ; ret[ret[0]+1]=0;}#include <algorithm>#include <queue>#define maxn 100010LL#define to(p) e[0][p]#define nxt(p) e[1][p]int e[2][maxn<<1],star[maxn],tote;inline void AddEdge(int u,int v) { tote++;to(tote)=v;nxt(tote)=star[u];star[u]=tote;}std::priority_queue<int>heap;int n;int col[maxn], point[maxn], val[maxn];int chain[maxn], fa[maxn];bool ok;inline void dfs(int u) { if (fa[u] && col[u] == col[fa[u]]) { chain[fa[u]] ++ ; if (chain[fa[u]] > 1) { ok = false ; return ; } } if (fa[u] && col[u] > col[fa[u]]) { ok = false ; return ; } for (int p=star[u];p;p=nxt(p)) if (to(p)!=fa[u]) { fa[to(p)] = u; dfs(to(p)) ; if (!ok) return ; } if (!chain[u]) { point[col[u]] = u; val[u] = col[u]; }}inline void work() {int i, j, u, v, root1, root2; read(n); tote = 0; Rep (i,1,n) point[i] = fa[i] = chain[i] = star[i] = 0; Rep (i,1,n) read(col[i]), point[col[i]] = i ; rep (i,1,n) { read(u) ,read(v) ; AddEdge(u,v), AddEdge(v,u) ; } if (!point[n]) { puts(" Impossible") ; return ; } i = point[n] ; j = 0 ; while (true) { for (int p=star[i];p;p=nxt(p)) if (to(p)!=j && col[to(p)]==n) {j=i,i=to(p); goto continue1;} break ; continue1:; } root1 = i; j = 0; while (true) { for (int p=star[i];p;p=nxt(p)) if (to(p)!=j && col[to(p)]==n) {j=i,i=to(p);goto continue2;} break; continue2:; } root2 = i; if (root1 > root2) root1^=root2,root2^=root1,root1^=root2; ok = true ; dfs(root1) ; if (!ok) { puts(" Impossible") ; return ; } while (!heap.empty()) heap.pop(); Rev (i,n,1) if (point[i]) { j = fa[point[i]]; while (j && col[j]==i) heap.push(j), j=fa[j]; } else { if (heap.empty()) { puts(" Impossible") ; return ; } j = heap.top(), heap.pop(); val[j] = i; } Rep (i,1,n) printf(" %d",val[i]); puts("");}int main() {int T, kiss;// #define READ #ifdef READ freopen(".in" ,"r",stdin ) ; freopen(".out","w",stdout) ; #endif read(T) ; Rep (kiss,1,T) { printf("Case #%d:",kiss); work() ; } #ifdef READ fclose(stdin) ; fclose(stdout) ; #else getchar() ; getchar() ; #endif return 0 ;}
- [HDU5764] After a Sleepless Night [2016 Multi-University Training Contest 4(2016多校联合训练4) B]
- [HDU5756] Boss Bo [2016 Multi-University Training Contest 3(2016多校联合训练3) E]
- [HDU5727] Necklace [2016 Multi-University Training Contest 1(2016多校联合训练1) E]
- [HDU5741] Helter Skelter [2016 Multi-University Training Contest 2(2016多校联合训练2) H]
- [HDU5788] Level Up [2016 Multi-University Training Contest 5 1008 (2016多校联合训练5)]
- [HDU5826] physics [2016 Multi-University Training Contest 8(2016多校联合训练8) 1006]
- [HDU5739] Fantasia [2016 Multi-University Training Contest 2(多校联合训练2) F]
- 2016 多校4 1002 After a Sleepless Night 树上贪心
- [HDU5799] This world need more Zhu [2016 Multi-University Training Contest 6(2016多校联合训练2) 1007]
- [HDU5828] Rikka with Sequence [2016 Multi-University Training Contest 8(2016多校联合训练8) 1008]
- 2016 Multi-University Training Contest 4
- 2016 Multi-University Training Contest 4
- 2016 Multi-University Training Contest 4 题解
- hdu 5764 After a Sleepless Night(2016多校第四场1002) 线段树
- HDU 5327 Olympiad (2015 Multi-University Training Contest 4 2015多校联合)
- HDU 5328 Problem Killer (2015 Multi-University Training Contest 4 2015多校联合)
- 2015多校联合训练赛 hdu 5308 I Wanna Become A 24-Point Master 2015 Multi-University Training Contest 2 构造题
- [ 2015多校联合训练赛 hdu 5308 I Wanna Become A 24-Point Master 2015 Multi-University Training Contest 2 模拟题
- 进程虚拟内存
- Bringing up interface Auto_eth3: Error: Connection activation failed: Device not managed by Network
- struts.xml配置文件的各个 标签/属性 解析(转)
- 线程特定数据
- 使用GAMS的gdxxrw命令读写Excel时Cdim和Rdim的意义及设置
- [HDU5764] After a Sleepless Night [2016 Multi-University Training Contest 4(2016多校联合训练4) B]
- Android进程间通信(IPC)机制Binder简要介绍和学习计划
- pptpd vpn服务器搭建记录
- 最新基于高德地图的android进阶开发(5)地图的基本操作、事件监听、用户UI、图层选择等
- Day 1 复习Linux指令,利用for循环打印菱形
- 使用CXF框架,发布webservice服务,并使用客户端远程访问webservice
- ServletJsp之登录界面
- SQL Server
- [16-7-28]每日总结