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: 格式 ...
随机推荐
- python生成随机数
import random rnd=rand.uniform(0,10)
- 五、Shell 基本运算符
Shell 基本运算符 Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符 原生bash不支持简单的数学运算,但是可以通过其他命令 ...
- nginx下配置Yii2 rewrite、pathinfo等
环境说明: 我试用的lnmp安装包安装的nginx,nginx版本是1.14.1 server { listen ; server_name www.baidu.com; #access_log /d ...
- mybatis的环境搭建
mybatis是一个持久层框架,其主要思想就是想将程序中大量的SQL语句剥离出来,配置在配置文件中,实现SQL的灵活配置. 使得SQL与程序代码分离,即在不修改程序代码的情况下,直接在配置文件中修改S ...
- 绘制三角形:imageline()
<?php //1. 绘制图像资源(创建一个画布) $image = imagecreatetruecolor(500, 300); //2. 先分配一个绿色 $green = imagecol ...
- JZOJ 1267. 路障
1267. 路障(block.pas/c/cpp) (File IO): input:block.in output:block.out Time Limits: 1000 ms Memory Li ...
- opencv使用日记之一:平台搭建Mat类以及图像的读取修改
平台搭建就摸了一整天时间,真的是...不说了,最后我选择的是 opencv3.0(2015/06/04) + win7 + vs2012 注意opencv的版本不同导入的库文件是不一样的,所以请 ...
- Eclipse安装MAT插件
MAT(Memory Analyzer Tool) 是基于heap dumps来进行分析的,它的分析速度比jhat快,分析结果是图形界面显示,比java内置jhat的可读性更高 通过Eclipse市场 ...
- Windows核心编程小结3
内存映射和堆栈 内存映射文件 内存映射文件可以用于3个不同的目的: 系统使用内存映射文件,以便加载和执行.exe和DLL文件.这可以大大节省页文件空间和应用程序启动运行所需的时间. 可以使用内存映射文 ...
- JWT实现token认证
演变 1.1 有状态服务 在原来的单体系统中,有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,session+cookie.在如今的大多数分布式系统中 ...