码迷,mamicode.com
首页 > Web开发 > 详细

数据结构(树链剖分,堆):HNOI 2016 network

时间:2016-05-07 12:50:30      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

2215. [HNOI2016]网络

★★★☆   输入文件:network_tenderRun.in   输出文件:network_tenderRun.out   简单对比
时间限制:2 s   内存限制:128 MB

【题目描述】

技术分享

技术分享

【输入格式】

技术分享

【输出格式】

技术分享

【样例输入1】

 

13 23

1 2

1 3

2 4

2 5

3 6

3 7

4 8

4 9

6 10

6 11

7 12

7 13

2 1

0 8 13 3

0 9 12 5

2 9

2 8

2 2

0 10 12 1

2 2

1 3

2 7

2 1

0 9 5 6

2 4

2 5

1 7

0 9 12 4

0 10 5 7

2 1

2 4

2 12

1 2

2 5

2 3

 

【样例输出1】

 

-1

3

5

-1

1

-1

1

1

3

6

7

7

4

6

 

【提示】

 

技术分享

技术分享

 

  这道题是水题。

  1 #include <algorithm>
  2 #include <iostream>
  3 #include <cstring>
  4 #include <cstdio>
  5 #include <queue>
  6 using namespace std;
  7 const int maxn=300010;
  8 int n,Q,cnt,fir[maxn],nxt[maxn<<1],to[maxn<<1];
  9 void addedge(int a,int b){
 10     nxt[++cnt]=fir[a];fir[a]=cnt;to[cnt]=b;
 11 }
 12 
 13 struct Data{
 14     int ID,val;
 15     Data(int id=0,int V=0){
 16         ID=id;val=V;
 17     }
 18     bool operator <(const Data &a)const{
 19         return val<a.val;
 20     } 
 21 };
 22 
 23 priority_queue<Data>Mx[maxn<<2];
 24 
 25 int dep[maxn],fa[maxn],sz[maxn],son[maxn];
 26 bool del[maxn];
 27 
 28 void DFS(int x){
 29     sz[x]=1;
 30     for(int i=fir[x];i;i=nxt[i])
 31         if(to[i]!=fa[x]){
 32             fa[to[i]]=x;
 33             dep[to[i]]=dep[x]+1;
 34             DFS(to[i]);
 35             sz[x]+=sz[to[i]];
 36             if(sz[son[x]]<sz[to[i]])
 37                 son[x]=to[i];
 38         }
 39 }
 40 
 41 int tot,ID[maxn],top[maxn];
 42 
 43 void DFS(int x,int tp){
 44     ID[x]=++tot;top[x]=tp;
 45     if(son[x])DFS(son[x],tp);
 46     for(int i=fir[x];i;i=nxt[i])
 47         if(to[i]!=fa[x]&&to[i]!=son[x])
 48             DFS(to[i],to[i]);
 49 }
 50 
 51 void Build(int x,int l,int r){
 52     Mx[x].push(Data(0,-1));
 53     if(l==r)return;
 54     int mid=(l+r)>>1;
 55     Build(x<<1,l,mid);
 56     Build(x<<1|1,mid+1,r);
 57 }
 58 
 59 int Query(int x,int l,int r,int g){
 60     while(del[Mx[x].top().ID])
 61         Mx[x].pop();
 62     if(l==r)
 63         return Mx[x].top().val;    
 64     int mid=(l+r)>>1;
 65     if(mid>=g)return max(Mx[x].top().val,Query(x<<1,l,mid,g));
 66     else return max(Mx[x].top().val,Query(x<<1|1,mid+1,r,g));
 67 }
 68 
 69 struct Node{
 70     int l,r;
 71     Node(int L=0,int R=0){
 72         l=L;r=R;
 73     }
 74     bool operator <(const Node &a)const{
 75         return l<a.l;
 76     }
 77 }st[maxn];
 78 
 79 void Update(int x,int l,int r,int a,int b,int id,int val){
 80     if(l>=a&&r<=b){
 81         Mx[x].push(Data(id,val));
 82         return;
 83     }
 84     int mid=(l+r)>>1;
 85     if(mid>=a)Update(x<<1,l,mid,a,b,id,val);
 86     if(mid<b)Update(x<<1|1,mid+1,r,a,b,id,val);
 87     return;
 88 }
 89 
 90 void Solve(int x,int y,int id,int val){
 91     int tp=0;
 92     while(top[x]!=top[y]){
 93         if(dep[top[x]]<dep[top[y]])
 94             swap(x,y);
 95             
 96         st[++tp]=Node(ID[top[x]],ID[x]);
 97         x=fa[top[x]];    
 98     }
 99     
100     if(dep[x]<dep[y])swap(x,y);
101     st[++tp]=Node(ID[y],ID[x]);
102     
103     sort(st+1,st+tp+1);
104     
105     int L=1;
106     for(int i=1;i<=tp;i++){
107         if(L<=st[i].l-1)
108             Update(1,1,n,L,st[i].l-1,id,val);
109         L=st[i].r+1;    
110     }
111     
112     if(L<=n)
113         Update(1,1,n,L,n,id,val);
114     
115     return;    
116 }
117 
118 int main(){
119 #ifndef ONLINE_JUDGE
120     freopen("network_tenderRun.in","r",stdin);
121     freopen("network_tenderRun.out","w",stdout);
122 #endif
123     scanf("%d%d",&n,&Q);
124     for(int i=1,a,b;i<n;i++){
125         scanf("%d%d",&a,&b);
126         addedge(a,b);
127         addedge(b,a);
128     }
129         
130     DFS(1);
131     DFS(1,1);
132     Build(1,1,n);
133         
134     for(int t=1,type,a,b,v;t<=Q;t++){
135         scanf("%d",&type);
136         if(type==0){
137             scanf("%d%d%d",&a,&b,&v);
138             Solve(a,b,t,v);
139         }
140         else if(type==1){
141             scanf("%d",&a);
142             del[a]=true;
143         }
144         else if(type==2){
145             scanf("%d",&a);
146             printf("%d\n",Query(1,1,n,ID[a]));
147         }
148     }
149     return 0;
150 }

 

数据结构(树链剖分,堆):HNOI 2016 network

标签:

原文地址:http://www.cnblogs.com/TenderRun/p/5467763.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!