DFS序可以把树转到区间上再用高级数据结构维护,比树链剖分好理解很多

一个闭区间就是一棵子树

POJ3321

 #include<cstdio>
const int maxn=;
const int maxm=;
int n,m,id,cnt;
int g[maxn],q[maxn],st[maxn],ed[maxn];
int lch[],rch[],sum[];
struct Edge
{
int t,next;
}e[maxm];
void insert(int u,int v)
{
++cnt;e[cnt].t=v;e[cnt].next=g[u];g[u]=cnt;
++cnt;e[cnt].t=u;e[cnt].next=g[v];g[v]=cnt;
}
void dfs(int x,int fa)
{
q[++id]=x;
st[x]=id;
for(int tmp=g[x];tmp;tmp=e[tmp].next)
if(e[tmp].t!=fa) dfs(e[tmp].t,x);
ed[x]=id;
}
void build(int k,int l,int r)
{
int mid=(l+r)>>;
lch[k]=l;rch[k]=r;
if(l==r)
{
sum[k]=;
return;
}
build(k<<,l,mid);
build(k<<|,mid+,r);
sum[k]=sum[k<<]+sum[k<<|];
}
int query(int k,int a,int b)
{
int l=lch[k],r=rch[k],mid=(l+r)>>;
if(l==a&&r==b) return sum[k];
if(b<=mid) return query(k<<,a,b);
else if(a>mid) return query(k<<|,a,b);
else return query(k<<,a,mid)+query(k<<|,mid+,b);
}
void modify(int k,int x)
{
int l=lch[k],r=rch[k],mid=(l+r)>>;
if(l==r)
{
sum[k]^=;
return;
}
if(x<=mid) modify(k<<,x);
else modify(k<<|,x);
sum[k]=sum[k<<]+sum[k<<|];
}
long long read()
{
long long x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int main()
{
n=read();
for(int i=;i<n;i++)
{
int u=read(),v=read();
insert(u,v);
}
dfs(,);
m=read();
char ch[];
build(,,n);
for(int i=;i<=m;i++)
{
scanf("%s",ch+);
int x=read();
if(ch[]=='Q') printf("%d\n",query(,st[x],ed[x]));
else modify(,st[x]);
}
return ;
}

图论:DFS序的更多相关文章

  1. 2018.11.01 NOIP训练 图论(线段树+倍增+dfs序)

    传送门 一道挺妙的题. 对于询问点(u,v),如右图所示,我们可以发现存在一个点m在u->v的路径中,m子树的点到u是最近的,m子树外到v是最近的.其中dis(u,m)=(dis(u,v)-1) ...

  2. 图论——Tarjan 初步 DFS序+时间戳+欧拉序

    一.什么是DFS序: DFS序是按照先序遍历,先遍历根节点然后依次遍历左子树,右子树的过程,每次遇到新的节点就把新访问节点加到序列中,代码如下: int DFSrk[100000]; int cnt= ...

  3. BZOJ 3083: 遥远的国度 dfs序,树链剖分,倍增

    今天再做一天树的题目,明天要开始专攻图论了.做图论十几天之后再把字符串搞搞,区域赛前再把计几看看. 3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 128 ...

  4. [luogu P3787][新创无际夏日公开赛] 冰精冻西瓜 [树状数组][dfs序]

    题目背景 盛夏,冰之妖精琪露诺发现了一大片西瓜地,终于可以吃到美味的冻西瓜啦. 题目描述 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有 ...

  5. BZOJ3772 精神污染 【主席树 + dfs序】

    题目 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是集经济和文化于一体的一大地区,是日本西部门户,海 ...

  6. bzoj 3772 精神污染 主席树+dfs序

    精神污染 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 637  Solved: 177[Submit][Status][Discuss] Descri ...

  7. 树链剖分(附带LCA和换根)——基于dfs序的树上优化

    .... 有点懒: 需要先理解几个概念: 1. LCA 2. 线段树(熟练,要不代码能调一天) 3. 图论的基本知识(dfs序的性质) 这大概就好了: 定义: 1.重儿子:一个点所连点树size最大的 ...

  8. BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 1280 MBSubmit: 3127  Solved: 795[Submit][Status][Discu ...

  9. BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1352  Solved: 780[Submit][Stat ...

随机推荐

  1. AOP:jdk的动态代理

    1.文件结构 2.建立接口 package com.wangcf.manager; public interface IUserManager { public void add(); public ...

  2. c# apache服务器请求得到数据(初级)

    1.代码: string data = new WebClient().DownloadString("http://localhost:81/123.txt");

  3. 使用java中的注解@see

    缘起 在写java时,有时需要写注释,而为了更好的描述,需要引用和参考其他代码.为了让阅读者更好的体验,javadoc中支持链接跳转,这就需要用到注解@see. @see用法 注解@see可以在注释中 ...

  4. 201621123037 《Java程序设计》第13周学习总结

    作业13-网络 标签(空格分隔): Java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 思维导图: 其他: 网络编程:由客户端和服务器组成 - 服务器端 第一 ...

  5. Node.js系列——(3)连接DB

    背景 node.js,有人称之为运行在服务器端的JavaScript.以往我们使用JavaScript时,都是依赖后端查询数据库并返回数据,而JavaScript只需要展示即可.问题来了,就不能绕开后 ...

  6. phaser3 微信小游戏若干问题

    纯属个人兴趣, 如有兴趣可共同参与维护. git: https://gitee.com/redw1234567/phaser3_wx image的地方需要修改,代码贴上 var ImageFile = ...

  7. 定制安全的PHP环境

    除了熟悉各种PHP漏洞外,还可以通过配置php.ini来加固PHP的运行环境.PHP官方也曾经多次修改php.ini的默认设置.在本书中,推荐php.ini中一些安全相关参数的配置. register ...

  8. 分享:50行代码监听watch小程序的globalData

    监听方法: // 在任何组件.页面,例如页面 const app = getApp( ); Page({ onLoad: function( ) { app.watch$('role', ( val, ...

  9. MySQL---索引算法B+/B-树原理(一)

    B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树: ⑴树中每个结点至多有m 棵子树: ⑵若根结点不是叶子 ...

  10. bzoj4484[JSOI2015]最小表示

    题意 给出一张DAG,要求删除尽量多的边使得连通性不变.(即:若删边前u到v有路径,则删边后仍有路径).点数30000,边数100000. 分析 如果从u到v有(u,v)这条边,且从u到v只有这一条路 ...