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: 格式 ...
随机推荐
- 10个HTML5 实战教程 提升你的综合开发能力
HTML5 作为下一代网站开发技术,无论你是一个 Web 开发人员或者想探索新的平台的游戏开发者,都值得去研究.借助尖端功能,技术和 API,HTML5 允许你创建响应性.创新性.互动性以及令人惊叹的 ...
- Spring学习记录(一)
1.Spring简介 Spring是一个轻量级的java开发框架.框架的主要优势之一就是分层架构,Spring使用基本的JavaBean,不仅限于服务器的开发.从简单性,可测试性和松耦合的角度而言,任 ...
- 用gulp把less文件编译成css文件
第一次使用gulp构建工具,使用gulp将.less文件编译成.css文件并输出.根据视频做了笔记.提供新手和自己以后做参考. HTML文件 <!DOCTYPE html> <htm ...
- PL/SQL的安装
一.下载PLSQLDeveloper 网址:https://www.allroundautomations.com/bodyplsqldevreg.html 还需要一个激活码 二.PL/SQL的安装 ...
- swift 循环语句
// // main.swift // switch // // Created by lanou on 16/10/21. // Copyright (c) 2016年 lanou. All rig ...
- 回数是指从左向右读和从右向左读都是一样的数,例如 12321 , 909 。请利用 filter() 滤掉非回数
不管在什么地方,什么时候,学习是快速提升自己的能力的一种体现!!!!!!!!!!! 最近一段时间学习了廖雪峰老师学的Python学习资料,给自己的帮助很大,同时也学到的了很多,今天做了一道练习题,对于 ...
- django-simple-captcha 验证码干扰线随机点位
CAPTCHA_NOISE_FUNCTIONS = ( 'captcha.helpers.noise_null',# 设置样式 'captcha.helpers.noise_arcs',# 设置干扰线 ...
- python常用内置算法用到的单词音频
http://boscdn.bpc.baidu.com/v1/developer/990a728b-ca96-4bd9-9124-5357d829bf70.mp3 百度广播开发平台生成
- 精通Spring Boot---使用@ControllerAdvice处理异常
在Spring 3.2中,新增了@ControllerAdvice.@RestControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@Mode ...
- TS各个表 与 SECTION 的解析 CAS原理
TS流,通过一个个的TS包来传送: TS包可以是传送PSI SI等各表的数据包,也可以是传送节目音视频数据(携带的PES包:音视频基本流包)的包:TS携带 PSI SI等表的数据时,各个表以各表对应的 ...