清明梦超能力者黄YY

https://www.nowcoder.com/acm/contest/206/I

题目描述

黄YY是一个清明梦超能力者,同时也是一个记忆大师。他能够轻松控制自己在梦中的一切,在醒来之后还能清晰的记得梦中所有的细节,这让他的朋友们都十分羡慕。
又是一个晚上,黄YY又到了自己的梦中,并且随手造出了一棵有n个点的树,树上每个点有一个初始颜色0。为了让这棵树不那么单调,黄YY拿起了画笔在上面尽情上色。每一次上色可以用u,
v, c来描述,代表黄YY把u, v这条路径上的点都染色成了c。
正当黄YY开心的完成了m次染色,准备在早上醒来之时向朋友们炫耀。但现实中的黄YY由于过于兴奋滚到了床下,撞到了脑袋,在剧痛中醒来。由于脑部受到了严重创伤,黄YY对刚才梦境中发生的一切发生了严重的信息丢失。
但英俊潇洒的黄YY当然不希望自己的窘态被朋友们发现。为了证明自己还是那个清明梦超能力者,他希望告诉朋友们自己上色后每个节点的颜色。同时为了更进一步证明他还是个记忆大师,他希望干脆直接说出每个点在倒数第k次染色时的颜色。
当然,现在的黄YY已经成了弱智了,作为黄YY最亲密的朋友,你快来帮帮黄YY吧!

输入描述:

第一行三个整数n, m, k,代表树的点数,黄YY染色的次数,以及最后求颜色时,倒数的次数(1 ≤ n, m, k ≤ 100000)。接下来n - 1行,每行u, v代表u, v两点之间有一条边。这里保证1 ≤ u, v≤ n,且无重边与自环,是一棵标准的树。接下来m行,每一行三个数字u, v, c代表黄YY在第这次用c颜色的画笔从u涂到了v。

输出描述:

一行$n$个数字,输出每个点倒数第$k$次染色时的颜色。如果本身不足$k$次,输出0。
示例1

输入

3 3 2
1 2
2 3
1 2 1
2 3 2
1 3 3

输出

1 2 2

说明

对于点1在第一次和第三次染色的时候分别被染色为1, 3,倒数第二次的颜色就是1。对于点2在第一、二、三次染色的时候分别被染色为1, 2, 3,倒数第二次的颜色就是2。对于点3在第二次和第三次染色的时候分别被染色为2, 3,倒数第二次的颜色就是2。

因为要求倒数第k个颜色,所以可以逆着染色。

要注意的是,要用个idx数组标记线段树的某个位置是对应原来数组的哪个位置

  1 #include<iostream>
  2 #include<cstring>
  3 #include<string>
  4 #include<cmath>
  5 #include<cstdio>
  6 #include<algorithm>
  7 #include<vector>
  8 #define maxn 200005
  9 #define lson l,mid,rt<<1
 10 #define rson mid+1,r,rt<<1|1
 11 using namespace std;
 12 int tree[maxn<<3],lazy[maxn<<3];
 13 int n;
 14 int v[maxn],val[maxn],idx[maxn];
 15 int dep[maxn],fa[maxn],siz[maxn],son[maxn],id[maxn],top[maxn],cnt;
 16 vector<int>ve[maxn];
 17 int ans[maxn];
 18
 19 void push_up(int rt){
 20     tree[rt]=min(tree[rt<<1],tree[rt<<1|1]);
 21 }
 22
 23 void push_down(int rt){
 24     if(lazy[rt]){
 25         lazy[rt<<1]+=lazy[rt];
 26         lazy[rt<<1|1]+=lazy[rt];
 27         tree[rt<<1]-=lazy[rt];
 28         tree[rt<<1|1]-=lazy[rt];
 29         lazy[rt]=0;
 30     }
 31 }
 32
 33 void build(int k,int l,int r,int rt){
 34     lazy[rt]=0;
 35     tree[rt]=k;
 36     if(l==r) return;
 37     int mid=(l+r)/2;
 38     build(k,lson);
 39     build(k,rson);
 40 }
 41
 42 void query(int k,int l,int r,int rt){
 43     if(tree[rt]>0) return;
 44     if(l==r){
 45         ans[idx[l]]=k;
 46         tree[rt]=0x3f3f3f3f;
 47         return;
 48     }
 49     int mid=(l+r)/2;
 50     push_down(rt);
 51     query(k,lson);
 52     query(k,rson);
 53     push_up(rt);
 54 }
 55
 56 void add(int L,int R,int k,int l,int r,int rt){
 57     if(L<=l&&R>=r){
 58         tree[rt]--;
 59         lazy[rt]++;
 60         query(k,l,r,rt);
 61         return;
 62     }
 63     int mid=(l+r)/2;
 64     push_down(rt);
 65     if(L<=mid) add(L,R,k,lson);
 66     if(R>mid) add(L,R,k,rson);
 67     push_up(rt);
 68 }
 69
 70 void dfs1(int now,int f,int deep){
 71     dep[now]=deep;
 72     siz[now]=1;
 73     fa[now]=f;
 74     int maxson=-1;
 75     for(int i=0;i<ve[now].size();i++){
 76         if(ve[now][i]==f) continue;
 77         dfs1(ve[now][i],now,deep+1);
 78         siz[now]+=siz[ve[now][i]];
 79         if(siz[ve[now][i]]>maxson){
 80             maxson=siz[ve[now][i]];
 81             son[now]=ve[now][i];
 82         }
 83     }
 84 }
 85
 86 void dfs2(int now,int topp){
 87     id[now]=++cnt;
 88     idx[cnt]=now;///!!!重点
 89     val[cnt]=v[now];
 90     top[now]=topp;
 91     if(!son[now]) return;
 92     dfs2(son[now],topp);
 93     for(int i=0;i<ve[now].size();i++){
 94         if(ve[now][i]==son[now]||ve[now][i]==fa[now]) continue;
 95         dfs2(ve[now][i],ve[now][i]);
 96     }
 97 }
 98
 99
100 void addRange(int x,int y,int k){
101     while(top[x]!=top[y]){
102         if(dep[top[x]]<dep[top[y]]) swap(x,y);
103         add(id[top[x]],id[x],k,1,n,1);
104         x=fa[top[x]];
105     }
106     if(dep[x]>dep[y]) swap(x,y);
107     add(id[x],id[y],k,1,n,1);
108 }
109
110 struct Option{
111     int x,y,v;
112 }p[100005];
113
114 int main(){
115     std::ios::sync_with_stdio(false);
116     int m,r;
117     int k;
118     cin>>n>>m>>k;
119     int pos,z,x,y;
120     for(int i=1;i<n;i++){
121         cin>>x>>y;
122         ve[x].push_back(y);
123         ve[y].push_back(x);
124     }
125     cnt=0;
126     dfs1(1,0,1);
127     dfs2(1,1);
128     build(k,1,n,1);
129     for(int i=m;i>=1;i--){
130         cin>>p[i].x>>p[i].y>>p[i].v;
131     }
132     for(int i=1;i<=m;i++){
133         addRange(p[i].x,p[i].y,p[i].v);
134     }
135     for(int i=1;i<=n;i++){
136         cout<<ans[i];
137         if(i!=n) cout<<" ";
138     }
139     cout<<endl;
140 }

View Code

转载于:https://www.cnblogs.com/Fighting-sh/p/9859165.html

清明梦超能力者黄YY(idx数组)相关推荐

  1. 清明梦超能力者黄YY[树链剖分+扫描线,线段树合并]

    清明梦超能力者黄YY 题目连接 https://www.nowcoder.com/acm/contest/206/I 暂时有两种做法. 算法一 涉及:树链剖分,扫描线 在一个线段的情况下,我们可以把一 ...

  2. 清明梦超能力者黄YY、异或树(线段树合并)

    清明梦超能力者黄YY 这题有点像[雨天的尾巴][永无乡]的结合版本,树上差分,线段树合并,权值线段树查找第kkk大. 对于操作iii,我们可以对u−>vu->vu−>v路径上的点,i ...

  3. 牛客国庆集训派对Day6 I 清明梦超能力者黄YY

    清明梦超能力者黄YY 传送门 题目: 黄YY是一个清明梦超能力者,同时也是一个记忆大师.他能够轻松控制自己在梦中的一切,在醒来之后还能清晰的记得梦中所有的细节,这让他的朋友们都十分羡慕. 又是一个晚上 ...

  4. 牛客国庆集训派对Day6 I.清明梦超能力者黄YY(树剖)

    题目:https://www.nowcoder.com/acm/contest/206/I 正难则反. 问你倒数第k次的颜色,正着来搞不定,那就转换成"倒着来的第k次". 使用树剖 ...

  5. 《梦醒黄金城》主创暨明星见面会举办 预计2019年完成拍摄

    2019独角兽企业重金招聘Python工程师标准>>> [中国公益在线深圳讯 记者张强报道]近日,深圳市华本影视主要出品,深圳市海承文化.慕白影业共同打造的院线电影<梦醒黄金城 ...

  6. 一个清明梦引发的一系列关于时间、人生、生命的简单思考

    注:文章内容可能因本人学识或能力有限,如有发现不足可文末留言. 今早梦见在大学里,校长讲了学校里的一块牌匾的寓意及作用.牌匾的上的具体内容记不清了.这个梦让我意识到时间过得很快,有些东西需要留下. 白 ...

  7. 牛客国庆集训派对Day6

    牛客国庆集训派对Day6 以下是我个人题解,出题人题解附带在最后 A.Birthday 费用流裸题,只要注意到1+3+5+...+2k−1=k21+3+5+...+2k-1 = k^21+3+5+.. ...

  8. 秦皇岛集训,ACM比赛第一场

    游记 来到秦皇岛这个城市,带给我的东西真的很美好,不仅仅拘留于海滩边无尽的渤海,更给我带来新鲜感的是,这里教的东西.今天上午是开营仪式,主要介绍了安全事项,并且针对"如何学算法", ...

  9. 小爬虫sitemap网站seo优化(黄梦岚)

    其实关于SEO优化网络有什么多种的方法,可以通过自己提交链接给百度让网络蜘蛛爬到,也可以使用我这种方法.下面给大家介绍一下小爬虫sitemap网站的seo优化,在这里申明我喜欢的人是黄梦岚(湖南永州东 ...

最新文章

  1. SQL 中循环、for循环、游标
  2. 在线作图丨绘制一个含饼图的组内网络分析图(Network Analysis)
  3. react-native 单位换算(px,pt,dp,ppi)
  4. 【Python】[02]初识Python
  5. 单片机片外程序存储器数据存储器操作命令
  6. MyBatis学习总结(3)——优化MyBatis配置文件中的配置
  7. cad文字插件_超好用的4个CAD应用程序,让你提升工作幸福感,裂墙推荐
  8. 乔布斯斯坦福大学演讲pdf_演讲能力训练方法amp;优秀的演讲视频
  9. 清华大学王行言教授DELPHI程序设计在线学习
  10. 关于以太坊的nonce值
  11. 大数据统计分析架构-netty部分
  12. 区块链开发之智能合约设计模式
  13. 李宏毅机器学习01机器学习介绍
  14. [好消息]大连.NET俱乐部QQ群开放注册~~~注册有好礼!
  15. java火星坐标与真实坐标的转换
  16. GSL(C数学运算库)安装和使用教程
  17. Schrodinger分子动力模拟软件与UltraLAB建模工作站配置探讨
  18. 基于springboot+redis+bootstrap+mysql开发一套属于自己的分布式springcloud云权限架构(七)【权限架构生产者(数据字典)】
  19. 无源域适应(SFDA)方向的领域探究和论文复现(第一部分)
  20. 一个屌丝程序员的青春(一七二)

热门文章

  1. 恩智浦RTCESL库和C标准库三角函数性能对比
  2. 【NodeJS笔记】三分钟快速入门NodeJS
  3. ubuntu 引导修复
  4. 【C/C++】(改错题)计算自然数的立方和,直到大于等于1 000 000为止。(正确的运行结果应为m=44)
  5. 超高频RFID电子标签与超高频手持机在固定资产管理领域的应用与解决方案
  6. WPF ComBox绑定数据
  7. 【java】vertx从入门到放弃——入门(四)Codec
  8. GISer - 船舶AIS轨迹信息内容
  9. juicerjs模板的使用
  10. Python为什么要使用虚拟环境-Python虚拟环境的安装和配置-virtualenv