赛场上有点思路,但是没码出来...


题目链接

题意

有一个类似栈的车道,给定一个合法的括号序列,'('代表火车进站,')'代表出站,每个火车都有一种颜色,现在让选择合适的顺序,使得每次火车进站后,车道上的颜色序列各不相同。

思路

观察一个样例()((())())(()),我们可以将每次火车进站后火车的数量记录一下,即(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(思维,贪心,堆)相关推荐

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

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

  2. 2021牛客多校10 - Browser Games(哈希)

    题目链接:点击查看 题目大意:给出 nnn 个字符串,对于每个 iii ,输出最少需要用多少个前缀,可以表示第 1∼i1\sim i1∼i 个字符串而不能表示第 i+1∼ni+1\sim ni+1∼n ...

  3. 2021牛客多校7 F. xay loves trees(主席树+DFS序)

    题意:有两颗n个点的树,找出最大子集,满足如下条件: 该点集在树1上为一条连续的链 该点集在树2上,两两无任何祖先关系 思路: 对于条件2: ​ 点u如果是点v的祖先,那么u的子树一定包含v,即一定包 ...

  4. 2021牛客多校3 - Black and white(思维+最小生成树)

    题目链接:点击查看 题目大意:给出一个 n∗mn*mn∗m 的矩阵,初始时都是白色,可以花费掉 cost[i][j]cost[i][j]cost[i][j] 将格子 (i,j)(i,j)(i,j) 染 ...

  5. 【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​ ...

  6. LCS(2021牛客多校4)

    LCS(2021牛客多校4) 题意: 让你构造三个字符串s1,s2,s3,长度均为n,要求LCS(s1,s2)=a,LCS(s2,s3)=b,LCS(s1,s3)=c 题解: 先考虑三个串互相LCS为 ...

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

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

  8. K-Stack 2021牛客多校2

    链接:https://ac.nowcoder.com/acm/contest/11253/K 来源:牛客网 题目描述 ZYT had a magic permutation a1,a2,⋯ ,an a ...

  9. 2021牛客多校第八场补题 D-OR

    链接:https://ac.nowcoder.com/acm/contest/11259/D 来源:牛客网 题目描述 There are two sequences of length n−1n-1n ...

  10. 2021牛客多校第五场补题

    B-Boxes 链接:https://ac.nowcoder.com/acm/contest/11256/B 来源:牛客网 题目描述 There're nn_{}n​ boxes in front o ...

最新文章

  1. python百度云资源-Python开发视频百度云分享
  2. MySQL(2)数据库管理
  3. neatdm路径_扫地机还能这么玩 延时摄影看路径规划
  4. Swift中的Sequence基本的使用
  5. lua本学习笔记功能
  6. 元胞计算机系统,元胞自动机
  7. Birt报表安装及制作
  8. SQLite.dll混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。...
  9. js获取baseurl
  10. 科学计算机角度值改为弧度制,弧度制换算(角度换算弧度计算器)
  11. 腾讯信鸽推送基本流程和数据的处理流程
  12. 如何把几张照片拼在一起?
  13. vs,vs code,Dev
  14. 可行方向法的matlab代码,基于MATLAB的可行方向法求极值问题参考.doc
  15. pycharm更改整体背景颜色(黑-白)
  16. spss基本总结——因子分析
  17. CSS(七) css列表样式(ul)
  18. linux的基本命令(新手上路,多多关照)
  19. android自动化获取toast,成都汇智动力小强哥系列-Appium中Android自动化怎么获取浮层的toast...
  20. 最新软件库PHP程序源码+支持CDKey卡密充值

热门文章

  1. 实名寻人搜索引擎app_谷歌搜索引擎寻人
  2. 路飞项目整体路程(六)
  3. 数字舵机与模拟舵机_控制方法与性能比较
  4. Dependency Walker使用说明
  5. vin码识别(车架号识别)的工具
  6. java 抛体运动6_抛体运动的公式
  7. 用MinIO对象存储构建企业数据集中备份系统
  8. 实用:Google Chrome(谷歌浏览器)键盘快捷键大全
  9. Android 键盘快捷键
  10. java 共享类,Java 技术,IBM 风格: 类共享