4196. [NOI2015]软件包管理器【树链剖分】
Description
Linux用户和OSX用户一定对软件包管理器不会陌生。通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件包的安装所依赖的其它软件包),完成所有的配置。Debian/Ubuntu使用的apt-get,Fedora/CentOS使用的yum,以及OSX下可用的homebrew都是优秀的软件包管理器。
Input
输入文件的第1行包含1个正整数n,表示软件包的总数。软件包从0开始编号。
Output
输出文件包括q行。
Sample Input
0 0 0 1 1 5
5
install 5
install 6
uninstall 1
install 4
uninstall 0
Sample Output
1
3
2
3
HINT
一开始所有的软件包都处于未安装状态。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAX (100000+5)
using namespace std;
struct node
{
int val;
int mark;
}Segt[MAX*];
struct node1
{
int to;
int next;
}edge[MAX*];
int Father[MAX],Depth[MAX];
int Sum[MAX],Son[MAX],Top[MAX];
int T_num[MAX];
int num_edge,head[MAX],n,p,x,cnt;
int a[MAX];
char r[]; void add(int u,int v)
{
edge[++num_edge].to=v;
edge[num_edge].next=head[u];
head[u]=num_edge;
} void Dfs1(int x)
{
Sum[x]=;
Depth[x]+=Depth[Father[x]]+(x!=);
for (int i=head[x];i!=;i=edge[i].next)
if (edge[i].to!=Father[x])
{
Father[edge[i].to]=x;
Dfs1(edge[i].to);
Sum[x]+=Sum[edge[i].to];
if (!Son[x] ||Sum[edge[i].to]>Sum[Son[x]])
Son[x]=edge[i].to;
}
} void Dfs2(int x,int pre)
{
T_num[x]=++cnt;
Top[x]=pre;
if (Son[x])
Dfs2(Son[x],pre);
for (int i=head[x];i!=;i=edge[i].next)
if (edge[i].to!=Son[x] && edge[i].to !=Father[x])
Dfs2(edge[i].to,edge[i].to);
} void Pushdown(int node,int l,int r)
{
if (Segt[node].mark==)
{
Segt[node<<].mark=;
Segt[node<<|].mark=;
int mid=(l+r)>>;
Segt[node<<].val=mid-l+;
Segt[node<<|].val=r-mid;
Segt[node].mark=;
}
if (Segt[node].mark==-)
{
Segt[node<<].mark=-;
Segt[node<<|].mark=-;
int mid=(l+r)>>;
Segt[node<<].val=;
Segt[node<<|].val=;
Segt[node].mark=;
}
} void Update(int node,int l,int r,int l1,int r1,int k)
{
if (l>r1 || r<l1) return;
if (l1<=l && r<=r1)
{
Segt[node].val=(r-l+)*k;
Segt[node].mark=k==?-:;
}
else
{
Pushdown(node,l,r);
int mid=(l+r)>>;
Update(node<<,l,mid,l1,r1,k);
Update(node<<|,mid+,r,l1,r1,k);
Segt[node].val=Segt[node<<].val+Segt[node<<|].val;
}
} int Query(int node,int l,int r,int l1,int r1)
{
if (l>r1 || r<l1) return ;
if (l1<=l && r<=r1)
return Segt[node].val;
else
{
Pushdown(node,l,r);
int mid=(l+r)>>;
return Query(node<<,l,mid,l1,r1)+
Query(node<<|,mid+,r,l1,r1);
}
} void Work1(int x)
{
int sum=Depth[x]+;
int cnt=;
while (x!=-)
{
cnt+=Query(,,n,T_num[Top[x]],T_num[x]);
Update(,,n,T_num[Top[x]],T_num[x],);
x=Father[Top[x]];
}
printf("%d\n",sum-cnt);
} void Work2(int x)
{
printf("%d\n",Query(,,n,T_num[x],T_num[x]+Sum[x]-));
Update(,,n,T_num[x],T_num[x]+Sum[x]-,);
} int main()
{
scanf("%d",&n);
for (int i=;i<=n-;++i)
{
scanf("%d",&x);
add(i,x);add(x,i);
}
Dfs1();
Dfs2(,);
Father[]=-;
scanf("%d",&p);
for (int i=;i<=p;++i)
{
scanf("%s%d",r,&x);
if (r[]=='i')
Work1(x);
if (r[]=='u')
Work2(x);
}
}
4196. [NOI2015]软件包管理器【树链剖分】的更多相关文章
- Bzoj 4196: [Noi2015]软件包管理器 树链剖分
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 721 Solved: 419[Submit][Statu ...
- bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2852 Solved: 1668[Submit][Sta ...
- BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1352 Solved: 780[Submit][Stat ...
- 【BZOJ4196】[Noi2015]软件包管理器 树链剖分
[Noi2015]软件包管理器 树链剖分 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从 ...
- [BZOJ4196][NOI2015]软件包管理器(树链剖分)
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2166 Solved: 1253[Submit][Sta ...
- 洛谷 P2146 [NOI2015]软件包管理器 树链剖分
目录 题面 题目链接 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 输出样例#1: 输入样例#2: 输出样例#2: 说明 说明 思路 AC代码 总结 题面 题目链接 P ...
- 【bzoj4196】[Noi2015]软件包管理器 树链剖分+线段树
题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...
- bzoj4196 [Noi2015]软件包管理器——树链剖分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4196 树链剖分. 代码如下: #include<iostream> #inclu ...
- NOI2015 软件包管理器(树链剖分+线段树)
P2146 软件包管理器 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决 ...
- [NOI2015]软件包管理器-树链剖分
#include<bits/stdc++.h> using namespace std; const int maxn = 1e6+5; int n,m; int e,begin[maxn ...
随机推荐
- Func的介绍——c#封装的代理
经常看到 Func<int, bool>...这样的写法,看到这样的就没有心思看下去了.我们学技术还是需要静下心来. 对Func<int,bool>的Func转到定义看它的解 ...
- [javaSE] 单例设计模式
四人帮设计了23中设计模式 单例设计模式:解决一个类在内存中只存在一个对象 构造函数私有化 在类中创建一个本类对象 提供一个方法可以获取该对象 class Single{ private static ...
- XML序列化与REST WCF Data Contract匹配时遇到的2个问题
问题一: XML序列化与RESTful WCF Data Contract不能匹配,无法传递类的值. 现象: 给类加上[Serializable]Attribute,可以成功序列化,但是WCF Ser ...
- loj#2542. 「PKUWC2018」随机游走(MinMax容斥 期望dp)
题意 题目链接 Sol 考虑直接对询问的集合做MinMax容斥 设\(f[i][sta]\)表示从\(i\)到集合\(sta\)中任意一点的最小期望步数 按照树上高斯消元的套路,我们可以把转移写成\( ...
- koa 中,中间件异步与同步的相关问题
同步中间件很容易理解,如以下代码: const Router = require('koa-router') , koa = new Router({ prefix: '/koa' }) , fs = ...
- opencv3.2.0图像离散傅里叶变换
源码: ##名称:离散傅里叶变换 ##平台:QT5.7.1+opencv3.2.0 ##日期:2017年12月13. /**** 新建QT控制台程序****/ #include <QCoreAp ...
- hadoop HA集群搭建步骤
NameNode DataNode Zookeeper ZKFC JournalNode ResourceManager NodeManager node1 √ √ √ √ node2 ...
- zookeeper - java操作
ZKUtils.java package test; import java.io.IOException; import java.util.concurrent.CountDownLatch; i ...
- Python 3从入门到精通02-python的简单使用
Python 3中的打印语句和字符串使用: Python中的常见数学运算: 这样的简单基础知识,你需要花5分钟就可以了,很基础的东西.
- ASP.NET中使用UpdatePanel时用Response输出出现错误的解决方法
asp.net中执行到Response.write("xx");之类语句或Microsoft JScript 运行时错误: Sys.WebForms.PageRequestMana ...