BZOJ_4196_[Noi2015]软件包管理器_树链剖分
BZOJ_4196_[Noi2015]软件包管理器_树链剖分
题意:
Linux用户和OSX用户一定对软件包管理器不会陌生。通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件包的安装所依赖的其它软件包),完成所有的配置。Debian/Ubuntu使用的apt-get,Fedora/CentOS使用的yum,以及OSX下可用的homebrew都是优秀的软件包管理器。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 100050
#define ls p<<1
#define rs p<<1|1
int head[N],to[N<<1],nxt[N<<1],cnt,n,tot,q;
int dep[N],son[N],siz[N],fa[N],idx[N],top[N];
int t[N<<2],lz[N<<2];
char ch[10];
void read(int &x){
int f=1;x=0;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){x=(x<<3)+(x<<1)+s-'0';s=getchar();}
x*=f;
}
inline void add(int u,int v){
to[++cnt]=v;nxt[cnt]=head[u];head[u]=cnt;
}
void dfs1(int x){
siz[x]=1;
for(int i=head[x];i;i=nxt[i]){
if(to[i]!=fa[x]){
fa[to[i]]=x;
dep[to[i]]=dep[x]+1;
dfs1(to[i]);
siz[x]+=siz[to[i]];
if(siz[to[i]]>siz[son[x]])son[x]=to[i];
}
}
}
void dfs2(int x,int t){
top[x]=t;idx[x]=++tot;
if(son[x])dfs2(son[x],t);
for(int i=head[x];i;i=nxt[i]){
if(to[i]!=fa[x]&&to[i]!=son[x])dfs2(to[i],to[i]);
}
}
void pud(int l,int r,int p){
if(lz[p]==0)return ;
lz[ls]=lz[p];lz[rs]=lz[p];
int mid=l+r>>1;
t[ls]=(lz[p]-1)*(mid-l+1);
t[rs]=(lz[p]-1)*(r-mid);
lz[p]=0;
}
void up(int l,int r,int x,int y,int p,bool flg){
if(x<=l&&r<=y){
lz[p]=flg+1;
t[p]=flg*(r-l+1);return ;
}
int mid=l+r>>1;
pud(l,r,p);
if(x<=mid)up(l,mid,x,y,ls,flg);
if(y>mid)up(mid+1,r,x,y,rs,flg);
t[p]=t[ls]+t[rs];
}
int query(int l,int r,int x,int y,int p,bool flg){
if(x<=l&&r<=y){
return flg?t[p]:(r-l+1-t[p]);
}
int re=0,mid=l+r>>1;
pud(l,r,p);
if(x<=mid)re+=query(l,mid,x,y,ls,flg);
if(y>mid)re+=query(mid+1,r,x,y,rs,flg);
return re;
}
int main(){
read(n);
int x;
for(int i=1;i<n;i++){
read(x);add(x+1,i+1);add(i+1,x+1);
}
dfs1(1);dfs2(1,1);
read(q);
while(q--){
scanf("%s%d",ch,&x);
x++;
if(ch[0]=='i'){
int y=1,ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]>dep[top[y]])swap(x,y);
ans+=query(1,n,idx[top[y]],idx[y],1,0);
up(1,n,idx[top[y]],idx[y],1,1);
y=fa[top[y]];
}if(dep[x]<dep[y])swap(x,y);
ans+=query(1,n,idx[y],idx[x],1,0);
up(1,n,idx[y],idx[x],1,1);
printf("%d\n",ans);
}else{
printf("%d\n",query(1,n,idx[x],idx[x]+siz[x]-1,1,1));
up(1,n,idx[x],idx[x]+siz[x]-1,1,0);
}
}
}
BZOJ_4196_[Noi2015]软件包管理器_树链剖分的更多相关文章
- [bzoj4196][Noi2015]软件包管理器_树链剖分_线段树
软件包管理器 bzoj-4196 Noi-2015 题目大意:Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件 ...
- BZOJ_4196_[NOI2015]_软件包管理器_(树链剖分)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=4196 给出一棵树,树上点权为0或1.u权值为1的条件是从根节点到u路径上的所有点权值都为1.u ...
- 【BZOJ4196】[NOI2015] 软件包管理器(树链剖分)
点此看题面 大致题意: 有\(n\)个软件包,它们的依赖关系形成一棵树.现在,问你安装或卸载一个软件包,会影响多少个软件包的安装状态. 树链剖分 这道题应该是 树链剖分 算法比较入门的题目吧. 对于安 ...
- 4196. [NOI2015]软件包管理器【树链剖分】
Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...
- 洛谷 P2146 [NOI2015]软件包管理器 (树链剖分模板题)
题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...
- BZOJ4196: [Noi2015]软件包管理器(树链剖分)
Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...
- [NOI2015]软件包管理器(树链剖分,线段树)
题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...
- [NOI2015] 软件包管理器【树链剖分+线段树区间覆盖】
Online Judge:Luogu-P2146 Label:树链剖分,线段树区间覆盖 题目大意 \(n\)个软件包(编号0~n-1),他们之间的依赖关系用一棵含\(n-1\)条边的树来描述.一共两种 ...
- 洛谷P2146 [NOI2015]软件包管理器 题解 树链剖分+线段树
题目链接:https://www.luogu.org/problem/P2146 本题涉及算法: 树链剖分: 线段树(区间更新及求和,涉及懒惰标记) 然后对于每次 install x ,需要将 x 到 ...
随机推荐
- JasperReport的安装
下载网址http://community.jaspersoft.com/community-download
- UML图中类之间的关系
类图中的关系大致一下几种 l 泛化 l 关联 l 依赖 l 组合 l 聚合 泛化 泛化是子集和超集的关系,常使用继承和实现来表示: 继承:子类到超类的实线和空心三角箭头表示 实现:子类到超类的虚线和空 ...
- 自动红眼移除算法 附c++完整代码
说起红眼算法,这个话题非常古老了. 百度百科上的描述: "红眼"一般是指在人物摄影时,当闪光灯照射到人眼的时候,瞳孔放大而产生的视网膜泛红现象. 由于红眼现象的程度是根据拍摄对象色 ...
- 如何在不使用三大地图的KEY和相关组件的情况下,直接传参数到相关的H5地图
以高德地图为例: window.location.href='http://m.amap.com/navigation/index/daddr=104.188206%2C30.858513%2C'+' ...
- postgresql to_char 问题
select create_time from xxx; select to_char(create_time,'yyyy-MM-dd HH24:mm:ss') as create_time fr ...
- Ocelot中文文档-路由
Ocelot的主要功能是接管进入的http请求并把它们转发给下游服务.目前是以另一个http请求的形式(将来可能是任何传输机制). Ocelot将路由一个请求到另一个请求描述为ReRoute.为了在O ...
- javaXML文件解析之DOM4J实操
既然前面说了DOM4J这里好那里好,大家都是在用这个,那咱就不得不写一个了. XML文件: <?xml version="1.0" encoding="UTF-8& ...
- Node六-模块化
Node实现CommonJS规范 -因此node可以使用模块化的方式组织代码结构 简单命令行加减运算 -代码 命令行执行 V8对es6的支持 -直接支持:const.模版字符串等. -严格模式支持:l ...
- 关于HTTP请求、Ajax请求,请求的同步和异步
使用了很长时间的Ajax请求了,一直都是在以异步的方式在使用.昨天听了一个讲座涉及到apache server,偶然想到了这Ajax请求和HTTP请求的一些区别和联系,就在网上好好搜了一顿,把搜到的结 ...
- [Java算法分析与设计]--单向链表(List)的实现和应用
单向链表与顺序表的区别在于单向链表的底层数据结构是节点块,而顺序表的底层数据结构是数组.节点块中除了保存该节点对应的数据之外,还保存这下一个节点的对象地址.这样整个结构就像一条链子,称之为" ...