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 ...
随机推荐
- [PHP] 重回基础(Array相关函数)
使用函数array_keys(),得到数组中所有的键,参数:数组 $arr=array(); $arr['one']="one"; $arr['two']="two&qu ...
- CSS starts
I have not written any articles here since I graduated from my university. Now I begin to write down ...
- 高并发第九弹:逃不掉的Map --> HashMap,TreeMap,ConcurrentHashMap
平时大家都会经常使用到 Map,面试的时候又经常会遇到问Map的,其中主要就是 ConcurrentHashMap,在说ConcurrentHashMap.我们还是先看一下, 其他两个基础的 Map ...
- node.js和JavaScript的关系
node.js是一个基于 Chrome V8 引擎的 JavaScript 运行时环境. 一.类比JavaScript和java JavaScript java V8 JVM node.js JRE ...
- Windows下Sqlplus中显示乱码
set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK 如果想显示英文 Set nls_lang=american_america.zhs16gbk 注意,前提是 ...
- Python写随机发红包的原理流程
首先来说说要用到的知识点,第一个要说的是扩展包random,random模块一般用来生成一个随机数 今天要用到ramdom中unifrom的方法用于生成一个指定范围的随机浮点数通过下面的图简单看下: ...
- python学习之老男孩python全栈第九期_数据库day004 -- 作业
https://www.cnblogs.com/YD2018/p/9451809.html 11. 查询学过“001”并且也学过编号“002”课程的同学的学号.姓名 select student.si ...
- 【代码笔记】iOS-ios7 StatusBar
代码: RootViewController.m #import "RootViewController.h" @interface RootViewController () @ ...
- [WEB面试题] web前端面试题HTML+CSS第一弹,个人整理部分面试题汇总
以下内容仅供参考,网络整理而来 1.XHTML和HTML是什么有什么不同的区别 HTML是一种基本的WEB网页设计语言 XHTML可扩展超文本标记语言,是一种置标语言,表现方式与超文本标记语言(HTM ...
- React—Native开发之原生模块向JavaScript发送事件
首先,由RN中文网关于原生模块(Android)的介绍可以看到,RN前端与原生模块之 间通信,主要有三种方法: (1)使用回调函数Callback,它提供了一个函数来把返回值传回给JavaScript ...