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

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

  我们如果以安装的软件为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. BeginEditorCommand()

    BeginEditorCommand();开始把焦点给CAD CompleteEditorCommand();焦点给窗体

  2. tomcat 编码设置

    在Tomcat8.0之前的版本,如果你要向服务器提交中文是需要转码的(如果你没有修改server.xml中的默认编码),因为8.0之前Tomcat的默认编码为ISO8859-1. POST方式提交 r ...

  3. 环形缓冲区: ringbuf.c

    #cat aa.c /*ringbuf .c*/ #include<stdio.h> #include<ctype.h> #define NMAX 8 int iput = 0 ...

  4. Bullet:Python的函数中参数是引用吗?

    别的语言中关于函数有传值和传引用的区分. 关于此,流传很广的一个说法是 他们在现象的区别之一就是值传递后的变化,受到影响的就是引用,未受到影响的就是传值.   在学习中,也曾碰到过这个问题,网上关于这 ...

  5. G. I love Codeforces

    G. I love Codeforces 题目大意:给你n个字符串,以及m个喜欢关系,如果u喜欢v,这时候u会把它的用户名改为 I_love_ 加上v当时的用户名 Examples input 5an ...

  6. 洛谷——P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm 题意翻译 题目描述 每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在N(1<=N< ...

  7. LOJ——#6277. 数列分块入门 1

    ~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法——分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...

  8. https://github.com/MediaTek-Labs/linkit-smart-7688-feed编译失败

    mkdir -p /home/fly/workdir/LinkltSmart7688Duo-20170626/openwrt/dl/home/fly/workdir/LinkltSmart7688Du ...

  9. Windows学习总结(7)——学会CMD命令提示符的重要性

    作为普通电脑用户,大家接触最多的应该 是可视的操作系统界面.可是如果想真正学好计算机,学习好命令提示符可就是必不可少的.它可以更高效的帮助我们处理问题. 命令提示符是在操作系统中,提示进行命令输入的一 ...

  10. Caffe 工程的一些编译错误以及解决方案

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/51371936 整理一下最近遇到caff ...