[loj3329]有根树
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 500005
4 #define eps (N<<2)
5 #define oo 0x3f3f3f3f
6 #define L (k<<1)
7 #define R (L+1)
8 #define mid (l+r>>1)
9 struct ji{
10 int nex,to;
11 }edge[N<<1];
12 int E,n,q,x,y,s,ans,head[N],sz[N],fa[N],son[N],id[N],top[N],mx[N<<2],mn[N<<2],f[N<<2];
13 void add(int x,int y){
14 edge[E].nex=head[x];
15 edge[E].to=y;
16 head[x]=E++;
17 }
18 void dfs1(int k,int f){
19 sz[k]=1;
20 fa[k]=f;
21 for(int i=head[k];i!=-1;i=edge[i].nex)
22 if (edge[i].to!=f){
23 dfs1(edge[i].to,k);
24 sz[k]+=sz[edge[i].to];
25 if (sz[edge[i].to]>sz[son[k]])son[k]=edge[i].to;
26 }
27 }
28 void dfs2(int k,int t){
29 id[k]=++x;
30 top[k]=t;
31 if (son[k])dfs2(son[k],t);
32 for(int i=head[k];i!=-1;i=edge[i].nex)
33 if ((edge[i].to!=fa[k])&&(edge[i].to!=son[k]))dfs2(edge[i].to,edge[i].to);
34 }
35 void upd(int k,int x){
36 f[k]+=x;
37 mx[k]+=x;
38 mn[k]+=x;
39 }
40 void up(int k){
41 mx[k]=max(mx[L],mx[R])+f[k];
42 mn[k]=min(mn[L],mn[R])+f[k];
43 }
44 void down(int k){
45 upd(L,f[k]);
46 upd(R,f[k]);
47 f[k]=0;
48 }
49 void del_mx(int k,int l,int r){
50 if (l==r){
51 mn[k]=f[k];
52 mx[k]=-oo;
53 return;
54 }
55 down(k);
56 if (mx[k]==mx[L])del_mx(L,l,mid);
57 else del_mx(R,mid+1,r);
58 up(k);
59 }
60 void del_mn(int k,int l,int r){
61 if (l==r){
62 mx[k]=f[k];
63 mn[k]=oo;
64 return;
65 }
66 down(k);
67 if (mn[k]==mn[L])del_mn(L,l,mid);
68 else del_mn(R,mid+1,r);
69 up(k);
70 }
71 void add(int k,int l,int r,int x,int y){
72 if (l==r){
73 if ((y)&&(mn[1]<f[k]))ans++;
74 if ((!y)&&(abs(mn[k]-oo)>eps))ans--;
75 mx[k]=-oo;
76 mn[k]=oo;
77 if ((y)&&(f[k]<=mn[1]))mx[k]=f[k];
78 if ((y)&&(f[k]>mn[1]))mn[k]=f[k];
79 return;
80 }
81 down(k);
82 if (x<=mid)add(L,l,mid,x,y);
83 else add(R,mid+1,r,x,y);
84 up(k);
85 }
86 void update(int k,int l,int r,int x,int y,int z){
87 if ((l>y)||(x>r))return;
88 if ((x<=l)&&(r<=y)){
89 if ((z>0)&&(mx[k]==mn[1])){
90 ans++;
91 del_mx(k,l,r);
92 }
93 if ((z<0)&&(mn[k]==mn[1])&&(abs(mn[k]-oo)>eps)){
94 ans--;
95 del_mn(k,l,r);
96 }
97 upd(k,z);
98 return;
99 }
100 down(k);
101 update(L,l,mid,x,y,z);
102 update(R,mid+1,r,x,y,z);
103 up(k);
104 }
105 void update(int k,int x){
106 while (k){
107 update(1,1,n,id[top[k]],id[k],x);
108 k=fa[top[k]];
109 }
110 }
111 void inc(){
112 ans++;
113 del_mx(1,1,n);
114 }
115 void dec(){
116 ans--;
117 del_mn(1,1,n);
118 }
119 int main(){
120 scanf("%d",&n);
121 memset(head,-1,sizeof(head));
122 for(int i=1;i<n;i++){
123 scanf("%d%d",&x,&y);
124 add(x,y);
125 add(y,x);
126 }
127 x=0;
128 dfs1(1,0);
129 dfs2(1,1);
130 memset(mx,-0x3f,sizeof(mx));
131 memset(mn,0x3f,sizeof(mn));
132 scanf("%d",&q);
133 for(int i=1;i<=q;i++){
134 scanf("%d%d",&x,&y);
135 x=2-x;
136 add(1,1,n,id[y],x);
137 update(y,2*x-1);
138 while (ans<mx[1])inc();
139 while (ans-1>=mn[1])dec();
140 printf("%d\n",ans);
141 }
142 }
[loj3329]有根树的更多相关文章
- 【UOJ#33】【UR#2】树上GCD 有根树点分治 + 容斥原理 + 分块
#33. [UR #2]树上GCD 有一棵$n$个结点的有根树$T$.结点编号为$1…n$,其中根结点为$1$. 树上每条边的长度为$1$.我们用$d(x,y)$表示结点$x,y$在树上的距离,$LC ...
- 无根树转有根树(dfs,tree)
#include <bits/stdc++.h> #include <iostream> #include <queue> #include <stdio.h ...
- &10 基本数据结构——指针和对象的实现,有根树的表示
#1,指针和对象的实现 如果所用的语言或者环境不支持指针和对象,那我们该怎么用数组来将其转化呢?实质上可以将这个问题的本质转化为数组和链表这两种数据结构的转换,准确来说,是将链表表示的数据用数组表示. ...
- 树形dp|无根树转有根树|2015年蓝桥杯生命之树
2015年蓝桥杯第十题--生命之树(无根树dfs) ①暴力解法:枚举子集(选点) + dfs判断连通性(题目要求连通)满足上面两个条件下找出最大值权值和 ②dfs无根树转有根树,递归找最优 先学习无根 ...
- 以 BZOJ 2002 为例学习有根树LCT(Link-Cut Tree)
以BZOJ 2002 弹飞绵羊为例学习有根树LCT(Link-Cut Tree) 注:本文非常简单,只涉及有根树LCT,对于无根树,LCT还有几个本文没有提到的操作,以后慢慢更新 =v= 知识储备 [ ...
- 再谈树---无根树转有根树( dfs搜索转化+fa数组记录父节点) *【模板】
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <vector> ...
- Codeforces 1099 D. Sum in the tree-构造最小点权和有根树 贪心+DFS(Codeforces Round #530 (Div. 2))
D. Sum in the tree time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- UVaLive 3902 Network (无根树转有根树,贪心)
题意:一个树形网络,叶子是客户端,其他的是服务器.现在只有一台服务器提供服务,使得不超k的客户端流畅,但是其他的就不行了, 现在要在其他结点上安装服务器,使得所有的客户端都能流畅,问最少要几台. 析: ...
- poj-1635 Subway tree systems(推断两个有根树是否同构)-哈希法
Description Some major cities have subway systems in the form of a tree, i.e. between any pair of st ...
随机推荐
- 记录一次基于VuePress + Github 搭建个人博客
最终效果图 网站:https://chandler712.github.io/ 一.前言 VuePress 是尤雨溪推出的支持 Vue 及其子项目的文档需求而写的一个项目,UI简洁大方,官方文档详细容 ...
- SpringBoot+WebSocket实时监控异常
写在前面 此异常非彼异常,标题所说的异常是业务上的异常. 最近做了一个需求,消防的设备巡检,如果巡检发现异常,通过手机端提交,后台的实时监控页面实时获取到该设备的信息及位置,然后安排员工去处理. 因为 ...
- 洛谷3648 [APIO2014]序列分割(斜率优化+dp)
首先对于这个题目. qwq 存在一个性质就是,最终的答案只跟你的分割的位置有关,而和顺序无关. 举一个小栗子 \(a\ b\ c\) 将这个东西分成两块. 如果我们先分割\(ab\)之间的话,\(an ...
- Python实现九九乘法表
- Perl操作excel2007的模块
详细版:https://www.jianshu.com/p/84bda53827c8 第一种方法: 读写excel2007文档的perl模块: Spreadsheet::XLSX(读)和Spreads ...
- perl打开读取文件(open)
在Perl中可以用open或者sysopen函数来打开文件进行操作,这两个函数都需要通过一个文件句柄(即文件指针)来对文件进行读写定位等操作.下面以open函数为例:1:读:open(文件句柄,&qu ...
- noj -> 跳马
00 题目 描述: 在国际象棋中,马的走法与中车象棋类似,即俗话说的"马走日",下图所示即国际象棋中马(K)在一步能到达的格子(其中黑色的格子是能到达的位置). 现有一200*20 ...
- 『与善仁』Appium基础 — 5、常用ADB命令(二)
目录 9.查看手机运行日志 (1)Android 日志 (2)按级别过滤日志 (3)按 tag 和级别过滤日志 (4)日志格式 (5)清空日志 10.获取APP的包名和启动名 方式一: 方式二: 11 ...
- Centos 8 升级ssl到1.1.1h
升级到1.1.1h版本 #编译openssl和安装 ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl & ...
- systemd-nspawn以及container的学习
container的分类 目前container可以分为两大类,一类是Privileged container,一类是Unprivileged container. Privileged contai ...