大概算是一道模板题吧?

就是细节有点多

罗列一下:

  1. 如果习惯从1开始搞树的编号的话,处理输入进来的那个依赖关系在加边的时候两个都要+1,体现在代码就是i要从2枚举到n,然后输入进来的那个数要+1
  2. 这道题的线段树的打法也有所不同,因为只有两种状态,也就是已安装和未安装,我这里是用1和0来表示的,所以lazy标记就不能打成0了,我的代码中是用-1来表示的,注意要判这个东西(当然你也可以用1和2表示这两种状态)
  3. 线段树的修改也要改一下,+=得改成=(显然?)

这些细节都处理好后就是一个树剖模板了

#include <cstdio>
#include <cstring>
#define ll int
#define inf 1<<30
#define il inline
il ll max(ll x,ll y){return x>y?x:y;}
il ll min(ll x,ll y){return x<y?x:y;}
il ll abs(ll x){return x>?x:-x;}
il void swap(ll &x,ll &y){ll t=x;x=y;y=t;}
il void read(ll &x){
x=;ll f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-f;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
x*=f;
}
il void print(ll x){if(x<)putchar('-');x=abs(x);if(x>)print(x/);putchar(x%+'');}
il void writeln(ll x){if(x<)putchar('-');x=abs(x);print(x);putchar('\n');}
il void write(ll x){if(x<)putchar('-');x=abs(x);print(x);putchar(' ');}
using namespace std;
/*===================Header Template=====================*/
#define N 100010
struct edge{ll to,next;}e[N<<];
struct tree{ll l,r,sum,lazy;}t[N<<];
ll cnt,head[N],sz,n,m,a[N];
ll pos[N],fa[N],dep[N],siz[N],top[N];
void insert(ll u,ll v){
e[++cnt].next=head[u];e[cnt].to=v;head[u]=cnt;
e[++cnt].next=head[v];e[cnt].to=u;head[v]=cnt;
}
void dfs1(ll x){
siz[x]=;
for(ll i=head[x];i;i=e[i].next){
if(fa[x]==e[i].to)continue;
dep[e[i].to]=dep[x]+;
fa[e[i].to]=x;
dfs1(e[i].to);
siz[x]+=siz[e[i].to];
}
}
void dfs2(ll x,ll topf){
ll k=;
pos[x]=++sz;
top[x]=topf;
for(ll i=head[x];i;i=e[i].next){
if(dep[e[i].to]>dep[x]&&siz[e[i].to]>siz[k])
k=e[i].to;
}
if(k==)return;
dfs2(k,topf);
for(ll i=head[x];i;i=e[i].next){
if(dep[e[i].to]>dep[x]&&k!=e[i].to){
dfs2(e[i].to,e[i].to);
}
}
}
void pushdown(ll ln,ll rn,ll rt){
if(t[rt].lazy!=-){
ll &x=t[rt].lazy;
t[rt<<].sum=ln*x;
t[rt<<|].sum=rn*x;
t[rt<<].lazy=x;
t[rt<<|].lazy=x;
x=-;
}
}
void build(ll l,ll r,ll rt){
t[rt].l=l;t[rt].r=r;t[rt].lazy=-;
if(l==r)return;
ll mid=(l+r)>>;
build(l,mid,rt<<);
build(mid+,r,rt<<|);
}
void upd(ll L,ll R,ll c,ll rt){
ll l=t[rt].l,r=t[rt].r,mid=(l+r)>>;
if(L<=l&&r<=R){t[rt].sum=(r-l+)*c;t[rt].lazy=c;return;}
pushdown(mid-l+,r-mid,rt);
if(L<=mid)upd(L,R,c,rt<<);
if(R>mid)upd(L,R,c,rt<<|);
t[rt].sum=t[rt<<].sum+t[rt<<|].sum;
}
ll query(ll L,ll R,ll rt){
ll l=t[rt].l,r=t[rt].r,mid=(l+r)>>,ans=;
if(L<=l&&r<=R)return t[rt].sum;
pushdown(mid-l+,r-mid,rt);
if(L<=mid)ans+=query(L,R,rt<<);
if(R>mid)ans+=query(L,R,rt<<|);
return ans;
}
void A(ll x,ll y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
upd(pos[top[x]],pos[x],,);
x=fa[top[x]];
}
if(pos[x]>pos[y])swap(x,y);
upd(pos[x],pos[y],,);
}
ll Q(ll x,ll y){
ll sum=;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
sum+=query(pos[top[x]],pos[x],);
x=fa[top[x]];
}
if(pos[x]>pos[y])swap(x,y);
sum+=query(pos[x],pos[y],);
return sum;
}
int main(){
read(n);
for(ll i=;i<=n;i++){
ll x;read(x);x++;
insert(i,x);
}
dfs1();dfs2(,);
build(,n,);
upd(,n,,);
read(m);
while(m--){
char ch[];ll x;
scanf("%s%d",ch,&x);x++;
if(ch[]=='i'){writeln(Q(x,));A(x,);}
if(ch[]=='u'){
writeln(siz[x]-query(pos[x],pos[x]+siz[x]-,));
upd(pos[x],pos[x]+siz[x]-,,);
}
}
return ;
}

转载请注明出处:https://www.cnblogs.com/henry-1202/p/9152370.html

[bzoj 4196][NOI 2015]软件包管理器的更多相关文章

  1. [NOI 2015]软件包管理器

    Description Linux用户和OSX用户一定对软件包管理器不会陌生. 通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖 ...

  2. bzoj 4196:[NOI2015] 软件包管理器 (树链剖分)

    第一次做树剖 找同学要了模板 + 各种借鉴 先用dfs在划分轻重链并编号, install的时候就从查询的节点到根寻找标记的点有多少个,再用深度减去标记的点的个数,并把路径上所有点都标记 uninst ...

  3. BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1352  Solved: 780[Submit][Stat ...

  4. Bzoj 4196: [Noi2015]软件包管理器 树链剖分

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 721  Solved: 419[Submit][Statu ...

  5. bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2852  Solved: 1668[Submit][Sta ...

  6. bzoj 4196: [Noi2015]软件包管理器

    Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...

  7. 【刷题】BZOJ 4196 [Noi2015]软件包管理器

    Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...

  8. 软件包管理器(bzoj 4196)

    Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...

  9. 4196. [NOI2015]软件包管理器【树链剖分】

    Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...

随机推荐

  1. 使用.NET向webService传double、int、DateTime 服务器得到的数据时null的问题(转http://blog.csdn.net/slimboy123/article/details/4366701)

    用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int类型.double和D ...

  2. sitecore系列教程之如何以编程方式将访客数据关联到联系人卡片

      在我之前关于Sitecore体验资料的帖子中,我们看到了我们如何了解访问者的一切,包括访问他们在访问期间触发的事件.在这篇博客文章中,我将引导您完成识别匿名用户并将用户访问与联系人记录联系起来的过 ...

  3. 解释器模式 Interpreter

    代码例子 参考 1.解释器模式定义 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 说明:解释器模式设计到文法规则和抽象语法树. 2.解释器模式的结构 ...

  4. django的母板和继承

    Django模板中只需要记两种特殊符号: {{  }}和 {% %} {{ }}表示变量,在模板渲染的时候替换成值,{% %}表示逻辑相关的操作. 母板 <!DOCTYPE html> & ...

  5. Xfire基础

    XFire 是与Axis 2并列的新一代Web Service框架,通过提供简单的API支持Web Service各项标准协议,能够快速地开发Web Service应用.和其他Web服务引擎相比,XF ...

  6. spring 线程安全

    http://www.cnblogs.com/doit8791/p/4093808.html 写的真的好

  7. createDocumentFragment()用法总结

    1.createDocumentFragment()方法,是用来创建一个虚拟的节点对象,或者说,是用来创建文档碎片节点.它可以包含各种类型的节点,在创建之初是空的. 2.DocumentFragmen ...

  8. GUI颜色、字体设置对话框

    %颜色设置对话框 uisetcolor %c 红色 c=uisetcolor %默认规定颜色 c=uisetcolor([ ]); %设置曲线颜色 h = plot([:]); c = uisetco ...

  9. [转载] mysql 索引中的USING BTREE 的意义

    索引是在存储引擎中实现的,因此每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型. 根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总 ...

  10. linux学习---ps、kill

    一.ps       查看进程 ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的:如果想对进程时间监控,应该用 top 工具 linux上进程有5种状态: 1. 运行(正在运行或 ...