2021牛客多校10 F-Train Wreck(思维,贪心,堆)
赛场上有点思路,但是没码出来...
题目链接
题意
有一个类似栈的车道,给定一个合法的括号序列,'('代表火车进站,')'代表出站,每个火车都有一种颜色,现在让选择合适的顺序,使得每次火车进站后,车道上的颜色序列各不相同。
思路
观察一个样例()((())())(()),我们可以将每次火车进站后火车的数量记录一下,即(1)(1232)(12),可以发现数量为1的火车颜色不能相同,同样数量为2的火车颜色不能相同;但第二个括号中的2却可以与第三括号中的2颜色相同。
这好像是树的遍历,我们抽象一个0结点,编号1的点为0的儿子,依次向下,发现只要对于每一个结点,其儿子的颜色各不相同即可,即判断当前不同颜色的数量是否大于等于结点儿子的数量,每个结点染何种颜色无所谓,贪心的每次取数量最多的颜色即可。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;int tong[1000010];
priority_queue<pair<int,int> > q; //因为堆中要存每种颜色的数量及其编号,所以用了pair
int ans[1000010],fa[1000010];
vector<int> vv[1000010]; //记录每个结点的儿子
pair<int,int> p[1000010]; //用于染色时临时存储pair bool dfs(int now){int siz=vv[now].size();//将堆中的siz中颜色弹出,暂存到p中 for(int i=0;i<siz;i++){if(q.empty()) return false;p[i]=q.top(); q.pop();}//对每个儿子结点染色,颜色数量减一,操作之后若还有剩余放回堆中 for(int i=0;i<siz;i++){ans[vv[now][i]]=p[i].second;p[i].first--;if(p[i].first) q.push(p[i]);}//遍历儿子结点 for(int i=0;i<siz;i++) dfs(vv[now][i]);return true;
}int main()
{ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int n,x;string s;cin>>n>>s;for(int i=1;i<=n;i++){cin>>x;tong[x]++;} for(int i=1;i<=1000000;i++) if(tong[i]) q.push({tong[i],i});int now=0,cnt=0;for(int i=0;i<s.size();i++){//建树,结点的标号无所谓,从1开始存即可 if(s[i]=='('){vv[now].push_back(++cnt); fa[cnt]=now; now=cnt;}else now=fa[now]; }bool f=dfs(0);if(f){cout<<"YES\n";for(int i=1;i<=n;i++) cout<<ans[i]<<" ";}else cout<<"NO\n";return 0;
}
2021牛客多校10 F-Train Wreck(思维,贪心,堆)相关推荐
- 2021牛客多校10 - Train Wreck(贪心)
题目链接:点击查看 题目大意:给出一个合法的括号序列,再给出 nnn 个数字,括号序列对应着入栈和出栈,问是否存在一个合法的顺序,使得 nnn 个数字按照括号序列操作后,每次入栈后,栈中的序列都是不同 ...
- 2021牛客多校10 - Browser Games(哈希)
题目链接:点击查看 题目大意:给出 nnn 个字符串,对于每个 iii ,输出最少需要用多少个前缀,可以表示第 1∼i1\sim i1∼i 个字符串而不能表示第 i+1∼ni+1\sim ni+1∼n ...
- 2021牛客多校7 F. xay loves trees(主席树+DFS序)
题意:有两颗n个点的树,找出最大子集,满足如下条件: 该点集在树1上为一条连续的链 该点集在树2上,两两无任何祖先关系 思路: 对于条件2: 点u如果是点v的祖先,那么u的子树一定包含v,即一定包 ...
- 2021牛客多校3 - Black and white(思维+最小生成树)
题目链接:点击查看 题目大意:给出一个 n∗mn*mn∗m 的矩阵,初始时都是白色,可以花费掉 cost[i][j]cost[i][j]cost[i][j] 将格子 (i,j)(i,j)(i,j) 染 ...
- 【2021牛客多校2】F-Girlfriend 计算几何
2021牛客多校2-F F-Girlfriend 题目大意 给出四个点 A , B , C , D A, B, C, D A,B,C,D 另有两点 P 1 , P 2 P_1, P_2 P1,P2 ...
- LCS(2021牛客多校4)
LCS(2021牛客多校4) 题意: 让你构造三个字符串s1,s2,s3,长度均为n,要求LCS(s1,s2)=a,LCS(s2,s3)=b,LCS(s1,s3)=c 题解: 先考虑三个串互相LCS为 ...
- 【牛客2021暑假多校10】Train Wreck(出栈顺序,建树,优先队列维护)
F Train Wreck 题意: 给出长为2n的括号序列,()分别表示放入站台和拿出,以及n辆火车的颜色. 求构造一个放入序列,满足不存在同一时刻站台内的颜色序列相同 思路: 将栈操作视为树,要求转 ...
- K-Stack 2021牛客多校2
链接:https://ac.nowcoder.com/acm/contest/11253/K 来源:牛客网 题目描述 ZYT had a magic permutation a1,a2,⋯ ,an a ...
- 2021牛客多校第八场补题 D-OR
链接:https://ac.nowcoder.com/acm/contest/11259/D 来源:牛客网 题目描述 There are two sequences of length n−1n-1n ...
- 2021牛客多校第五场补题
B-Boxes 链接:https://ac.nowcoder.com/acm/contest/11256/B 来源:牛客网 题目描述 There're nn_{}n boxes in front o ...
最新文章
- python百度云资源-Python开发视频百度云分享
- MySQL(2)数据库管理
- neatdm路径_扫地机还能这么玩 延时摄影看路径规划
- Swift中的Sequence基本的使用
- lua本学习笔记功能
- 元胞计算机系统,元胞自动机
- Birt报表安装及制作
- SQLite.dll混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。...
- js获取baseurl
- 科学计算机角度值改为弧度制,弧度制换算(角度换算弧度计算器)
- 腾讯信鸽推送基本流程和数据的处理流程
- 如何把几张照片拼在一起?
- vs,vs code,Dev
- 可行方向法的matlab代码,基于MATLAB的可行方向法求极值问题参考.doc
- pycharm更改整体背景颜色(黑-白)
- spss基本总结——因子分析
- CSS(七) css列表样式(ul)
- linux的基本命令(新手上路,多多关照)
- android自动化获取toast,成都汇智动力小强哥系列-Appium中Android自动化怎么获取浮层的toast...
- 最新软件库PHP程序源码+支持CDKey卡密充值