BZOJ3307: 雨天的尾巴

3307: 雨天的尾巴

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 130  Solved: 65
[Submit][Status]

Description

N个点,形成一个树状结构。有M次发放,每次选择两个点x,y
对于x到y的路径上(含x,y)每个点发一袋Z类型的物品。完成
所有发放后,每个点存放最多的是哪种物品。

Input

第一行数字N,M
接下来N-1行,每行两个数字a,b,表示a与b间有一条边
再接下来M行,每行三个数字x,y,z.如题

Output


输出有N行
每i行的数字表示第i个点存放最多的物品是哪一种,如果有
多种物品的数量一样,输出编号最小的。如果某个点没有物品
则输出0

Sample Input


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

Sample Output

2
3
3
0
2


1<=N,M<=100000
1<=a,b,x,y<=N
1<=z<=10^9

HINT

Source

题目:

最近老是逗逼。。。

考虑在如果是序列上的情况,那么我们直接加是不行的,我们类似于差分,可以在x上标记一个z+1的标志,在y上标记一个z-1的标志,最后把数列从头扫一遍,用一个线段树查询最大值即可。

现在在树上,我们只要树链剖分了之后做标记,最后扫描每条重链即可。

代码:

  1 #include<cstdio>
  2 
  3 #include<cstdlib>
  4 
  5 #include<cmath>
  6 
  7 #include<cstring>
  8 
  9 #include<algorithm>
 10 
 11 #include<iostream>
 12 
 13 #include<vector>
 14 
 15 #include<map>
 16 
 17 #include<set>
 18 
 19 #include<queue>
 20 
 21 #include<string>
 22 
 23 #define inf 1000000000
 24 
 25 #define maxn 250000+5
 26 
 27 #define maxm 2500000+5
 28 
 29 #define eps 1e-10
 30 
 31 #define ll long long
 32 
 33 #define pa pair<int,int>
 34 
 35 #define for0(i,n) for(int i=0;i<=(n);i++)
 36 
 37 #define for1(i,n) for(int i=1;i<=(n);i++)
 38 
 39 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
 40 
 41 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
 42 
 43 #define mod 1000000007
 44 
 45 using namespace std;
 46 
 47 inline int read()
 48 
 49 {
 50 
 51     int x=0,f=1;char ch=getchar();
 52 
 53     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
 54 
 55     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
 56 
 57     return x*f;
 58 
 59 }
 60 int n,m,q,tot[2],head[maxn][2],top[maxn],id[maxn],son[maxn],dep[maxn],s[maxn],fa[maxn],ans[maxn];
 61 int a[maxn];
 62 struct edge{int go,next,ch;}e[maxm][2];
 63 struct seg{int l,r,mx[2];}t[4*maxn];
 64 map<int,int>mp;
 65 inline void ins(int k,int x,int y,int z)
 66 {
 67     e[++tot[k]][k]=(edge){y,head[x][k],z};head[x][k]=tot[k];
 68 }
 69 inline void insert(int k,int x,int y,int z)
 70 {
 71     ins(k,x,y,z);ins(k,y,x,z);
 72 }
 73 inline void dfs(int x)
 74 {
 75     s[x]=1;
 76     for(int i=head[x][0],y;i;i=e[i][0].next)
 77         if(!dep[y=e[i][0].go])
 78         {
 79             dep[y]=dep[x]+1;fa[y]=x;
 80             dfs(y);
 81             s[x]+=s[y];
 82             if(s[y]>s[son[x]])son[x]=y;
 83         }
 84 }
 85 inline void dfs2(int x,int chain)
 86 {
 87     id[x]=++m;top[x]=chain;
 88     if(son[x])dfs2(son[x],chain);
 89     for(int i=head[x][0];i;i=e[i][0].next)if(e[i][0].go!=son[x]&&e[i][0].go!=fa[x])dfs2(e[i][0].go,e[i][0].go);
 90 }
 91 inline void pushup(int k)
 92 {
 93     int l=k<<1,r=k<<1|1;
 94     t[k].mx[0]=-1;
 95     if(t[l].mx[0]>t[k].mx[0]||(t[l].mx[0]==t[k].mx[0]&&a[t[l].mx[1]]<a[t[k].mx[1]]))t[k].mx[0]=t[l].mx[0],t[k].mx[1]=t[l].mx[1];
 96     if(t[r].mx[0]>t[k].mx[0]||(t[r].mx[0]==t[k].mx[0]&&a[t[r].mx[1]]<a[t[k].mx[1]]))t[k].mx[0]=t[r].mx[0],t[k].mx[1]=t[r].mx[1];
 97 }
 98 inline void build(int k,int l,int r)
 99 {
100     t[k].l=l;t[k].r=r;int mid=(l+r)>>1;
101     if(l==r){t[k].mx[0]=0;t[k].mx[1]=l;return;}
102     build(k<<1,l,mid);build(k<<1|1,mid+1,r);
103 }
104 inline void add(int k,int x,int y)
105 {
106     int l=t[k].l,r=t[k].r,mid=(l+r)>>1;
107     if(l==r){t[k].mx[0]+=y;return;}
108     if(x<=mid)add(k<<1,x,y);else add(k<<1|1,x,y);
109     pushup(k);
110 }
111 inline void dfs3(int x)
112 {
113     for(int i=head[x][1];i;i=e[i][1].next)
114         if(e[i][1].ch==1)add(1,e[i][1].go,1);
115     ans[x]=t[1].mx[0]?t[1].mx[1]:0;
116     for(int i=head[x][1];i;i=e[i][1].next)
117         if(e[i][1].ch==-1)add(1,e[i][1].go,-1);
118     if(son[x])dfs3(son[x]);
119 }
120 
121 int main()
122 
123 {
124 
125     freopen("input.txt","r",stdin);
126 
127     freopen("output.txt","w",stdout);
128 
129     n=read();q=read();
130     for1(i,n-1)insert(0,read(),read(),0);
131     dep[1]=1;dfs(1);dfs2(1,1);
132     int cnt=0;
133     for1(i,q)
134     {
135         int x=read(),y=read(),z=read(),t=mp[z];
136         if(t)z=t;else mp[z]=++cnt,a[cnt]=z,z=cnt;
137         while(top[x]!=top[y])
138         {
139             if(dep[top[x]]<dep[top[y]])swap(x,y);
140             ins(1,top[x],z,1);
141             ins(1,x,z,-1);
142             x=fa[top[x]];
143         }
144         if(dep[x]>dep[y])swap(x,y);
145         ins(1,x,z,1);
146         ins(1,y,z,-1);
147     }
148     build(1,1,cnt);
149     for1(i,n)if(top[i]==i)dfs3(i);
150     for1(i,n)printf("%d\n",a[ans[i]]);
151 
152     return 0;
153 
154 }  
View Code

无解的情况WA了好久。。。结果对拍了一组数据就看出问题了。。。

posted @ 2014-12-04 12:52  ZYF-ZYF  Views(330)  Comments(0Edit  收藏  举报