BZOJ1103 [POI2007]大都市meg dfs序 线段树
2024-09-16 15:07:23
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ1103
题意概括
一棵树上,一开始所有的边权值为1,我们要支持两种操作:
1. 修改某一条边的权值为0
2. 询问根节点到某一节点的路径权值和
题解
然后差不多你就会了。
dfs序+线段树搞定了。
代码
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=+;
struct Gragh{
int cnt,x[N],y[N],nxt[N],fst[N];
void set(){
cnt=;
memset(fst,,sizeof fst);
}
void add(int a,int b){
x[++cnt]=a,y[cnt]=b;
nxt[cnt]=fst[a],fst[a]=cnt;
}
}g;
int n,m,fa[N],in[N],out[N],dis[N],time;
char ch[];
struct SegTree{
int v,add;
}t[N*];
void dfs(int rt){
in[rt]=++time;
for (int i=g.fst[rt];i;i=g.nxt[i])
dis[g.y[i]]=dis[rt]+,dfs(g.y[i]);
out[rt]=time;
}
void build(int rt,int le,int ri){
t[rt].add=t[rt].v=;
if (le==ri)
return;
int mid=(le+ri)>>,ls=rt<<,rs=ls|;
build(ls,le,mid);
build(rs,mid+,ri);
}
void pushdown(int rt){
if (!t[rt].add)
return;
int ls=rt<<,rs=ls|,&v=t[rt].add;
t[ls].add+=v,t[ls].v+=v;
t[rs].add+=v,t[rs].v+=v;
v=;
}
void update(int rt,int le,int ri,int xle,int xri){
if (ri<xle||le>xri)
return;
if (xle<=le&&ri<=xri){
t[rt].add++,t[rt].v++;
return;
}
pushdown(rt);
int mid=(le+ri)>>,ls=rt<<,rs=ls|;
update(ls,le,mid,xle,xri);
update(rs,mid+,ri,xle,xri);
}
int query(int rt,int le,int ri,int x){
if (le==ri)
return t[rt].v;
pushdown(rt);
int mid=(le+ri)>>,ls=rt<<,rs=ls|;
if (x<=mid)
return query(ls,le,mid,x);
else
return query(rs,mid+,ri,x);
}
int main(){
g.set();
scanf("%d",&n);
for (int i=,a,b;i<n;i++){
scanf("%d%d",&a,&b);
if (a>b)
swap(a,b);
fa[b]=a,g.add(a,b);
}
time=dis[]=;
dfs();
build(,,n);
scanf("%d",&m);
m+=n-;
while (m--){
int x,a,b;
scanf("%s",ch);
if (ch[]=='W'){
scanf("%d",&x);
printf("%d\n",dis[x]-query(,,n,in[x]));
}
else {
scanf("%d%d",&a,&b);
if (a>b)
swap(a,b);
update(,,n,in[b],out[b]);
}
}
return ;
}
最新文章
- [LeetCode] Longest Substring with At Most K Distinct Characters 最多有K个不同字符的最长子串
- 安卓工具箱:color of Style
- vue的transition过渡效果
- [转]Python格式化输出
- for循环经典案例
- JavaEE基础(十)
- ios开发——实用技术篇Swift篇&;播放MP3
- 安装ARM调试器
- http和HTTPS的区别及SSL介绍
- 最详细最实用-Orcad10.5安装说明
- idea解决Maven jar依赖冲突(四)
- wepy打开页面首次不显示,但是数据已经有了
- Go语言程序结构分析初探
- 探秘 Java 热部署
- ecshop2.73修改密码方法|ecshop2.73修改密码方法
- day_5.18_py总结
- getFields和getDeclaredFields
- Jquery的html方法里包含特殊字符的处理
- MyBatis思维导图
- 20179223《Linux内核原理与分析》第一周学习笔记