2021牛客暑期多校训练营#10:F-Train Wreck

原题链接:https://ac.nowcoder.com/acm/contest/11261/F

文章目录

  • 2021牛客暑期多校训练营#10:F-Train Wreck
    • 题目大意
    • 解题思路
    • 代码实现

题目大意

有一个旧火车站,其只有死胡同轨道,可以视为一个栈,可将火车入栈或者出栈。
有n(1≤n≤106)n(1\leq n\leq 10^6)n(1≤n≤106)辆彩色火车进站,第iii辆火车的颜色是ki(1≤ki≤n)k_i(1\leq k_i\leq n)ki​(1≤ki​≤n),进出栈顺序已定,现在你需要为每次入栈操作分配一辆火车,使得入栈时栈中其他火车颜色序列唯一。

解题思路

设入栈编号为1、2、3、4、5、61、2、3、4、5、61、2、3、4、5、6。


将它构造成一棵树

祖先节点合法时,当兄弟节点不相同,构造的序列肯定也是合法的所以只需要构造兄弟节点不相同的树。

还可以用向量存储出入时的序列,代替树。
我们不需要知道每个节点的父亲是谁,只要知道它们的兄弟是谁,当存入一个第iii层的节点,就将第i+1i+1i+1层的节点删去,就保证现在第iii层存储的是自己的兄弟,可以用向量存储。关于保证目前第iii层都是自己的兄弟,因为当自己的父亲被存储,以前存储的非此父节点的子节点都被清除,可得。

用优先队列存储每种颜色的编号和剩余数量,按数量从大到小排序,避免剩下的都是同一种颜色的情况,保证答案最优。

代码实现

#include<bits/stdc++.h>
#define pb push_back
#define pa pair<int,int>
using namespace std;
const int N=1e6+7;
vector<int>ve[N];
priority_queue<pa>qu;
int n,a[N],ans[N];
char c[N<<1];
void rd(int &x){int res=0;char c=getchar(),last=' ';while(c>'9'||c<'0')last=c,c=getchar();while(c<='9'&&c>='0')res=res*10-'0'+c,c=getchar();x=last=='-'?-res:res;}
void calc(vector<int> a)
{vector<pa>v;for(auto x:a){if(qu.empty()){puts("NO");exit(0);}//为空,表示无颜色可填,输出NOauto u=qu.top();qu.pop();ans[x]=u.second;//记录答案v.pb({u.first-1,u.second});//数量-1,一起存进队列}for(auto i:v)qu.push(i);
}
int main()
{rd(n);scanf("%s",c+1);for(int i=1;i<=n;i++){int x;rd(x),a[x]++;};for(int i=1;i<=n;i++)if(a[i]>0)qu.push({a[i],i});//优先队列存储编号与数量int top=0,cnt=0;for(int i=1;i<=2*n;i++){if(c[i]=='(')ve[top++].pb(++cnt),ve[top].clear();//向量存储第top层的儿子elsecalc(ve[top--]);}calc(ve[top]);puts("YES");for(int i=1;i<=n;i++)printf("%d%c",ans[i],i==n?'\n':' ');
}

2021牛客暑期多校训练营#10:F-Train Wreck相关推荐

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

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

  2. 2021牛客暑期多校训练营2 F Girlfriend (阿波罗尼斯圆+简单几何)

    F Girlfriend (阿波罗尼斯球+简单几何) 题目大意: 给定四个点,每两个点构成一个阿波罗尼斯球,求两圆相交部分的体积. 思路: 一看就是几何题啊,话不多说直接开淦... 首先对于阿波罗尼斯 ...

  3. 2021牛客暑期多校训练营2 - F - Girlfriend ( 球体积相交 )

    题目连接:点击进入 题目 题意 A.B.C.D.k1.k2 已知,根据不等式, P1 的取值会形成一个图形,P2 类似,求两个图形的交 思路 这个式子取等号是阿波罗尼斯圆,二维平面是圆,三维是球壳,取 ...

  4. 2021牛客暑期多校训练营7

    2021牛客暑期多校训练营7 文章目录 2021牛客暑期多校训练营7 F:xay_loves_trees 解释 代码 H:xay_loves_count 解释 代码 I:xay_loves_or 解释 ...

  5. 2021牛客暑期多校训练营

    2021牛客暑期多校训练营1 A- Alice and Bob /* 博弈问题 两堆石头,每人每次从其中一堆拿k(k>0)个, 同时从另一堆拿s*k个(s>=0),不能进行操作的即失败 * ...

  6. 2021牛客暑期多校训练营2,签到题CDFKI

    2021牛客暑期多校训练营2 题号 标题 已通过代码 通过率 团队的状态 A Arithmetic Progression 点击查看 6/72 未通过 B Cannon 点击查看 34/104 未通过 ...

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

    2021牛客暑期多校训练营1 题号 标题 已通过代码 通过率 团队的状态 A Alice and Bob 点击查看 1365/5586 通过(博弈论-打表) B Ball Dropping 点击查看 ...

  8. 【训练题66:状压暴力 | 子集dp】Greater Integer, Better LCM | 2021牛客暑期多校训练营5

    题意 Greater Integer, Better LCM | 2021牛客暑期多校训练营5 给你 a,b,ca,b,ca,b,c ,你需要找到一对 x,yx,yx,y ,满足: lcm(a+x,b ...

  9. 2021牛客暑期多校训练营1 赛后总结

    比赛名称: 2021牛客暑期多校训练营1 比赛时间: 2021年7月17日 12:00 - 17:00 比赛结果: 3/11 自我总结: 这场比赛应该算是这个假期的第二场团队赛了, 之前打过一个比较简 ...

  10. 2021牛客暑期多校训练营9 Cells(LGV引理,FFT)

    2021牛客暑期多校训练营9 Cells(LGV引理,FFT) 题目链接 题意 在一个无限大的xyxyxy​坐标轴上,求从A={(0,a1),(0,a2),...,(0,an)}A=\{(0,a_1) ...

最新文章

  1. 自学Zabbix3.0版本以上资产清单inventory
  2. 详细解读java IO
  3. 关抢占 自旋锁_关于Redis分布式锁这一篇应该是讲的最好的了,先收藏起来再看!...
  4. 2015年 六·一 儿童节——我
  5. LeetCode —— 深搜水题记录
  6. torch的DataLoader 浅析
  7. win10pe命令打开计算机,Win10是怎么进入安全模式
  8. NXP:I2C总线技术规范和用户手册(中文版)(一)
  9. 红米手机计算机软件,详解红米手机连接电脑方法
  10. Java时间系列(JDK8)--Duration的使用
  11. linux中脚本都是.sh吗,Linux跑脚本用sh和./有什么区别?
  12. 2018ICPC焦作站网络赛 Transport Ship 多重背包
  13. 机器学习——多元线性回归问题(2)含标签
  14. 旋转目标检测复现-yolov5-obb
  15. HTML语言中Em单位,HTML5中单位em的理解
  16. 大数据 数据治理 | 微信交流群~
  17. 如何分析上市公司利润表?
  18. 0x8007007E 错误解决方法
  19. 路由器密码忘记 五步暴力破解
  20. transformer论文解读_一文读懂transformer(CV专享)

热门文章

  1. 网页源代码保护(禁止右键、复制、另存为、查看源文件)
  2. codeMirror 光标定位问题
  3. c语言更正错误,c语言出错invalid operands to binary %
  4. 2022蓝桥杯java
  5. 如何获取QQ邮箱授权码
  6. 华为事件对我们个人成功的启示:为什么自强自立不是出路?
  7. win7计算机管理员权限才能删除,手把手教你解决win7系统删除C盘文件需要管理员权限的图文办法...
  8. 安卓 java hook 免root_[原创]利用VirtualApp实现免Root注入Hook(一)
  9. 8.0系统手机无需Root激活XPOSED框架经验
  10. 小程序页面跳转的几种方式