[NOI2015,LuoguP2146]软件包管理器------树剖
***题目链接戳我***
又是在树上瞎搞滴题目....
我们如果以安装的软件为1,未安装的软件为0,那么软件改变的数量即树上权值总和的数量,涉及到区间修改,区间查询,考虑树剖
分析完毕,似乎没啥好说的了。。。树剖模板题(然鹅我是不会告诉你们我因为把int打成char查了好久好久代码滴...)
细节问题:为了便于处理把每个节点编号都加上1,避免一些不必要的错误
P.S.打完才发现好像不用区间查询
代码:
#include<cstdio>
#include<cctype>
#include<iostream>
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-')f=-;chr=getchar();}
while(isdigit(chr)) {ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}const int M=;int n,m;
inline int abs(int x) {if(x<) return -x;return x;}
int head[M],ver[M],nxt[M],tot,fa[M],dep[M],son[M],top[M],idx[M],sz[M],t,sum[M<<],lz[M<<];
inline void add(int x,int y){ver[++tot]=y;nxt[tot]=head[x];head[x]=tot;}
void dfs1(int x){
dep[x]=dep[fa[x]]+;sz[x]=;
for(int i=head[x];i;i=nxt[i]){
if(ver[i]==fa[x]) continue;
fa[ver[i]]=x,dfs1(ver[i]);sz[x]+=sz[ver[i]];
if(sz[ver[i]]>sz[son[x]]) son[x]=ver[i];
}
}void dfs2(int x,int topf){
idx[x]=++t;top[x]=topf;
if(!son[x]) return;dfs2(son[x],topf);
for(int i=head[x];i;i=nxt[i])
if(!idx[ver[i]]) dfs2(ver[i],ver[i]);
}inline void Push_Up(int i){sum[i]=sum[i<<]+sum[i<<|];}
inline void Push_Down(int i,int l,int r){
if(lz[i]==) return;int mid=l+r>>;
if(lz[i]==-) sum[i<<]=sum[i<<|]=,lz[i<<]=lz[i<<|]=-;
else sum[i<<]=mid-l+,sum[i<<|]=r-mid,lz[i<<]=lz[i<<|]=;
lz[i]=;return;
}void Update(int i,int l,int r,int ql,int qr,int x){
if(ql<=l&&r<=qr){
if(!x)lz[i]=-,sum[i]=;//lz==-1-->Update->0 lz==1 --> Update->1
else lz[i]=,sum[i]=r-l+;
return;
}int mid=l+r>>;Push_Down(i,l,r);
if(mid>=ql) Update(i<<,l,mid,ql,qr,x);
if(mid<qr) Update(i<<|,mid+,r,ql,qr,x);
Push_Up(i);
}void Change(int v,int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
Update(,,n,idx[top[x]],idx[x],v);
x=fa[top[x]];
}if(dep[x]>dep[y]) swap(x,y);Update(,,n,idx[x],idx[y],v);
}
int main(){
// freopen("rjb.in","r",stdin);
n=read();
for(int i=;i<=n;i++){int x=read();++x;add(x,i);add(i,x);}
dfs1(),dfs2(,);
m=read();char opt[];int x,bf;
while(m--){scanf("%s",opt);x=read();bf=sum[];++x;
if(opt[]=='i'){
Change(,x,);
printf("%d\n",abs(sum[]-bf));
}else{
Update(,,n,idx[x],idx[x]+sz[x]-,);
printf("%d\n",abs(sum[]-bf));
}
}
return ;
}
[NOI2015,LuoguP2146]软件包管理器------树剖的更多相关文章
- 【NOI2015】 软件包管理器 - 树链剖分
noi2015 软件包管理器 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软 ...
- NOI2015软件包管理器 树剖线段树
题目: 一棵树,兹磁 1.查询根到一个点的染色点数并全染好 2.查询子树内染色点数并把颜色洗掉 树剖裸题,丝毫不虚(为什么我考试的时候碰不到这种好题呢)好像20min写完搞定 #include < ...
- Luogu P2146 [NOI2015]软件包管理器 树剖
卸载:把子树清空: 安装:把自己到$1$的链改为$1$ #include<cstdio> #include<iostream> #include<cstring> ...
- 【BZOJ4196】[Noi2015]软件包管理器 树链剖分
[Noi2015]软件包管理器 树链剖分 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从 ...
- 【BZOJ4196】【NOI2015】软件包管理器(树链剖分,线段树)
[BZOJ4196][NOI2015]软件包管理器 题面 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你 ...
- BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1352 Solved: 780[Submit][Stat ...
- bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2852 Solved: 1668[Submit][Sta ...
- 洛谷 P2146 [NOI2015]软件包管理器 树链剖分
目录 题面 题目链接 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 输出样例#1: 输入样例#2: 输出样例#2: 说明 说明 思路 AC代码 总结 题面 题目链接 P ...
- BZOJ_4196_[NOI2015]_软件包管理器_(树链剖分)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=4196 给出一棵树,树上点权为0或1.u权值为1的条件是从根节点到u路径上的所有点权值都为1.u ...
随机推荐
- Python星号表达式
有时候可能想分解出某些值然后丢弃它们,可以使用诸如 _ 或者 ign(ignored)等常用来表示待丢弃值的变量名: record = ('ACME', 50, 123.45, (12, 18, 20 ...
- Origin C调用GSL
GSL (GNU Scientific Library, http://www.gnu.org/software/gsl/)是C.C++的数值算法库,提供了范围宽广的数学程序,包括随机数字生成器.数理 ...
- 文件上传原理--FileReader
单个文件:<div> <input value="上传" type="file" id="photos_upload"&g ...
- drf07 过滤 排序 分页 异常处理 自动生成接口文档
4. 过滤Filtering 对于列表数据可能需要根据字段进行过滤,我们可以通过添加django-fitlter扩展来增强支持. pip install django-filter 在配置文件sett ...
- css流光效果
css流光效果1: <!DOCTYPE html> <html> <head> <title>ww</title> </head> ...
- 小白年薪24万,为什么Linux运维工程师薪资这么高?
借了云计算的东风,Linux岗位这几年是越来越火,特别是Linux云计算运维工程师,如今早已成为互联网的核心岗位之一,薪资待遇飞快的上涨. 作为一个细分的专业岗位,Linux云计算工程师由于其入门学习 ...
- 字符串问题:去掉字符串中连续出现 k 个 0 的子串
[题目] 给定一个字符串 str 和 一个整数 k, 如果 str 中正好有连续 k 个 ‘0’ 字符出现时,把 k 个连续的 ‘0’ 字符去除,返回处理后的字符串. [举例] str="A ...
- RHEL6 配置Yum库
在/mnt目录下创建子目录“/cdrom”(用于将iso文件挂载到此目录下) 镜像状态确定为“已连接”(“已连接”未勾选的情况下无法获得iso文件) 配置自动挂载文件 (系统开机时会主动读取“/etc ...
- OSI 7层模型和 TCP/IP 5层模型
网络协议通常分不同层次进行开发,每一层分别负责不同的通行功能. 两种参考模型 OSI 和 TCP/IP, OSI 先有模型后有协议,TCP/IP 则相反. OSI 7层模型 - 应用层 - 表示层 - ...
- 解决Eclipse导入项目后Validating验证缓慢的问题
减少不必要的验证即可 步骤:Window-Preferences-左侧的Validation 如图所示,将Build一列的勾全部去掉就好了. 如需手动校验,右键项目名-选择Validate即可.