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用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过 ...
随机推荐
- Json解析封装GsonUtil
感觉Json解析都快谈不上一门技术了,在Android Studio上可以直接使用JsonFormat插件,一键就解析出Json所转换的Javabean,再配合GsonUtil的使用,Json解析的步 ...
- Spring Boot 的Maven多模块开发web项目使用外部容器进行部署
Spring Boot中自带有Tomcat容器,因此Spring Boot项目只需要运行main函数,就可以运行,但是以往的web项目,我们习惯于使用自己安装的Tomcat运行或者使用Tomcat.J ...
- django事务处理
#导包 from django.db import transaction try: #django默认是自动提交到数据库,此处设置不让其自动提交 transaction.set_autocommit ...
- 爬虫day 04_01(爬百度页面)
import urllib.request import http.cookiejar from lxml import etree head = { 'Connection': 'Keep-Aliv ...
- This package contains sshd, pcal, mysql-client on Ubuntu14:04
[How to build:]cd /home/ops/work/demo/docker/aws/ubuntutouch Dockerfiledocker build -t ubuntu_base:v ...
- video视频铺满
1. 因项目需求,要在公司官网加一段视频,达到的效果是视频平铺整个网页,大小随网页变化:网上找了许久才找了了这么一个生僻的属性,只需给video加这么个样式就可以了:object-fit: fill; ...
- iOS 视频播放方式整理
初衷 多媒体这整个系列的文章自己也准备好开始整理了,先从视频音频最简单也是最常用的播放出发慢慢的往下深究,探索到底层的编码解码等等,这篇文章就从视频的播放这个最简单的说起. iOS的视频播放方式有几种 ...
- 多线程编程学习笔记——async和await(一)
接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...
- C#真的过时了吗?
现在有一种言论:C#过时了!!! 有人说现在是BS的时代,C#开发BS网站的那一套,相对于Java.PHP来说,效率太低了! 有人说现在是移动互联网时代,C#作为微软主推的语言,无法开发移动应用成为其 ...
- poj 2446 Chessboard (二分图利用奇偶性匹配)
Chessboard Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13176 Accepted: 4118 Descr ...