欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ1103


题意概括

  一棵树上,一开始所有的边权值为1,我们要支持两种操作:

  1. 修改某一条边的权值为0

  2. 询问根节点到某一节点的路径权值和


题解

  前置技能 - dfs序相关

  然后差不多你就会了。

  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 ;
}

最新文章

  1. [LeetCode] Longest Substring with At Most K Distinct Characters 最多有K个不同字符的最长子串
  2. 安卓工具箱:color of Style
  3. vue的transition过渡效果
  4. [转]Python格式化输出
  5. for循环经典案例
  6. JavaEE基础(十)
  7. ios开发——实用技术篇Swift篇&amp;播放MP3
  8. 安装ARM调试器
  9. http和HTTPS的区别及SSL介绍
  10. 最详细最实用-Orcad10.5安装说明
  11. idea解决Maven jar依赖冲突(四)
  12. wepy打开页面首次不显示,但是数据已经有了
  13. Go语言程序结构分析初探
  14. 探秘 Java 热部署
  15. ecshop2.73修改密码方法|ecshop2.73修改密码方法
  16. day_5.18_py总结
  17. getFields和getDeclaredFields
  18. Jquery的html方法里包含特殊字符的处理
  19. MyBatis思维导图
  20. 20179223《Linux内核原理与分析》第一周学习笔记

热门文章

  1. linux4.10.8 内核移植(三)---裁剪内核
  2. ADB not responding
  3. SSH 互信
  4. Linux - 系统资源
  5. Java SE 之 DAO层接口设计思想
  6. swift 计算100000以内的 回文数
  7. shiroWeb项目-授权(十一)
  8. jmeter中实现java请求实战日志
  9. EB-GAN系(Energy-based GAN)
  10. freeRTOS中文实用教程3--中断管理之中断服务例程中使用队列