C++-POJ3321-Apple Tree[数据结构][树状数组]
2024-09-05 16:33:14
树上的单点修改+子树查询
用dfn[u]和num[u]可以把任意子树表示成一段连续区间,此时结合树状数组就好了
#include <set>
#include <map>
#include <cmath>
#include <queue>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN=(int)1e5+;
const int MAXM=(int)2e5+;
int a[MAXN],n,m;char s[];
int lb(int i){return i&-i;}//lowbit
void add(int i,int v){for(;i<=n;a[i]+=v,i+=lb(i));}
int sum(int i){int ans=;for(;i;ans+=a[i],i-=lb(i));return ans;}
int query(int i,int j){return sum(j)-sum(i-);} struct node{int v,next;}edge[MAXM];
int head[MAXN],cnt;
void addedge(int u,int v){edge[++cnt].v=v,edge[cnt].next=head[u],head[u]=cnt;}
void Addedge(int u,int v){addedge(u,v),addedge(v,u);} int dfn[MAXN],num[MAXN],index;
void dfs(int u,int fa){
dfn[u]=++index;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v;
if(v!=fa)num[u]++,dfs(v,u),num[u]+=num[v];
}
} void Order_C(int x){query(dfn[x],dfn[x])?add(dfn[x],-):add(dfn[x],);}
void Order_Q(int x){printf("%d\n",query(dfn[x],dfn[x]+num[x]));} int main() {
scanf("%d",&n);
for(int i=,u,v;i<n;i++)scanf("%d%d",&u,&v),Addedge(u,v);
dfs(,),scanf("%d",&m);
for(int i=;i<=n;i++)add(i,);
for(int i=,x;i<=m;i++)scanf("%s%d",s,&x),s[]=='C'?Order_C(x):Order_Q(x);
return ;
}
最新文章
- 读《乔布斯的NeXT和苹果之间,隔了这两个创业常识》
- Thinkphp 带查询条件数据分页
- Centos 6.7 安装smokeping (最完整教程)
- 7、C#基础整理(类)
- NeHe OpenGL教程 第三十八课:资源文件
- wireshark: there are no interfaces on which a capture can be done
- (JAVA)从零开始之--对象输入输出流ObjectInputStream、ObjectOutputStream(对象序列化与反序列化)
- 将json转化为model
- 小米1S iptables禁止443端口
- office web apps部署(二)
- 笔记:Ubuntu 上的Testlink 部署
- 5个Android开发中比较常见的内存泄漏问题及解决办法
- HTML标签自定义属性
- Yii的数组助手类
- win10安装mongodb及配置 和 mongodb的基本使用(node环境)
- 如何卸载Centos自带jdk
- cocos creator主程入门教程(六)—— 消息分发
- Js中常用知识点(typeof、instanceof、动态属性、变量作用域)
- CentOS 离线安装 MYSQL+APACHE+PHP
- alpha冲刺(4/10)