***题目链接戳我***

  又是在树上瞎搞滴题目....

  我们如果以安装的软件为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]软件包管理器------树剖的更多相关文章

  1. 【NOI2015】 软件包管理器 - 树链剖分

    noi2015 软件包管理器 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软 ...

  2. NOI2015软件包管理器 树剖线段树

    题目: 一棵树,兹磁 1.查询根到一个点的染色点数并全染好 2.查询子树内染色点数并把颜色洗掉 树剖裸题,丝毫不虚(为什么我考试的时候碰不到这种好题呢)好像20min写完搞定 #include < ...

  3. Luogu P2146 [NOI2015]软件包管理器 树剖

    卸载:把子树清空: 安装:把自己到$1$的链改为$1$ #include<cstdio> #include<iostream> #include<cstring> ...

  4. 【BZOJ4196】[Noi2015]软件包管理器 树链剖分

    [Noi2015]软件包管理器 树链剖分 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从 ...

  5. 【BZOJ4196】【NOI2015】软件包管理器(树链剖分,线段树)

    [BZOJ4196][NOI2015]软件包管理器 题面 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你 ...

  6. BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1352  Solved: 780[Submit][Stat ...

  7. bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2852  Solved: 1668[Submit][Sta ...

  8. 洛谷 P2146 [NOI2015]软件包管理器 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 输出样例#1: 输入样例#2: 输出样例#2: 说明 说明 思路 AC代码 总结 题面 题目链接 P ...

  9. BZOJ_4196_[NOI2015]_软件包管理器_(树链剖分)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=4196 给出一棵树,树上点权为0或1.u权值为1的条件是从根节点到u路径上的所有点权值都为1.u ...

随机推荐

  1. Node.js 命令行程序开发教程 ---------http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html

    五.yargs 模块 shelljs 只解决了如何调用 shell 命令,而 yargs 模块能够解决如何处理命令行参数.它也需要安装. $ npm install --save yargs yarg ...

  2. 零基础学习Python培训,应该选择哪个培训班?

    近几年中,Python一直是市场上最受欢迎的编程语言之一.它语法自然,入门简单,同时应用范围又极广,无论是大火的人工智能.大数据还是传统的web开发.自动化运维,Python都能够大展拳脚.根据职友集 ...

  3. 无需编写代码,用接口管理工具 eoLinker 高效完成API测试流程相关业务

    引言 作为开发人员,有时需要协助市场部门进行开发,比如在市场推广中,经常通过给用户赠送优惠券来提高复购率.这篇文章,将介绍如何使用接口管理工具 eoLinker 的自动化测试 [UI模式] 构建此业务 ...

  4. 生成元(Digit Generator, ACM/ICPC Seoul 2005, UVa1583)

    如果x加上x的各个数字之和得到y,就说x是y的生成元.给出n(1≤n≤100000),求最小 生成元.无解输出0.例如,n=216,121,2005时的解分别为198,0,1979. [分析] 本题看 ...

  5. Spring 注解注入的几种方式(转)

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程 ...

  6. C#学习笔记_10_设计模式&继承&多态

    10_设计模式&继承&多态 设计模式 由前人总结的用来解决特定问题的解决方案 单例模式 在一个项目的不同模块中获取对象,获取到的是同一个对象 代码 继承 概念:如果多个类中具有相同的字 ...

  7. TensorFlow 学习笔记(2)----placeholder的使用

    此系列将会每日持续更新,欢迎关注 在TensorFlow中输入值的方式是通过placeholder来实现 例如:做两个数的乘法时,是先准备好两个place, 再将输出值定义成两数的乘法 最后利用ses ...

  8. 编写who命令

    第一个版本: /* who1.c - a first version of the who program * open, read UTMP file, and show results. */ # ...

  9. 7-19 求链式线性表的倒数第K项

    7-19 求链式线性表的倒数第K项(20 分) 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示 ...

  10. bupt summer training for 16 #6 ——图论

    https://vjudge.net/contest/174020 A.100条双向边,每个点最少连2个边 所以最多100个点,点的标号需要离散化 然后要求恰好经过n条路径 快速幂,乘法过程就是flo ...