Description

Pulumi生活在P城的角落,而他的朋友们gjdy,oyski,tutuwai等等生活在P城的靠中心位置。
P城很大,但它拥有优秀的城市结构,同时P城重视文化教育的发展,P城共有n个学校,校与校之间共建立了n-1条交通线路,且两所学校之间存在唯一的连通路径。
P城常常举行各种类型的评比活动,为了节约资金,最终将给某一条路径上的所有学校颁发证书。为了便于描述我们记一次评比活动的结果为(ui,vi,zi)表示路径(ui,vi)上的所有学校获得一个类型为zi的证书。
一个学校若为Zmax类型的学校,则表示它在Zmax类型下的证书数量最多(如果有相同数量的类型,取类型标号最小一个)。
Pulumi收集了本年度所有的评比活动结果,共m次。他很感兴趣所有学校的类型,以了解他朋友们学校的状况,现在他忙于出题,把这个任务交给了你。

Input

第一行,两个整数n,m,如题中所述。
下接n-1行,每行两个整数u,v,表示标号u和v的学校之间有一条直接相连的路。
下接m行,每行三个整数u,v,z,表示一次结果为(u,v,z)的评比活动。

Output

共n行,第i行,一个整数zi,表示标号为i的学校类型为zi。

Sample Input

5 3
1 2
3 1
3 4
5 3
2 3 3
1 5 2
3 3 3

Sample Output

2
3
3
0
2

Data Constraint

对于30%的数据1<=N<=1000,1<=M<=1000
另外在30%的数据满足i-1与i之间有一条直接相连的路
对于100%的数据1<=N<=100000,0<=M<=100000,1<=zi<=10^9

Solution

  • 看到这题,区间操作操作又在树上,那么就想到树链剖分+线段树。

  • 在每条链链头打一个加标记,在链尾的后一位打一个减标记。

  • 这样得到的DFS序上就有了很多标记,我们直接在序列上查找、修改即可。

  • 每到一个点,就进行在这个点上的操作,之后查询最大值的位置。

  • 注意 ziz_i 的值很大,需要进行离散化。

Code

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N=1e5+1;
struct data
{int x,y;
}f[N<<2];
int tot,num;
int first[N],next[N<<1],en[N<<1];
int fa[N],size[N],dep[N];
int son[N],tree[N],pre[N],top[N];
int h[N],id[N],p[N],ans[N],a[N],b[N],c[N];
vector<int>g[N];
inline int read()
{int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;
}
inline void write(int x)
{if(x>9) write(x/10);putchar(x%10+'0');
}
inline void insert(int x,int y)
{next[++tot]=first[x];first[x]=tot;en[tot]=y;
}
inline void dfs1(int x)
{dep[x]=dep[fa[x]]+1,size[x]=1;for(int i=first[x];i;i=next[i])if(en[i]^fa[x]){fa[en[i]]=x;dfs1(en[i]);size[x]+=size[en[i]];if(!son[x] || size[en[i]]>size[son[x]]) son[x]=en[i];}
}
inline void dfs2(int x,int y)
{top[pre[tree[x]=++num]=x]=y;if(!son[x]) return;dfs2(son[x],y);for(int i=first[x];i;i=next[i])if(en[i]^fa[x] && en[i]^son[x]) dfs2(en[i],en[i]);
}
inline data merge(data x,data y)
{return x.x>=y.x?x:y;
}
inline void change(int v,int l,int r,int x,int y)
{if(l==r){if(f[v].x+=y) f[v].y=x; else f[v].y=0;return;}int mid=(l+r)>>1;if(x<=mid) change(v<<1,l,mid,x,y); else change(v<<1|1,mid+1,r,x,y);f[v]=merge(f[v<<1],f[v<<1|1]);
}
inline data find(int v,int l,int r,int x,int y)
{if(l>=x && r<=y) return f[v];int mid=(l+r)>>1;if(y<=mid) return find(v<<1,l,mid,x,y);if(x>mid) return find(v<<1|1,mid+1,r,x,y);return merge(find(v<<1,l,mid,x,mid),find(v<<1,mid+1,r,mid+1,y));
}
int main()
{int n=read(),m=read();for(int i=1;i<n;i++){int x=read(),y=read();insert(x,y);insert(y,x);}dfs1(1),dfs2(1,1);for(int i=1;i<=m;i++){a[i]=read(),b[i]=read(),c[i]=read();h[++h[0]]=c[i];}sort(h+1,h+1+h[0]);id[1]=tot=1,p[1]=h[1];for(int i=2;i<=h[0];i++)if(h[i]^h[i-1]) p[id[i]=++tot]=h[i]; else id[i]=id[i-1];for(int i=1;i<=m;i++){int x=a[i],y=b[i],z=c[i];int k=lower_bound(h+1,h+1+h[0],z)-h;z=id[k];int f1=top[x],f2=top[y];while(f1^f2){if(dep[f1]<dep[f2]) swap(f1,f2),swap(x,y);g[tree[f1]].push_back(z);g[tree[x]+1].push_back(-z);x=fa[f1],f1=top[x];}if(dep[x]>dep[y]) swap(x,y);g[tree[x]].push_back(z);g[tree[y]+1].push_back(-z);}for(int i=1;i<=num;i++){for(int j=0;j<g[i].size();j++){int x=abs(g[i][j]),y=g[i][j]>0?1:-1;change(1,1,tot,x,y);}data t=find(1,1,tot,1,tot);ans[pre[i]]=p[t.y];}for(int i=1;i<=n;i++) write(ans[i]),putchar('\n');return 0;
}

JZOJ 5463. 【NOIP2017提高A组冲刺11.8】证书相关推荐

  1. JZOJ 5441. 【NOIP2017提高A组冲刺11.1】序列

    Description 给定一个1~n的排列x,每次你可以将x1~xi翻转.你需要求出将序列变为升序的最小操作次数.有多组数据. Input 第一行一个整数t表示数据组数. 每组数据第一行一个整数n, ...

  2. JZOJ 5458. 【NOIP2017提高A组冲刺11.7】质数

    Description 小X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感.小X 认为,质数是一切自然数起源的地方. 在小X 的认知里,质数是除了本身和1 以外,没有其他因数的数 ...

  3. JZOJ 5455. 【NOIP2017提高A组冲刺11.6】拆网线

    Description 企鹅国的网吧们之间由网线互相连接,形成一棵树的结构.现在由于冬天到了,供暖部门缺少燃料,于是他们决定去拆一些网线来做燃料.但是现在有K只企鹅要上网和别人联机游戏,所以他们需要把 ...

  4. JZOJ 5445. 【NOIP2017提高A组冲刺11.2】失格

    Description 胆小鬼连幸福都会害怕,碰到棉花都会受伤,有时还被幸福所伤. --太宰治<人间失格> 回顾我的一生,一共有n个事件,每一个事件有一个幸福值p_i. 我想用n-1条线把 ...

  5. JZOJ 5466. 【NOIP2017提高A组冲刺11.9】玩游戏

    Description 小A得了忧郁综合症,小B正在想办法开导她. 机智的小B决定陪着小A玩游戏,他从魔法的世界里变出一张无向联通图,每条边上都有边权.小B定义一条路径的权值为所有经过边中的最大权值, ...

  6. JZOJ 5462. 【NOIP2017提高A组冲刺11.8】好文章

    Description nodgd写了一篇文章,自认为这是一篇好文章.nodgd的文章由n个小写英文字母组成.文章的一个子串指的是文章中的一段连续的字母,子串的长度就是这一段的字母个数.nodgd在文 ...

  7. JZOJ 5460. 【NOIP2017提高A组冲刺11.7】士兵训练

    Description Input 第一行两个数n,q 表示士兵数以及阅兵次数. 接下来一行n-1 个整数,第i 个整数表示士兵i+1 的直属教官. 接下来n 行每行两个整数i i b ,l 描述一位 ...

  8. JZOJ 5459. 【NOIP2017提高A组冲刺11.7】密室

    Description 小X 正困在一个密室里,他希望尽快逃出密室. 密室中有N 个房间,初始时,小X 在1 号房间,而出口在N 号房间. 密室的每一个房间中可能有着一些钥匙和一些传送门,一个传送门会 ...

  9. JZOJ 5454. 【NOIP2017提高A组冲刺11.5】仔细的检查

    Description nodgd家里种了一棵树,有一天nodgd比较无聊,就把这棵树画在了一张纸上.另一天nodgd更无聊,就又画了一张. 这时nodgd发现,两次画的顺序是不一样的,这就导致了原本 ...

最新文章

  1. 中小型研发团队架构实践:高效率、低风险,一键发布并测试的持续集成工具Jenkins...
  2. [转载]Guice 1.0 用户指南
  3. mysql tags_mysql tags table解决方法
  4. python数据结构练习
  5. 面向对象的三大特性————继承,多态
  6. python 廖雪峰数据分析统计服_廖雪峰python教程阅读量统计
  7. Magento模块开发之数据库SQL操作方法说明
  8. android 时间
  9. 2月21 深度优先与广度优先
  10. android root su sticky bit
  11. 科罗拉多州立大学计算机科学专业,科罗拉多州立大学有哪些专业_专业排名(QS世界排名)...
  12. tp5 url使用php参数,URL访问 · ThinkPHP5.0完全开发手册 · 看云
  13. STM32解析SBUS信号例程详解
  14. 华为----园区网络三层架构实验
  15. 65位高校教师接龙晒工资,全国各地高校,给打算入高校的博士们参考!
  16. 第3课:中移物联网蜂窝通信模组OpenCPU探秘
  17. UE4无法创建C++类
  18. 机器学习—分类算法的对比实验
  19. web项目修改favicon.ico图标
  20. 安装SQl Server Polybase 报错解决方法

热门文章

  1. cuda二维数组内存分配和数据拷贝
  2. CPU寻址范围(寻址空间)一系列问题
  3. 《Linux与unix Shell编程指南》 总结
  4. 你一定要知道的关于Linux文件目录操作的12个常用命令
  5. 牛客网题目——不用四则运算符号,计算两个数字的和
  6. matlab工作区保留或者清除部分变量
  7. 科大星云诗社动态20210329
  8. Coursera吴恩达《神经网络与深度学习》课程笔记(3)-- 神经网络基础之Python与向量化
  9. 台湾大学林轩田机器学习技法课程学习笔记13 -- Deep Learning
  10. 常用:javascript字符串函数 收藏