poj 3321(带时间戳 + 区间统计)
题目描述:
给定一颗树,求某个节点的子树的val值之和
可以用树的前序遍历给每一个节点编号,从而可以确定一个节点的子树的范围,这样就可以进行直接在区间上进行统计了。
vector < int > Map[maxN]写成typedef vector <int> INT; vector <INT> Map(maxN);就不超时了。
线段树
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#define LL long long
using namespace std;
//线段树
//区间每点增值,求区间和
const int maxN = ;
struct node
{
int lt, rt;
int val;
}tree[*maxN]; //向上更新
void pushUp(int id)
{
tree[id].val = tree[id<<].val + tree[id<<|].val;
} //建立线段树
void build(int lt, int rt, int id)
{
tree[id].lt = lt;
tree[id].rt = rt;
// tree[id].val = 1;//每段的初值,根据题目要求
if (lt == rt)
{
tree[id].val=;
return;
}
int mid = (lt+rt)>>;
build(lt, mid, id<<);
build(mid+, rt, id<<|);
pushUp(id);
} //增加区间内每个点固定的值
void add(int lt, int rt, int id)
{
if (lt <= tree[id].lt && rt >= tree[id].rt)
{
if(tree[id].val==)
tree[id].val=;
else
tree[id].val=;
return;
}
int mid = (tree[id].lt+tree[id].rt)>>;
if (lt <= mid)
add(lt, rt, id<<);
if (rt > mid)
add(lt, rt, id<<|);
pushUp(id);
} //查询某段区间内的和
int query(int lt, int rt, int id)
{
if (lt <= tree[id].lt && rt >= tree[id].rt)
return tree[id].val;
int mid = (tree[id].lt+tree[id].rt)>>;
int ans = ;
if (lt <= mid)
ans += query(lt, rt, id<<);
if (rt > mid)
ans += query(lt, rt, id<<|);
return ans;
} struct NODE
{
int cnt,l,r;
}a[maxN];
typedef vector<int > INT;
vector<INT > Map(maxN);
int vis[maxN];
int number;
void dfs(int fa)
{
for(int i=;i<Map[fa].size();i++)
{
int son=Map[fa][i];
if(vis[son]==)
{
a[son].cnt=++number;
a[son].l= number;
vis[son]=;
dfs(son);
a[son].r=number;
}
}
}
void init()
{
for(int i=;i<maxN;i++)
Map[i].clear();
}
int main()
{
// freopen("test.txt","r",stdin);
int n,m;
while(~scanf("%d",&n))
{
init();
for(int i=;i<=n-;i++)
{
int from,to;
scanf("%d%d",&from,&to);
Map[from].push_back(to);
Map[to].push_back(from);
}
number=;
memset(vis,,sizeof(vis));
a[].cnt=;
a[].l=;
vis[]=; dfs(); a[].r=number; build(a[].l,a[].r,);
//for(int i=1;i<=9;i++)
// printf("%d %d %d\n",a[i].cnt,a[i].l,a[i].r);
int M;
scanf("%d",&M);
char str[]; int id;
while(M--)
{
scanf("%s%d",str,&id);
//printf("%s\n",str);
if(str[]=='Q')
{
printf("%d\n",query(a[id].l,a[id].r,) );
}
if(str[]=='C')
{
add(a[id].cnt,a[id].cnt,);
}
}
}
return ;
}
树状数组
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#define LL long long
using namespace std;
const int maxN = ;
int n;
//树状数组
int C[maxN],A[maxN];
int lowbit(int x)
{
return x&(-x);
}
int sum(int x)
{
int ret=;
while(x>)
{
ret+=C[x]; x-=lowbit(x);
}
return ret;
}
void update(int x,int pls)
{
int d;
if(pls==)
{
if(A[x]==)
d=;
if(A[x]==)
d=-;
}
else
d=;
A[x]+=d;
while(x<=n)
{
C[x]+=d; x+=lowbit(x);
}
}
struct NODE
{
int cnt,l,r;
}a[maxN];
typedef vector<int> INT;
vector < INT > Map(maxN);
int vis[maxN];
int number;
void dfs(int fa)
{
for(int i=;i<Map[fa].size();i++)
{
int son=Map[fa][i];
if(vis[son]==)
{
a[son].cnt=++number;
a[son].l= number;
vis[son]=;
dfs(son);
a[son].r=number;
}
}
}
void init()
{
for(int i=;i<maxN;i++)
Map[i].clear();
}
int main()
{
//freopen("test.txt","r",stdin);
while(~scanf("%d",&n))
{
init();
for(int i=;i<=n-;i++)
{
int from,to;
scanf("%d%d",&from,&to);
Map[from].push_back(to);
Map[to].push_back(from);
}
number=;
memset(vis,,sizeof(vis));
a[].cnt=;
a[].l=;
vis[]=; dfs(); a[].r=number;
memset(C,,sizeof(C));
memset(A,,sizeof(A));
for(int i=;i<=n;i++)
update(i,);
int M;
scanf("%d",&M);
char str[]; int id;
while(M--)
{
scanf("%s%d",str,&id);
if(str[]=='Q')
{
printf("%d\n",sum(a[id].r) -sum(a[id].l-) );
}
if(str[]=='C')
{
update(a[id].cnt,);
}
}
}
return ;
}
poj 3321(带时间戳 + 区间统计)的更多相关文章
- poj 3321 单点更新 区间求和
		Apple Tree Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java c ... 
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
		POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ... 
- Hdu 3887 Counting Offspring \ Poj 3321 Apple Tree \BZOJ 1103 [POI2007]大都市meg
		这几个题练习DFS序的一些应用. 问题引入: 给定一颗n(n <= 10^5)个节点的有根树,每个节点标有权值,现有如下两种操作: 1.C x y 以节点x的权值修改为y. 2.Q x ... 
- hdu 1540 Tunnel Warfare(线段树区间统计)
		Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ... 
- POJ 3321:Apple Tree  +  HDU 3887:Counting Offspring(DFS序+树状数组)
		http://poj.org/problem?id=3321 http://acm.hdu.edu.cn/showproblem.php?pid=3887 POJ 3321: 题意:给出一棵根节点为1 ... 
- poj 3321 Apple Trie
		/* poj 3321 Apple Trie 这道题的关键是如何将一个树建成一个一维数组利用树状数组来解题! 可以利用dfs()来搞定,我们在对一个节点深搜后,所经过的节点的数目就是该节点的子树的数目 ... 
- POJ 3321 Apple Tree(DFS序+线段树单点修改区间查询)
		Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25904 Accepted: 7682 Descr ... 
- bzoj 3065: 带插入区间K小值 替罪羊树 && AC300
		3065: 带插入区间K小值 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1062 Solved: 253[Submit][Status] Des ... 
- 洛谷P2879 [USACO07JAN]区间统计Tallest Cow
		To 洛谷.2879 区间统计 题目描述 FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. ... 
随机推荐
- SPOJ LCS2 多个串的最长公共子串
			这里串最多有10个,找所有串的最长公共子串 这里后缀自动机做,以第一个串建立后缀自动机,后面的串一个个去匹配,每次得到当前串在可到达状态上所能得到的最长后缀长度 拿所有串匹配后得到的结果进行计算 #i ... 
- Pytho操作MySQL
			一.相关代码 数据库配置类 MysqlDBConn.py 01 #encoding=utf-8 02 ''' 03 Created on 2012-11-12 04 05 @author: St ... 
- jsp动态页面访问报错:HTTP Status 500 - java.lang.NullPointerException,org.apache.jasper.JasperException: java.lang.NullPointerException
			今天把项目导入进去一个新的项目中去结果出现了: org.apache.jasper.JasperException: java.lang.NullPointerException 错误,jsp居然访问 ... 
- App竞品技术分析 (3)减小安装包的体积(转)
			http://blog.csdn.net/JspAndAsp/article/details/49339403 1 从几件小事说起 春节在家帮姐姐的iPhone手机安装市面上形形色色的App,忘记她是 ... 
- Win7查看本地是否安装JDK及安装路径的方法
			工具/原料 win7 方法/步骤 1 开始->点击运行,输入:cmd 2 然后在命令提示符中,输入:java -version 假如看到有版本提示那么安装成功 3 假如忘记了java ... 
- 集群FULL GC导致服务不可用
			FULL GC会导致stop-the-world,频繁的FULL GC会影响系统的可用性.stackoverflow上有个提问是这么描述这个问题的:当服务器集群批量启动后,执行FULL GC的频率和时 ... 
- ubuntu16.04LTS安装软件
			1.安装chrome 下载源加入到系统的源列表 sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/apt/ ... 
- AIDL/IPC Android AIDL/IPC 进程通信机制——超具体解说及使用方法案例剖析(播放器)
			首先引申下AIDL.什么是AIDL呢?IPC? ------ Designing a Remote Interface Using AIDL 通常情况下,我们在同一进程内会使用Binder.Broad ... 
- 我的第一个开源控件-DragGridView
			我的第一个开源控件出炉了,希望各个小伙伴给个star,支持下.项目地址 1. 前言 因为项目须要,要做一个相似腾讯视频.频道管理.拖拽排序的效果.这个控件是在原地址 之上改造出来的.先看下效果图. 1 ... 
- C#软件开发实例.私人订制自己的屏幕截图工具(十)在截图中包括鼠标指针形状
			本实例所有文章文件夹 (一)功能概览 (二)创建项目.注冊热键.显示截图主窗体 (三)托盘图标及菜单的实现 (四)基本截图功能实现 (五)针对拖拽时闪烁卡顿现象的优化 (六)加入配置管理功能 (七)加 ... 
