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

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

  我们如果以安装的软件为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. Python 之列表操作

    # len(list)列表元素个数 # max(list)返回列表元素最大值 # min(list)返回列表元素最小值 # list(seq)将元组转换为列表 # list.append(obj)在列 ...

  2. JSON,对象..的数据格式

    [此案例为自动产生的随机数] 对象: {a1:180,a2:721, a3:574} 序列化传值:将对象转化为Json字符串 public ActionResult Val2() { Random r ...

  3. Day 27 网络编程

    目录 网络架构及演变过程 网络架构 互联网和互联网的组成 互联网的组成(教材版) 互联网的组成(科普版) 互联网的硬件组成 互联网的软件组成 OSI七层协议 物理层 数据链路层 网络架构及演变过程 网 ...

  4. DOM节点的获取

      document.getElementById();//id名,在实际开发中较少使用,选择器中多用class  id一般只用在顶级层存在 不能太过依赖id document.getElements ...

  5. 16.2 【C# 5】调用者信息特性

    16.2.1 基本行为 .NET 4.5引入了三个新特性(attribute),即 CallerFilePathAttribute . CallerLineNumber- Attribute 和 Ca ...

  6. SQL上门

    学习这个 介绍:SQL 是用于访问和处理数据库的标准的计算机语言.结构化化查询语言! SQL可以分为两大部分:数据操作语言(DML)和数据定义语言(DDL) 数据操作语言:select.update. ...

  7. [备忘]git常用命令

    网站有点儿久没有维护(因为去做其他事情了呗),现在空下来,回来改了网站的一些东西,却忘记了git的一些常用的命令,于是便写下这篇文,方便查阅,免得每次都去看手册(毕竟我懒啊!!) 检查当前文件状态:g ...

  8. scrapy框架的日志等级和请求传参, 优化效率

    目录 scrapy框架的日志等级和请求传参, 优化效率 Scrapy的日志等级 请求传参 如何提高scripy的爬取效率 scrapy框架的日志等级和请求传参, 优化效率 Scrapy的日志等级 在使 ...

  9. PAT 1101 Quick Sort

    There is a classical process named partition in the famous quick sort algorithm. In this process we ...

  10. Linux下C++开发教程收集

    http://blog.csdn.net/wangfengwf/article/category/1315687 http://wiki.jikexueyuan.com/list/c/(极客学院C++ ...