迫真小游戏

已经提交 已经通过 时间限制:2000ms 内存限制:256MB

73.98%

提交人数:196

通过人数:145

题目描述

H君喜欢在阳台晒太阳,闲暇之余他会玩一些塔防小游戏。

H君玩的小游戏可以抽象成一棵 nn 个节点的有根树,树以 11 为根,每个点的深度定义为其到根的简单路径上的点数(根的深度为 11)。

H君有 nn 个干员,H君会按照某种顺序把她们部署到树的每一个节点上,使得每个节点上恰好有一个干员。由于游戏的机制,他们对每个节点 ii 都给出了个限制参数 a_ia

i



,要求H君在第 ii 个节点部署干员之前,所有深度 > a_i>a

i



的节点上不能有干员。同时游戏为了让玩家过关,保证了 a_ia

i



大于等于点 ii 的深度。

H君将每一次部署干员的节点按顺序写在纸上,形成了一个 1 \dots n1…n 的排列,H君为了获得更多的奖励,想要最小化这个排列的字典序。

我们认为排列 c_1,c_2..c_nc

1



,c

2



..c

n



的字典序比排列 d_1,d_2..d_nd

1



,d

2



..d

n



的字典序小,当且仅当 c, dc,d 不完全相同且存在一个下标 ii,满足 c_i < d_ic

i



<d

i



且对于所有 1 \le j < i1≤j<i 的 jj 都有 c_j = d_jc

j



=d

j



输入描述

第一行一个数 nn 。

接下来 n - 1n−1 行,每行两个数 x, yx,y 表示树上的一条边 。

最后一行 nn 个数,表示 a_ia

i



数据范围:

1\le n \le 5 \times 10^5, 1 \le a_i \le n1≤n≤5×10

5

,1≤a

i



≤n。

输出描述

第一行 nn 个数,表示字典序最小的排列。

样例输入 1

5

1 5

5 3

1 4

4 2

1 3 3 3 2

样例输出 1

1 4 5 2 3

样例输入 2

10

1 7

7 8

7 2

8 9

7 6

2 4

9 5

8 10

6 3

5 3 4 4 5 3 5 3 5 4

样例输出 2

1 2 6 7 8 3 4 9 10 5

题意:



思路:

首先dfs把整颗树跑一遍,得出每一个节点在第几层的信息,然后我们从1到n层扫一遍,对于每一层,我们把这一层上的所以节点操作,如果这个节点的a[i] 值是等于i的,那么这个节点在这一次操作中必须要部署,所以加入到一个大根堆中,否则加入到一个set中,同时用一个vector维护set中每一个a[i] 值加入了那些节点, 然后我们再从vector中查找是否有当前第i层的节点被介入到了set中,如果有就把它取出加入大根堆 ,然后把set的第一个元素(id最小的)与大根堆的堆顶(id最大的元素)比较,如果小于,就把它从set中取出,加入到堆中,一直这样操作,直到大于堆顶或者set为空,这样就可以使其字典序最小。

细节见代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <queue>
  7. #include <stack>
  8. #include <map>
  9. #include <set>
  10. #include <vector>
  11. #include <iomanip>
  12. #define ALL(x) (x).begin(), (x).end()
  13. #define rt return
  14. #define sz(a) int(a.size())
  15. #define all(a) a.begin(), a.end()
  16. #define rep(i,x,n) for(int i=x;i<n;i++)
  17. #define repd(i,x,n) for(int i=x;i<=n;i++)
  18. #define pii pair<int,int>
  19. #define pll pair<long long ,long long>
  20. #define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
  21. #define MS0(X) memset((X), 0, sizeof((X)))
  22. #define MSC0(X) memset((X), '\0', sizeof((X)))
  23. #define pb push_back
  24. #define mp make_pair
  25. #define fi first
  26. #define se second
  27. #define eps 1e-6
  28. #define gg(x) getInt(&x)
  29. #define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
  30. using namespace std;
  31. typedef long long ll;
  32. ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
  33. ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
  34. ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
  35. inline void getInt(int* p);
  36. const int maxn=6e5;
  37. const int inf=0x3f3f3f3f;
  38. /*** TEMPLATE CODE * * STARTS HERE ***/
  39. std::vector<int> son[maxn];
  40. int n;
  41. int a[maxn];
  42. int depth[maxn];
  43. void dfs(int x,int pre)
  44. {
  45. depth[x]=depth[pre]+1;
  46. for(auto y:son[x])
  47. {
  48. if(y!=pre)
  49. {
  50. dfs(y,x);
  51. }
  52. }
  53. }
  54. bool vis[maxn];
  55. std::vector<int> ans;
  56. struct node
  57. {
  58. int ai;
  59. int id;
  60. node(){}
  61. node(int ii,int aai)
  62. {
  63. id=ii;
  64. ai=aai;
  65. }
  66. friend bool operator < (node x,node y)
  67. {
  68. //set套结构体要重载<运算符
  69. return x.id < y.id;
  70. }
  71. };
  72. struct cmp
  73. {
  74. bool operator ()(const node p1,const node p2)
  75. {
  76. return p1.id>p2.id;// 以first为比较对象的小根堆
  77. }
  78. };
  79. struct cmp2
  80. {
  81. bool operator ()(const node p1,const node p2)
  82. {
  83. return p1.id<p2.id;// 以first为比较对象的小根堆
  84. }
  85. };
  86. std::vector<node> ceng[maxn];
  87. set<node> xgd;
  88. priority_queue<node,vector<node>,cmp2 > dgd;
  89. std::vector<int> jia[maxn];
  90. int main()
  91. {
  92. //freopen("D:\\code\\text\\input.txt","r",stdin);
  93. //freopen("D:\\code\\text\\output.txt","w",stdout);
  94. gbtb;
  95. cin>>n;
  96. int u,v;
  97. repd(i,2,n)
  98. {
  99. cin>>u>>v;
  100. son[v].pb(u);
  101. son[u].pb(v);
  102. }
  103. repd(i,1,n)
  104. {
  105. cin>>a[i];
  106. vis[a[i]]=1;
  107. }
  108. depth[0]=0;
  109. dfs(1,0);
  110. repd(i,1,n)
  111. {
  112. ceng[depth[i]].pb(node(i,a[i]));
  113. }
  114. repd(i,1,n)
  115. {
  116. for(auto x:ceng[i])
  117. {
  118. if(x.ai==i)
  119. {
  120. dgd.push(x);
  121. }else
  122. {
  123. xgd.insert(x);
  124. jia[x.ai].pb(x.id);
  125. }
  126. }
  127. for(auto x:jia[i])
  128. {
  129. if(xgd.count(node(x,a[i]))==1)
  130. {
  131. xgd.erase(node(x,a[x]));
  132. dgd.push(node(x,a[x]));
  133. }
  134. }
  135. while((xgd.size()>0)&&(!dgd.empty())&&((*xgd.begin()).id<dgd.top().id))
  136. {
  137. dgd.push(*xgd.begin());
  138. xgd.erase(xgd.begin());
  139. }
  140. std::vector<int> v;
  141. v.clear();
  142. while(!dgd.empty())
  143. {
  144. v.push_back(dgd.top().id);
  145. dgd.pop();
  146. }
  147. reverse(ALL(v));
  148. for(auto y:v)
  149. ans.push_back(y);
  150. }
  151. while(!xgd.empty())
  152. {
  153. ans.pb((*xgd.begin()).id);
  154. xgd.erase(xgd.begin());
  155. }
  156. for(int i=0;i<ans.size();i++)
  157. {
  158. if(i!=0)
  159. {
  160. cout<<" "<<ans[i];
  161. }else{
  162. cout<<ans[i];
  163. }
  164. }
  165. cout<<endl;
  166. return 0;
  167. }
  168. inline void getInt(int* p) {
  169. char ch;
  170. do {
  171. ch = getchar();
  172. } while (ch == ' ' || ch == '\n');
  173. if (ch == '-') {
  174. *p = -(getchar() - '0');
  175. while ((ch = getchar()) >= '0' && ch <= '9') {
  176. *p = *p * 10 - ch + '0';
  177. }
  178. }
  179. else {
  180. *p = ch - '0';
  181. while ((ch = getchar()) >= '0' && ch <= '9') {
  182. *p = *p * 10 + ch - '0';
  183. }
  184. }
  185. }

Comet OJ - Contest #5 D 迫真小游戏 (堆+set)的更多相关文章

  1. Comet OJ - Contest #5 E 迫真大游戏

    怎么说,看了推到之后真的不难,事实上确实也蛮友好(可能咱就是想不出多项式题目的做法???),除了用到了分治法法塔就比较毒瘤 花了一个晚上以及一个上午做这么一道题...(还是太菜了) Result1 分 ...

  2. Comet OJ - Contest #5 简要题解

    好久没更博了,还是象征性地更一次. 依然延续了简要题解的风格. 题目链接 https://cometoj.com/contest/46 题解 A. 迫真字符串 记 \(s_i\) 表示数字 \(i\) ...

  3. Comet OJ - Contest #2简要题解

    Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...

  4. Comet OJ - Contest #11 题解&赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  5. Comet OJ - Contest #5

    Comet OJ - Contest #5 总有一天,我会拿掉给\(dyj\)的小裙子的. A 显然 \(ans = min(cnt_1/3,cnt_4/2,cnt5)\) B 我们可以感性理解一下, ...

  6. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

  7. Comet OJ - Contest #4--前缀和

    原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...

  8. Comet OJ - Contest #8

    Comet OJ - Contest #8 传送门 A.杀手皇后 签到. Code #include <bits/stdc++.h> using namespace std; typede ...

  9. Comet OJ - Contest #13-C2

    Comet OJ - Contest #13-C2 C2-佛御石之钵 -不碎的意志-」(困难版) 又是一道并查集.最近做过的并查集的题貌似蛮多的. 思路 首先考虑,每次处理矩形只考虑从0变成1的点.这 ...

随机推荐

  1. JSP 不能解析EL表达式的解决办法

    原文地址:http://www.jb51.net/article/30791.htm 原因是:在默认情况下,Servlet 2.4 / JSP 2.0支持 EL 表达式. 解决的办法有两种: 1.修改 ...

  2. Windows下启动.Net Core程序脚本

    @echo offstart cmd /k "cd /D %~dp0&&dotnet xxx.dll" cmd /k 是执行完dir命令后不关闭命令窗口 cd /d ...

  3. 【转】UNITY中相机空间,投影空间的正向问题

    原文链接1:https://www.cnblogs.com/wantnon/p/4570188.html 原文链接2:https://www.cnblogs.com/hefee/p/3820610.h ...

  4. 用Vue来实现音乐播放器(四十):歌单详情页布局以及Vuex实现路由数据通讯

    1.歌单详情页是推荐页面的二级路由页面 将推荐页面歌单的数据传到歌曲详情页面  利用vuex 1.首先在state下定义一个歌单对象 disc{} 2.在mutaions-types中  定义一个别名 ...

  5. 图解http协议学习笔记

    一 ,基本概念 1互联网相关的各协议族为tcp/ip协议(网际协议),tcp/ip  ftp,DNS(通过域名解析ip地址),http(超文本传输协议) 还有很多协议 ,只是列举比较熟悉的 2tcp/ ...

  6. idea中配置tomcat详细

    1:首先要添加一个tomcat流程 2:配置tomcat: 3:配置tomcat中的deployment(就是配置你需要部署的工程) 4:配置tomcat中需要输出的日志logs 5:启动 tomca ...

  7. numpy2

    1.通用函数,是一种在ndarray数据中进行逐元素操作的函数.某些函数接受一个或多个标量数值,并产生一个或多个标量结果,通用函数就是对这些函数的封装. 1.常用的一元通用函数有:abs\fabs s ...

  8. ActiveMQ学习教程/2.简单示例

    ActiveMQ学习教程(二)——简单示例 一.应用IDEA构建Maven项目 File->New->Module...->Maven->勾选->选择->Next ...

  9. docker之配置TensorFlow的运行环境

    Docker是一种 操作系统层面的虚拟化技术,类似于传统的虚拟机.传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程:而容器内的应用进程直接运行于宿主的内核,容 ...

  10. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/cli2/Option

    今天,在做canopy算法实例时,遇到这个问题,所以记录下来.下面是源码: package czx.com.mahout; import java.io.IOException; import org ...