博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[poj3321]Apple Tree_dfs序_树状数组
阅读量:5127 次
发布时间:2019-06-13

本文共 1204 字,大约阅读时间需要 4 分钟。

Apple Tree poj-3321

    题目大意:给你一个根固定的树,每一个点的点权是0或1,查询子树点权和。

    注释:$1\le n \le 10^5$。

      想法:刚刚学习dfs序,刷到水题偶哈哈。

        什么是dfs序?就是在遍历树的时候记录的每个点的出栈入栈序。这样就可以保证每一个节会出现两次且它的子树被其夹在中间。

      然后,子树信息就可以通过维护序列的鬼东西维护了qwq。

      紧接着,我们用树状数组维护被节点夹着的区间,就是端点节点的子树,用树状数组更新即可。

    最后,附上丑陋的代码... ...

#include 
#include
#include
#include
#define maxn 100010using namespace std;int tot,cnt;int to[2*maxn],head[maxn],nxt[2*maxn];int d[2*maxn];int p1[maxn],p2[maxn];int tree[4*maxn];inline void add(int x,int y){ to[++tot]=y; nxt[tot]=head[x]; head[x]=tot;}int lowbit(int x){ return x&(-x);}void dfs(int pos,int fa)//初始构造dfs序{ d[++cnt]=1; p1[pos]=cnt; for(int i=head[pos];i;i=nxt[i]) { if(to[i]==fa) continue; dfs(to[i],pos); } p2[pos]=cnt;}void fix(int x,int ch){ for(int i=x;i<=cnt;i+=lowbit(i)) { tree[i]+=ch; }}int query(int x){ int ans=0; for(int i=x;i;i-=lowbit(i)) { ans+=tree[i]; } return ans;}void original(){ cnt=tot=0; memset(tree,0,sizeof tree); memset(head,0,sizeof head);}int main(){ int n,m; while(~scanf("%d",&n)) { original(); for(int a,b,i=1;i

     小结:dfs序好东西好东西... ...

转载于:https://www.cnblogs.com/ShuraK/p/8710605.html

你可能感兴趣的文章
QT在windows下实现截屏操作并保存为png图片
查看>>
页面宽度
查看>>
ACM: 限时训练题解-Epic Professor-水题
查看>>
iis6兼容32位运行
查看>>
Mybatis的使用
查看>>
Node.js 连接 MySQL
查看>>
Excel Sheet Column Number(STRING-TYPE CONVERTION)
查看>>
idea中解决乱码问题
查看>>
ACM-ICPC 2018 world final A题 Catch the Plane
查看>>
那些年,那些书
查看>>
如何进行库存管理?
查看>>
面向对象六大基本原则的理解
查看>>
新手程序员在工作中需要注意的问题
查看>>
注解小结
查看>>
HTML DOM笔记
查看>>
【转】Linux 虚拟内存
查看>>
java代码编译与C/C++代码编译的区别
查看>>
Bitmap 算法
查看>>
转载 C#文件中GetCommandLineArgs()
查看>>
list control控件的一些操作
查看>>