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

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 }
时间: 2024-12-14 09:42:07

数据结构(树链剖分,堆):HNOI 2016 network的相关文章

数据结构&#183;树链剖分+LCT

于是两个一起搞了... 怎么说,写的是P党风格的C++,短也不会短到哪里去,跑起来也不快,常数大成狗OTL BZOJ 1036 树链的经典题吧,点修改+路经询问 [Code] BZOJ 2243 路径修改+路径询问 [Code] BZOJ 3083 路径修改+子树询问(根可变),这道题要用树链剖分求DFS序中某一段区间的值(DFS序可查子树,链剖可修改路径,两者相结合就行了) [Code] BZOJ 2049 用LCT维护森林形态 [Code] BZOJ 2631 路径修改+路径询问+形态可变

【BZOJ1146】【树链剖分+平衡树】网络管理Network

Description M 公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通 信网络.该网络的结构由N个路由器和N-1条高速光缆组成.每个部门都有一个专属的路由器,部门局域网内的所有机器都联向这个路由器,然后再通过这个通信 子网与其他部门进行通信联络.该网络结构保证网络中的任意两个路由器之间都存在一条直接或间接路径以进行通信. 高速光缆的数据传输速度非常快,以至于利用光缆传输的延迟时间可以忽略.但是由

数据结构(树链剖分):BZOJ 4034: [HAOI2015]T2

Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a . 操作 3 :询问某个节点 x 到根的路径中所有点的点权和. Input 第一行包含两个整数 N, M .表示点数和操作数. 接下来一行 N 个整数,表示树中节点的初始权值. 接下来 N-1 行每行三个正整数 fr, to , 表示该树中存在一条边 (fr, to) . 再

数据结构(树链剖分):COGS 2109. [NOIP2015] 运输计划

2109. [NOIP2015] 运输计划 ★★★   输入文件:transport.in   输出文件:transport.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 公元 2044 年,人类进入了宇宙纪元. L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物 流飞船需要从 ui 号星球沿最快的宇航路径飞行到 v

浅析树链剖分Orz

本文思路参考自何开大佬 引子 相信各位大佬一定会线段树这种非常实用的数据结构 那么如果我们要维护一棵树上的链的权值的时候怎么办 就比如说BZOJ1036树的统计这道题目 可能诸位草率地想想线段树是可以口头AC的,But 这是在一棵树上,线段树支持的连续的区间操作 在这棵树上,如果链的编号断断续续,那么我们的线段树就和暴力没有什么区别有一点点区别了 概念 所以这里就需要用到树链剖分,这种可以支持树上链操作的数据结构 树链剖分有很多高大上的名词需要我们去记 我们先定义一些概念东东 size[u]表示

数据结构(并查集||树链剖分):HEOI 2016 tree

[注意事项] 为了体现增强版,题目限制和数据范围有所增强: 时间限制:1.5s 内存限制:128MB 对于15% 的数据,1<=N,Q<=1000. 对于35% 的数据,1<=N,Q<=10000. 对于50% 的数据,1<=N,Q<=100000,且数据均为官方数据. 对于100% 的数据,1<=N,Q<=1000000. 请注意常数因子对于程序运行的影响. 并查集很简单,并查集就是倒序处理,表示删除一个点的标记,删除后不会再加回来,删完后,合并当前点与其

BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )

树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT+(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. 时间复杂度O(N*log^3(N)) ---------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<

【BZOJ】1146: [CTSC2008]网络管理Network(树链剖分+线段树套平衡树+二分 / dfs序+树状数组+主席树)

第一种做法(时间太感人): 这题我真的逗了,调了一下午,疯狂造数据,始终找不到错. 后来发现自己sb了,更新那里没有打id,直接套上u了.我.... 调了一下午啊!一下午的时光啊!本来说好中午A掉去学习第二种做法,噗 好吧,现在第一种做法是hld+seg+bst+二分,常数巨大,log^4级别,目前只会这种. 树剖后仍然用线段树维护dfs序区间,然后在每个区间建一颗平衡树,我用treap,(这题找最大啊,,,囧,并且要注意,这里的rank是比他大的数量,so,我们在二分时判断要判断一个范围,即要

HDU 2460 Network(双连通+树链剖分+线段树)

HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链剖分+线段树处理 代码: #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; #pragma comment(linke