【题解】

  每个软件只依赖另一个软件,且依赖关系不构成环,那么很容易想到这是树形结构。

  我们用1表示以安装,用0表示未安装或已卸载;那么安装一个软件,就是把它到树根的路径上所有的点都改为1;卸载一个软件,就是把它的子树全部改为0.

  状态改变的软件包数就是操作前后整棵树的点权和。

  这样我们直接树链剖分即可。

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#define LL long long
#define rg register
#define N 100010
#define ls (u<<1)
#define rs (u<<1|1)
#define mid ((a[u].l+a[u].r)>>1)
#define len(x) (a[x].r-a[x].l+1)
using namespace std;
int n,m,cnt,last,fa[N],hvy[N],top[N],dep[N],siz[N],dfn[N];
vector<int>son[N];
struct tree{
int l,r,sum; bool mark;
}a[N<<];
inline int read(){
int k=,f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
return k*f;
}
void dfs1(int x){
siz[x]=;
for(rg int i=,to;i<son[x].size();i++){
dfs1(to=son[x][i]); siz[x]+=siz[to];
if(siz[to]>siz[hvy[x]]) hvy[x]=to;
}
}
void dfs2(int x,int tp){
top[x]=tp; dfn[x]=++cnt;
if(hvy[x]) dfs2(hvy[x],tp);
for(rg int i=,to;i<son[x].size();i++)
if((to=son[x][i])!=hvy[x]) dfs2(to,to);
}
void build(int u,int l,int r){
a[u].l=l; a[u].r=r;
if(l<r) build(ls,l,mid),build(rs,mid+,r);
}
inline void pushdown(int u){
a[u].mark=; a[ls].mark=a[rs].mark=;
if(a[u].sum) a[ls].sum=len(ls),a[rs].sum=len(rs);
else a[ls].sum=a[rs].sum=;
}
void update(int u,int l,int r,bool type){//type==1-->install
if(l<=a[u].l&&a[u].r<=r){
a[u].sum=type?len(u):;
a[u].mark=;
return;
}
if(a[u].mark) pushdown(u);
if(l<=mid) update(ls,l,r,type);
if(r>mid) update(rs,l,r,type);
a[u].sum=a[ls].sum+a[rs].sum;
}
//int query(int u,int l,int r){
// if(l<=a[u].l&&a[u].r<=r) return a[u].sum;
// if(a[u].mark) pushdown(u); int ret=0;
// if(l<=mid) ret=query(ls,l,r);
// if(r>mid) ret+=query(rs,l,r);
// return ret;
//}
int main(){
n=read();
for(rg int i=;i<=n;i++){
int f=read()+;
fa[i]=f; dep[i]=dep[f]+;
son[f].push_back(i);
}
dfs1(); dfs2(,); build(,,n);
// for(rg int i=1;i<=n;i++) printf("%d ",siz[i]); puts("siz");
m=read();
while(m--){
char c=getchar(); while(c!='i'&&c!='u') c=getchar();
int x=read()+;
if(c=='i'){
int t=top[x];
while(x){
update(,dfn[t],dfn[x],);
x=fa[t]; t=top[x];
}
}
else update(,dfn[x],dfn[x]+siz[x]-,);
printf("%d\n",abs(a[].sum-last),a[].sum); last=a[].sum;
}
return ;
}

洛谷 2146 [NOI2015]软件包管理器的更多相关文章

  1. 洛谷 P2146 [NOI2015]软件包管理器 解题报告

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

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

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

  3. 洛谷 P2146 [NOI2015]软件包管理器 (树链剖分模板题)

    题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...

  4. 洛谷 pP2146 [NOI2015]软件包管理器

    题目的传送门 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...

  5. 洛谷 P2146 [NOI2015]软件包管理器

    真没有想到,这竟然会是一道NOI的原题,听RQY说,这套题是北大出的,北大脑抽认为树剖很难... 只恨没有早学几年OI,只A这一道题也可以出去吹自己一A了NOI原题啊 好了,梦该醒了,我们来看题 以后 ...

  6. 洛谷P2146 [NOI2015]软件包管理器

    https://www.luogu.org/problemnew/show/P2146 传送门 简单的树链剖分......维护下当前安装了多少个包......修改后查询下就行了......附上极其丑陋 ...

  7. 洛谷P2146 [NOI2015]软件包管理器 题解 树链剖分+线段树

    题目链接:https://www.luogu.org/problem/P2146 本题涉及算法: 树链剖分: 线段树(区间更新及求和,涉及懒惰标记) 然后对于每次 install x ,需要将 x 到 ...

  8. [Luogu 2146] NOI2015 软件包管理器

    [Luogu 2146] NOI2015 软件包管理器 树剖好题. 通过对题目的分析发现,这些软件构成一棵树,\(0\) 是树根. 每下载一个软件,需要下载根到这个软件的路径上的所有软件: 每卸载一个 ...

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

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

随机推荐

  1. [转]使用git进行版本控制

    使用git进行版本控制 本文将介绍一种强大的版本控制工具,git的基本使用.与之前svn工具类似,首先给出一些常见的使用需求,然后以这些需求为中心,来展开git的学习过程.由于我也是在学习当中所以其中 ...

  2. MySQL 目录结构信息

    bin 目录,存储可执行文件. data 目录,存储数据文件. docs 目录,文档. include 目录,存储包含的头文件. lib 目录,存储库文件. share 目录,错误信息和字符集文件.

  3. python 操作数据库时遇到的错误

       pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; ch    之前的写法是从文件里 ...

  4. 2017杭电多校第七场1005Euler theorem

    Euler theorem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) ...

  5. Windows平台下Oracle监听服务启动过程中日志输出

    Windows平台下Oracle监听服务启动过程中日志输出记录. 日志目录:D:\app\Administrator\diag\tnslsnr\WIN-RU03CB21QGA\listener\tra ...

  6. C# 输出控制台结果到文件

    StreamWriter sw = new StreamWriter(@"c:\output.txt"); Console.SetOut(sw); Console.WriteLin ...

  7. Winform学习知识汇总

    引用博客 http://www.cnblogs.com/peterzb/archive/2009/06/14/1502918.html

  8. WCF学习笔记(1)-一个完整的例子

    一.开发环境 IDE:VS2013 OS:Win10 IIS:IIS 10 二.开发流程 1.项目结构 2.添加一个WCF程序 3.删除系统自动生成的两个文件IService1.cs和Service1 ...

  9. ES6十大常用特性

    .   Default Parameters(默认参数) in ES6 2.    Arrow Functions (箭头函数)in ES6 3.    Block-Scoped Constructs ...

  10. python与arduino串口通讯对接opencv实现智能物品分拣

    2018-05-0118:53:50 先上图: 再来视频: http://v.youku.com/v_show/id_XMzU3NzAwNzMyNA==.html?spm=a2hzp.8244740. ...