bzoj 4196 树链剖分 模板
[Noi2015]软件包管理器
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 2135 Solved: 1232
[Submit][Status][Discuss]
Description
Linux用户和OSX用户一定对软件包管理器不会陌生。通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件包的安装所依赖的其它软件包),完成所有的配置。Debian/Ubuntu使用的apt-get,Fedora/CentOS使用的yum,以及OSX下可用的homebrew都是优秀的软件包管理器。
Input
输入文件的第1行包含1个正整数n,表示软件包的总数。软件包从0开始编号。
Output
输出文件包括q行。
Sample Input
0 0 0 1 1 5
5
install 5
install 6
uninstall 1
install 4
uninstall 0
Sample Output
1
3
2
3
HINT
一开始所有的软件包都处于未安装状态。
Source
传说中的noi树链剖分sb题
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = ;
const int maxm = ;
int g[maxn],v[maxm],next[maxm],eid;
int size[maxn],son[maxn],top[maxn],f[maxn];
int st[maxn],ed[maxn],vid;
int n,m,x;
char op[]; void addedge(int a,int b) {
v[eid]=b; next[eid]=g[a]; g[a]=eid++;
} struct Segtree {
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1) int sumv[maxm],sam[maxm];
int l[maxm],r[maxm]; void update(int x) {
sumv[x]=sumv[lc(x)]+sumv[rc(x)];
} void push(int x) {
if(sam[x]==-) return;
sam[lc(x)]=sam[x];
sumv[lc(x)]=sam[x]*(r[lc(x)]-l[lc(x)]+);
sam[rc(x)]=sam[x];
sumv[rc(x)]=sam[x]*(r[rc(x)]-l[rc(x)]+);
sam[x]=-;
} void change(int x,int L,int R,int val) {
if(R<l[x] || L>r[x]) return;
if(L<=l[x] && r[x]<=R) {
sam[x]=val;
sumv[x]=(r[x]-l[x]+)*val;
return;
}
push(x);
change(lc(x),L,R,val);
change(rc(x),L,R,val);
update(x);
} int query(int x,int L,int R) {
if(R<l[x] || L>r[x]) return ;
if(L<=l[x] && r[x]<=R) return sumv[x];
push(x);
return (query(lc(x),L,R)+query(rc(x),L,R));
} void build(int x,int L,int R) {
l[x]=L; r[x]=R; sam[x]=-;
if(L==R) return;
int mid=(L+R)>>;
build(lc(x),L,mid);
build(rc(x),mid+,R);
} }seg; void dfs1(int u) {
size[u]=;
for(int i=g[u];~i;i=next[i]) {
dfs1(v[i]);
size[u]+=size[v[i]];
if(size[v[i]]>size[son[u]]) son[u]=v[i];
}
} void dfs2(int u,int r) {
top[u]=r; st[u]=++vid;
if(son[u]) dfs2(son[u],r);
for(int i=g[u];~i;i=next[i]) if(v[i] != son[u])
dfs2(v[i],v[i]);
ed[u]=vid;
} void solve(int x) {
int res=;
while(x) {
res+=(st[x]-st[top[x]]+)-seg.query(,st[top[x]],st[x]);
seg.change(,st[top[x]],st[x],);
x=top[x];
x=f[x];
}
printf("%d\n",res);
}
int main()
{
memset(g,-,sizeof(g));
scanf("%d",&n);
for(int i=;i<=n;i++) {
scanf("%d",&f[i]);
f[i]++;
addedge(f[i],i);
}
seg.build(,,n);
dfs1(); dfs2(,);
scanf("%d",&m);
while(m--) {
scanf("%s%d",op,&x);
x++;
if(op[]=='i') solve(x);
else {
printf("%d\n",seg.query(,st[x],ed[x]));
seg.change(,st[x],ed[x],);
}
}
return ;
}
代码不是我的,lazy boy
bzoj 4196 树链剖分 模板的更多相关文章
- BZOJ 2243 染色 | 树链剖分模板题进阶版
BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...
- 算法复习——树链剖分模板(bzoj1036)
题目: 题目背景 ZJOI2008 DAY1 T4 题目描述 一棵树上有 n 个节点,编号分别为 1 到 n ,每个节点都有一个权值 w .我们将以下面的形式来要求你对这棵树完成一些操作:I.CHAN ...
- Hdu 5274 Dylans loves tree (树链剖分模板)
Hdu 5274 Dylans loves tree (树链剖分模板) 题目传送门 #include <queue> #include <cmath> #include < ...
- BZOJ 1036 树的统计Count 树链剖分模板题
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1036 题目大意: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将 ...
- BZOJ 1036 [ZJOI2008]树的统计Count | 树链剖分模板
原题链接 树链剖分的模板题:在点带权树树上维护路径和,最大值和单点修改 这里给出几个定义 以任意点为根,然后记 size (u ) 为以 u 为根的子树的结点个数,令 v 为 u 所有儿子中 size ...
- QTREE 树链剖分---模板 spoj QTREE
<树链剖分及其应用> 一文讲得非常清楚,我一早上就把他学会了并且A了这题的入门题. spoj QTREE 题目: 给出一棵树,有两种操作: 1.修改一条边的边权. 2.询问节点a到b的最大 ...
- bzoj1036 [ZJOI2008]树的统计Count 树链剖分模板题
[ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u ...
- bzoj1036 树的统计 树链剖分模板
题意:给出树上任意两点,求路径上的值的和与最大值,带单点修改操作 树链剖分思路: 1.对树进行dfs求出点的深度和父亲节点,然后求出轻重儿子(重儿子就是点最多的那个子树,其余都是轻儿子),用一个son ...
- 洛谷 P3384 树链剖分(模板题)
题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...
随机推荐
- Oracle表连接学习笔记
目录 一.表连接类型 1.1 内连接 1.2 外连接 二.表连接方法 2.1 表连接方法分类 2.2 表连接方法特性区别 @ 一.表连接类型 表连接类型可以分为:内连接.外连接,在看<收获,不止 ...
- [牛客OI测试赛2]F假的数学游戏(斯特灵公式)
题意 输入一个整数X,求一个整数N,使得N!恰好大于$X^X$. Sol 考试的时候只会$O(n)$求$N!$的前缀和啊. 不过最后的结论挺好玩的 $n! \approx \sqrt{2 \pi n} ...
- 三、Linux 系统目录结构
Linux 系统目录结构 登录系统后,在当前命令窗口下输入命令: ls / 你会看到如下图所示: 树状目录结构: 以下是对这些目录的解释: /bin:bin是Binary的缩写, 这个目录存放着最 ...
- 初学Docker
1.基本概念Docker 包括三个基本概念镜像( Image )容器( Container )仓库( Repository )理解了这三个概念,就理解了 Docker 的整个生命周期. 2.Docke ...
- matplotlib(一)——matplotlib横轴坐标密集字符覆盖
一.问题描述 具体问题是: 用python库matplotlib进行数据的图表展示: 图表展示图形横坐标有将近100个自定义值需要显示: 保存矢量图(svg),保存后发现横坐标过于密集,坐标值之间有覆 ...
- jupyter notebook(一)——anaconda安装后jupyter不能自动跳转网页
1.问题描述 之前没有遇到过.这次重装系统,发现安装anaconda这个集成版python后,jupyter notebook打开后不能自动跳转打开的交互网页. 系统是windows7.anacond ...
- php+croppic.js实现剪切上传图片
最近需要实现裁剪图片上传,想起之前公司用到的一个插件,却不知道叫什么名字了. 在网上找了有些时间,最终找到了这个网站. http://www.croppic.net/ 因为官网文档全部都是英文,所以看 ...
- K-th Number POJ - 2104
K-th Number POJ - 2104 You are working for Macrohard company in data structures department. After fa ...
- poj 3292 H-素数问题 扩展艾氏筛选法
题意:形似4n+1的被称作H-素数,两个H-素数相乘得到H-合成数.求h范围内的H-合成数个数 思路: h-素数 ...
- 遗传算法 | C++版GA_TSP
嗯哼,时隔半年,再次有时间整理关于组合优化问题——旅行商问题(Traveling Salesman Problem, TSP),这次采用的是经典遗传算法(Genetic Algorithm, GA)进 ...