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 ...
随机推荐
- Springboot集成SpringData JPA
序 StringData JPA 是微服务框架下一款ORM框架,在微服务体系架构下,数据持久化框架,主要为SpringData JPA及Mybatis两种,这两者的具体比较,本文不做阐述,本文只简单阐 ...
- HDU 2669 Romantic 扩展欧几里德---->解不定方程
Romantic Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- javascript学习笔记(二)
二.DOM DOM是"Document Object Model"(文档对象模型)的首字母缩写,当创建了一个网页并把它加载到WEB浏览器 中时,DOM就在后台生成,它讲根据你编写的 ...
- js-权威指南学习笔记16
1.元素的style属性可以用来设置样式,但是不适合用来查询样式(只能查询到内联样式). 2.CSS里的层叠指示了应用于文档中任何给定元素的样式规则是各个来源的层叠效果:Web浏览器的默认样式表.文档 ...
- JS计算字符串长度(兼容后端PHP)
/*** 计算字符串长度* 参数是要计算的字符串* 返回值当前字符串的长度*/function charactersLen (words) { let tempMapWordNum = {} let ...
- OAuth2学习笔记
参考:https://aaronparecki.com/oauth-2-simplified/ 1.角色定义 应用程序(客户) 需要获取用户的账号信息,获得相关权限. API服务器 资源服务器就是AP ...
- IntelliJ IDEA 2016 完美破解+汉化补丁
百度网盘下载地址:链接:https://pan.baidu.com/s/1cB6XY-N02eRKgGs1kzvqKQ 密码:6pse IntelliJ IDEA 2016是一款JAVA语言发开发工具 ...
- angularjs -- 监听angularJs列表数据是否渲染完毕
前端在做数据渲染的时候经常会遇到在数据渲染完毕后执行某些操作,这几天就一直遇到在列表和表格渲染完毕后,执行点击和选择操作.对于angularjs处理这类问题,最好的方式就是指令 directive. ...
- linux 源码包之脚本安装包的安装
脚本安装包 脚本安装包并不是独立的软件包类型,常见的实际是源码包.是人为地把安装过程写成了自动安装脚本,只要执行脚本,定义简单的参数,就可以完成安装.非常类似于windows软件的安装方式.在linu ...
- Object、String、数组的 toString() 方法和 equals() 方法及java.util.Arrays
public class Test { public static void main(String[] args) { int[] a = {1, 2, 4, 6}; int[] b = a; in ...