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 ...
随机推荐
- [android] 手机卫士黑名单功能(ListView优化)
上一篇记录了使用ListView展示出来了100条数据,当慢慢拖动的时候,不会有问题,但是当拖动很快的时候,应用会报anr错误 查看错误日志,看到报OutOfMemoryError,内存不足 List ...
- 线程10--NSOperation的基本操作
一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. (3)最⼤大并发数的相关⽅方法 - (NSInteg ...
- Servlet 思维导图
- SEDA架构程序实现
一.SEDA SEDA全称是:stage event driver architecture,中文直译为“分阶段的事件驱动架构”,它旨在结合事件驱动和多线程模式两者的优点,从而做到易扩展,解耦合,高并 ...
- 前端框架 vue 和 react 的区别
前言:最近需要使用 react,以前用过 vue,故来总结两者的区别. 首先React与vue有几点相同之处 1.都使用了Virtual DOM 2.提供了响应式(Reactive)和组件化(Comp ...
- C# base64 和图片互转
C# imgage图片转base64字符/base64字符串转图片另存成 //图片转为base64编码的字符串 protected string ImgToBase64String(string Im ...
- thymeleaf 标签使用方法
使用thymeleaf首先添加依赖,<dependency><groupId>org.springframework.boot</groupId><artif ...
- PHP网站(Drupal7)响应过慢之“Wating(TTFB)时间过长”
直接上图: 这是Chrome浏览器自带的工具分析的.整个url请求的时间为2.59秒,最大的耗时在Wating(TTFB, Time To First Byte),消耗了2.59秒(应该是其他时间太短 ...
- js下载文件
本文的前提是:后台给的是一个可以下载的url的情况下的下载: 怎样的文件url才能触发浏览器的下载行为?(转自SF) 能触发浏览器下载的url有两类: response header中指定了Conte ...
- Ubuntu16安装GPU版本TensorFlow(个人笔记本电脑)
想着开始学习tf了怎么能不用GPU,网上查了一下发现GeForce GTX确实支持GPU运算,所以就尝试部署了一下,在这里记录一下,避免大家少走弯路. 使用个人笔记本电脑thinkpadE570,内存 ...