题意 :

  • 类似于堆栈的火车站。给出长为2n2n2n的括号序列,()分别代表放入火车站和推出火车站,又给了n辆火车的颜色。
  • 求构造一个关于颜色的放入序列,满足不存在同一放入火车的时刻在火车站内颜色的序列相同。

思路 :

  • 将栈操作看作树,要求转化为给每一个节点染色,使得从根到每一个节点的链所构成的颜色序列两两不同。注意到两个都在第i层的节点,如果它们父亲不同,则从根到它们父亲的链所构成的颜色序列不同,这使得根到它们所构成的颜色序列也一定不同。
  • 因此,问题转化为,每个点的k个儿子颜色互不相同,对于一个节点,假设有k个儿子,我们选取剩余火车数最多的k个颜色对应上去即可(使用优先队列实现)。

如下图,

会发现在第一行和第二行的条件(颜色不同)满足后,第三行的条件(大于一个数的颜色不同)自然会满足,因此想到树的性质,即让父节点的每个儿子颜色互不相同。

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#define endl '\n'
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define lowbit(x) (x&-x)
using namespace std;
const double pi = acos(-1);
typedef long long ll;
typedef pair<int, int> PII;
typedef pair<long, long> PLL;const int N = 1e6 + 10;vector<int> G[N];
int pa[N], tot = 0;
int a[N];       // 颜色i的数量
int ans[N];     // 火车序列为i的火车颜色int main()
{IOS;int n;string s;cin >> n >> s;// 建树int p = 0;for (auto ch : s)if (ch == '('){G[p].push_back( ++ tot);pa[tot] = p;p = tot;}elsep = pa[p];for (int i = 1; i <= n; i ++ ){int x;cin >> x;a[x] ++ ;}// 默认是大顶堆priority_queue<PII> pq;     // 对应颜色的个数,每种颜色for (int i = 1; i <= n; i ++ )pq.push({a[i], i});// 枚举每个点for (int i = 0; i <= tot; i ++ ){vector<PII> ve;     // 备份// 节点i的每个儿子for (int j = 0; j < G[i].size(); j ++ ){auto p = pq.top(); pq.pop();if (p.first == 0){cout << "NO" << endl;return 0;}ans[G[i][j]] = p.second;p.first -- ;ve.push_back(p);}for (auto p : ve)pq.push(p);}cout << "YES" << endl;for (int i = 1; i <= n; i ++ ) cout << ans[i] << " ";cout << endl;return 0;
}

Train Wreck 模拟-建树-优先队列相关推荐

  1. 【牛客2021暑假多校10】Train Wreck(出栈顺序,建树,优先队列维护)

    F Train Wreck 题意: 给出长为2n的括号序列,()分别表示放入站台和拿出,以及n辆火车的颜色. 求构造一个放入序列,满足不存在同一时刻站台内的颜色序列相同 思路: 将栈操作视为树,要求转 ...

  2. 2021牛客多校10 - Train Wreck(贪心)

    题目链接:点击查看 题目大意:给出一个合法的括号序列,再给出 nnn 个数字,括号序列对应着入栈和出栈,问是否存在一个合法的顺序,使得 nnn 个数字按照括号序列操作后,每次入栈后,栈中的序列都是不同 ...

  3. 1090 Highest Price in Supply Chain (25 分)(模拟建树,找树的深度)牛客网过,pat没过...

    A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...

  4. CodeForces - 1248E Queue in the Train(大模拟)

    题目链接:点击查看 题目大意:火车上有n个乘客,编号分别为1~n,编号为i的人会在第ti分钟去打水,水箱每次只能给一个乘客使用,每位乘客都会使用水箱p分钟,当一位乘客想要去打水时,他会先看编号在他前面 ...

  5. 【HNOI2003】【BZOJ1216】操作系统(模拟,优先队列)

    problem 模拟操作系统的进程调度 给定每一个进程的进程号,到达时间,执行时间和运行优先级.(已经按到达时间从小到大排序) 如果一个进程到达的时候CPU是空闲的,则它会一直占用CPU直到该进程结束 ...

  6. 洛谷P2058 海港(模拟,优先队列)

    [题目描述] 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况:对于第i艘到达 ...

  7. 2021牛客暑期多校训练营10,签到题FH

    题号 标题 已通过代码 通过率 团队的状态 A Browser Games 点击查看 93/1498 未通过 B Child's play 点击查看 0/8 未通过 C Dance Party 点击查 ...

  8. c++实现哈夫曼huffman压缩文本

    哈夫曼压缩原理就是构建二叉树,出现频率高的字母用更少的位数来表示,实现压缩的效果 比如字符串abcbbc 构建哈夫曼树 这样构建出编码表b->0,a->10,  c->11 原本6个 ...

  9. WaWa的奇妙冒险(第四周集训自闭现场)

    第四周周记(退火大法好,玄学保平安) (一)wlacm例题记录 A-FBI树 (水题,位运算) Input Output Sample Input Sample Output 理解 AC代码 B-查找 ...

最新文章

  1. 社交平台舆情分析项目的总结和感想(LU学习,EM,KNN)(二)
  2. 博客园 CSS 代码定制
  3. 基于虹软人脸识别,实现RTMP直播推流追踪视频中所有人脸信息(C#)
  4. hdu1024Max Sum Plus Plus
  5. Ubuntu下安装Gerrit
  6. Spring Boot基础学习笔记06:Spring Boot整合MyBatis
  7. 如何在一个bat批处理文件中调用另一个bat批处理文件?
  8. mysql 删除后缀表_mysql批量删除指定前缀或后缀表
  9. 【光通信-2】多模单模区别/多模光纤颜色区分/光纤跳线头区分
  10. 立Flag 学习Ng - 1
  11. Pr 音频效果参考:混响
  12. octobercms mysql_在Ubuntu 18.04/Debian 9上安装October CMS
  13. 全球与中国药用玻璃容器市场深度研究分析报告
  14. opencv imwrite()保存图片崩溃
  15. 人工智能轨道交通行业周刊-第43期(2023.4.24-5.7)
  16. Ae 入门系列之八:抠像
  17. iOS仿微信录像和拍照(swift5.0)
  18. PXE启动配置及原理
  19. 苹果第一台计算机的诞生的,纪念Mac诞生30周年:第一台Mac电脑深度拆解
  20. (附源码)springboot图书管理系统 毕业设计 160934

热门文章

  1. 生产订单形成的差异如何传递到COPA
  2. ATO,MTO和ETO
  3. “埃尼阿克”背后的6个女孩
  4. SAP 打开SAP物料帐期和财务账期
  5. BSEG和BSIS、BSAS、BSID、BSAD、BSIK、BSAK六个表的关系
  6. 在SAP中进行黏贴时必须要把之前的数据删掉后才能黏贴,不能直接使用黏贴来覆盖之前的数据,这个怎麼解?
  7. 生成转储拣配单的ABAP程序
  8. Search Help技术
  9. 最新猪肉价格走势分析,2021又会是一个吃不起猪肉的春节吗?
  10. 后疫情时代,乳企如何迎来下一个风口?