Train Wreck 模拟-建树-优先队列
题意 :
- 类似于堆栈的火车站。给出长为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 模拟-建树-优先队列相关推荐
- 【牛客2021暑假多校10】Train Wreck(出栈顺序,建树,优先队列维护)
F Train Wreck 题意: 给出长为2n的括号序列,()分别表示放入站台和拿出,以及n辆火车的颜色. 求构造一个放入序列,满足不存在同一时刻站台内的颜色序列相同 思路: 将栈操作视为树,要求转 ...
- 2021牛客多校10 - Train Wreck(贪心)
题目链接:点击查看 题目大意:给出一个合法的括号序列,再给出 nnn 个数字,括号序列对应着入栈和出栈,问是否存在一个合法的顺序,使得 nnn 个数字按照括号序列操作后,每次入栈后,栈中的序列都是不同 ...
- 1090 Highest Price in Supply Chain (25 分)(模拟建树,找树的深度)牛客网过,pat没过...
A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...
- CodeForces - 1248E Queue in the Train(大模拟)
题目链接:点击查看 题目大意:火车上有n个乘客,编号分别为1~n,编号为i的人会在第ti分钟去打水,水箱每次只能给一个乘客使用,每位乘客都会使用水箱p分钟,当一位乘客想要去打水时,他会先看编号在他前面 ...
- 【HNOI2003】【BZOJ1216】操作系统(模拟,优先队列)
problem 模拟操作系统的进程调度 给定每一个进程的进程号,到达时间,执行时间和运行优先级.(已经按到达时间从小到大排序) 如果一个进程到达的时候CPU是空闲的,则它会一直占用CPU直到该进程结束 ...
- 洛谷P2058 海港(模拟,优先队列)
[题目描述] 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况:对于第i艘到达 ...
- 2021牛客暑期多校训练营10,签到题FH
题号 标题 已通过代码 通过率 团队的状态 A Browser Games 点击查看 93/1498 未通过 B Child's play 点击查看 0/8 未通过 C Dance Party 点击查 ...
- c++实现哈夫曼huffman压缩文本
哈夫曼压缩原理就是构建二叉树,出现频率高的字母用更少的位数来表示,实现压缩的效果 比如字符串abcbbc 构建哈夫曼树 这样构建出编码表b->0,a->10, c->11 原本6个 ...
- WaWa的奇妙冒险(第四周集训自闭现场)
第四周周记(退火大法好,玄学保平安) (一)wlacm例题记录 A-FBI树 (水题,位运算) Input Output Sample Input Sample Output 理解 AC代码 B-查找 ...
最新文章
- 社交平台舆情分析项目的总结和感想(LU学习,EM,KNN)(二)
- 博客园 CSS 代码定制
- 基于虹软人脸识别,实现RTMP直播推流追踪视频中所有人脸信息(C#)
- hdu1024Max Sum Plus Plus
- Ubuntu下安装Gerrit
- Spring Boot基础学习笔记06:Spring Boot整合MyBatis
- 如何在一个bat批处理文件中调用另一个bat批处理文件?
- mysql 删除后缀表_mysql批量删除指定前缀或后缀表
- 【光通信-2】多模单模区别/多模光纤颜色区分/光纤跳线头区分
- 立Flag 学习Ng - 1
- Pr 音频效果参考:混响
- octobercms mysql_在Ubuntu 18.04/Debian 9上安装October CMS
- 全球与中国药用玻璃容器市场深度研究分析报告
- opencv imwrite()保存图片崩溃
- 人工智能轨道交通行业周刊-第43期(2023.4.24-5.7)
- Ae 入门系列之八:抠像
- iOS仿微信录像和拍照(swift5.0)
- PXE启动配置及原理
- 苹果第一台计算机的诞生的,纪念Mac诞生30周年:第一台Mac电脑深度拆解
- (附源码)springboot图书管理系统 毕业设计 160934