bzoj 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
一开始所有的软件包都处于未安装状态。
Source
传说中的树链剖分大果题。。。闲的没事干,发现竟然连线段树都能打错
安装:查询x到根的0的个数,并把路径赋为1;
删除:查询x的子树中1的个数,并把子树赋为0;
所以只有区间覆盖和区间求和操作,zz选手竟然打了1.5h...
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ls x<<1
#define rs x<<1|1
using namespace std;
const int N=300000;
int tt,dfn[N],size[N],top[N],son[N],deep[N],fa[N],head[N],to[N],nxt[N],cnt;
int lazy[N*4],tr[N*4],n,m;
char ch[N];
void dfs1(int x,int f){
size[x]=1;deep[x]=deep[f]+1;
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(y!=f){
dfs1(y,x);fa[y]=x;
size[x]+=size[y];
if(size[y]>size[son[x]]) son[x]=y;
}
}
}
void dfs2(int x,int f){
top[x]=f;dfn[x]=++tt;
if(son[x]) dfs2(son[x],f);
for(int i=head[x];i;i=nxt[i]){
int y=to[i];
if(y!=fa[x]&&y!=son[x]) dfs2(y,y);
}
}
void pushdown(int x,int l,int r){
if(lazy[x]==1){
lazy[ls]=lazy[rs]=1;lazy[x]=0;
tr[ls]=tr[rs]=0;
}
else{
lazy[ls]=lazy[rs]=2;lazy[x]=0;
int mid=(l+r)>>1;
tr[ls]=mid-l+1;tr[rs]=r-mid;
}
}
void pushup(int x){tr[x]=tr[ls]+tr[rs];}
int query(int x,int L,int R,int xl,int xr,int flag){
if(xl<=L&&R<=xr) return tr[x];
if(lazy[x]) pushdown(x,L,R);
int mid=(L+R)>>1;
if(xr<=mid) return query(ls,L,mid,xl,xr,flag);
else if(xl>mid) return query(rs,mid+1,R,xl,xr,flag);
else return query(ls,L,mid,xl,mid,flag)+query(rs,mid+1,R,mid+1,xr,flag);
}
void update(int x,int L,int R,int xl,int xr,int flag){
if(xl<=L&&R<=xr){
lazy[x]=flag;
if(flag==1) tr[x]=0;
else tr[x]=R-L+1;
return;
}
int mid=(L+R)>>1;
if(lazy[x]) pushdown(x,L,R);
if(xr<=mid) update(ls,L,mid,xl,xr,flag);
else if(xl>mid) update(rs,mid+1,R,xl,xr,flag);
else update(ls,L,mid,xl,mid,flag),update(rs,mid+1,R,mid+1,xr,flag);
pushup(x);
}
void work1(int x){
int ret=0;
while(x){
int r=dfn[x],l=dfn[top[x]];
ret+=r-l+1-query(1,1,n,l,r,2);
update(1,1,n,l,r,2);x=fa[top[x]];
}
printf("%d\n",ret);
}
void work2(int x){
printf("%d\n",query(1,1,n,dfn[x],dfn[x]+size[x]-1,2));
update(1,1,n,dfn[x],dfn[x]+size[x]-1,1);
}
void lnk(int x,int y){
to[++cnt]=y,nxt[cnt]=head[x],head[x]=cnt;
to[++cnt]=x,nxt[cnt]=head[y],head[y]=cnt;
}
int main(){
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
scanf("%d",&n);
for(int i=2;i<=n;i++){
int x;scanf("%d",&x);x++;lnk(i,x);
}
dfs1(1,0);dfs2(1,1);
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%s",ch+1);
int x;scanf("%d",&x);x++;
if(ch[1]=='i') work1(x);
else work2(x);
}
return 0;
}
bzoj 4196: [Noi2015]软件包管理器的更多相关文章
- BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1352 Solved: 780[Submit][Stat ...
- 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]软件包管理器
Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...
- 4196. [NOI2015]软件包管理器【树链剖分】
Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...
- 4196: [Noi2015]软件包管理器
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 412 Solved: 251[Submit][Status][Discuss] Descriptio ...
- [BZOJ4196][NOI2015]软件包管理器
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1040 Solved: 603[Submit][Stat ...
- [BZOJ4196][NOI2015]软件包管理器(树链剖分)
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2166 Solved: 1253[Submit][Sta ...
- [NOI2015]软件包管理器
4621 [NOI2015]软件包管理器 题目等级 : 钻石 Diamond 题目描述 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过 ...
随机推荐
- spring boot自定义log4j2日志文件
背景:因为从 spring boot 1.4开始的版本就要用log4j2 了,支持的格式有json和xml两种格式,此次实践主要使用的是xml的格式定义日志说明. spring boot 1.5.8. ...
- CS窗体程序数据列表分页
以前,觉得winform程序分页很无趣,也没实际意义,直到近期的项目实践中让我认识到原来winform数据列表分页也是非常有必要的,因为由于数据量过大的情况,当窗体在初始加载数据的时候如果不做条件的限 ...
- Windows系统重装
http://www.ishuo.cn/show/76437.htmlhttp://jingyan.baidu.com/article/d8072ac45d4f60ec95cefdaa.html
- JAVAFX-5事件总结
事件监听 在RIA 或者说 桌面客户端gui android 开发中,事件的机制是必须的要学习了解的, 分类处理类型 在Java GUI 和swing中,事件通常通过实现listener的接口函数,并 ...
- ionic3中 ion-datetime 全屏可点击问题解决方案
废话不多说,能进来的都应该知道是个什么情况.我也是在网上找了一段时间,才在git上ionic官方团队的Issues中找到了问题解决方法. 第一,给外围包上一层ion-item,但是这有个问题,就是会让 ...
- kvm虚拟机管理 系统自动化安装
原创博文安装配置KVM http://www.cnblogs.com/elvi/p/7718574.htmlweb管理kvm http://www.cnblogs.com/elvi/p/7718582 ...
- 利用阿里云Centos7建站过程
以下可能不尽详述,如有问题欢迎指出 准备过程:1. 阿里云主机一台2.域名一个 3.github个人帐号开始: 1.以root帐号登录云主机 2.安装apache [root@192 ~]# yum ...
- Mysql实现企业级数据库主从复制架构实战
场景 公司规模已经形成,用户数据已成为公司的核心命脉,一次老王一不小心把数据库文件删除,通过mysqldump备份策略恢复用了两个小时,在这两小时中,公司业务中断,损失100万,老王做出深刻反省,公司 ...
- python-02 数据类型、字符编码、文件处理
标准数据类型 Python3 中有六个标准的数据类型: Number(数字) String(字符串) List(列表) Tuple(元组) Sets(集合) Dictionary(字典) 数字 #整型 ...
- Linux----CentOS-7搭建免流服务器
本次实验采用腾讯云服务器:https://cloud.tencent.com/ 大学生身份的可以看看有没有什么活动购买 其他身份的78一个月 关于腾讯云服务器的使用可以看看腾讯云的使用手册 本博客涉及 ...