jzoj5463【NOIP2017提高A组冲刺11.8】证书

本文介绍了NOIP2017提高A组的一道题目,涉及P城的学校和证书颁发。题目要求找出每个学校在所有评比活动中获得最多证书的类型。解决方案利用线段树合并,通过更新路径上的节点来统计证书数量。文中提供了输入输出示例,并提到虽然可以使用线段树合并,但实际解题过程中直接合并即可。
摘要由CSDN通过智能技术生成

题目

Time Limits: 3000 ms Memory Limits: 524288 KB

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

题解

如果用线段树合并的话是一道十分裸的题目,只要在两个儿子+1,lca及其父亲-1即可
主要是没有打过线段树合并
其实直接强行合并就好了,不需要启发式

贴代码

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fo1(i,b,a) for(i=b;i>=a;i--)
using namespace std;

const int maxn=1e5+5;

struct P{
    int x,y,z;
}a[maxn];
int tree[maxn*30][5];
int fi[maxn],ne[maxn*2],dui[maxn*2],qc[maxn],ans[maxn];
int fi1[maxn],ne1[maxn*8],dui1[maxn*4],dui2[maxn*8],qc1[maxn];
int de[maxn],f[maxn][20],root[maxn];
int d[maxn];
int i,j,k,l,m,n,x,y,z,now,la,now1,p,o;

void add(int x,int y){
    if (fi[x]==0) fi[x</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值