题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4196

树链剖分。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int const maxn=1e5+;
int n,m,fa[maxn],dfn[maxn],end[maxn],top[maxn],to[maxn],siz[maxn],head[maxn],ct,tim;
struct N{
int to,next;
N(int t=,int n=):to(t),next(n) {}
}edge[maxn];
struct T{int sum,siz; bool f[];}t[maxn<<];
int rd()
{
int ret=;char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return ret;
}
void dfs(int x)
{
siz[x]=;
for(int i=head[x],u;i;i=edge[i].next)
{
dfs(u=edge[i].to);
if(siz[u]>siz[to[x]])to[x]=u;
siz[x]+=siz[u];
}
}
void dfs2(int x)
{
dfn[x]=++tim;//不在dfs
if(to[x])top[to[x]]=top[x],dfs2(to[x]);
for(int i=head[x],u;i;i=edge[i].next)
{
if((u=edge[i].to)==to[x])continue;
top[u]=u; dfs2(u);
}
end[x]=tim;
}
void pushup(int x)
{
int ls=(x<<),rs=(x<<|);
t[x].siz=t[ls].siz+t[rs].siz;
t[x].sum=t[ls].sum+t[rs].sum;
}
void pushdown(int x)
{
if(!t[x].f[]&&!t[x].f[])return;
int ls=(x<<),rs=(x<<|);
for(int i=;i<=;i++)
if(t[x].f[i])
{
t[x].f[i]=; t[ls].f[i]=; t[rs].f[i]=;
t[ls].f[!i]=; t[rs].f[!i]=;
t[ls].sum=t[ls].siz*i; t[rs].sum=t[rs].siz*i;
}
}
void build(int x,int l,int r)
{
if(l==r){t[x].siz=;return;}
int mid=((l+r)>>);
build(x<<,l,mid); build(x<<|,mid+,r);
pushup(x);
}
int query(int x,int l,int r,int L,int R,int val)
{
if(l>=L&&r<=R)
{
if(val)return t[x].sum;
else return t[x].siz-t[x].sum;
}
int mid=((l+r)>>),ret=;
pushdown(x);
if(mid>=L)ret+=query(x<<,l,mid,L,R,val);
if(mid<R)ret+=query(x<<|,mid+,r,L,R,val);
return ret;
}
void update(int x,int l,int r,int L,int R,int val)
{
if(l>=L&&r<=R)
{
t[x].f[val]=; t[x].f[!val]=;
t[x].sum=t[x].siz*val; return;
}
int mid=((l+r)>>);
if(mid>=L)update(x<<,l,mid,L,R,val);
if(mid<R)update(x<<|,mid+,r,L,R,val);
pushup(x);
}
int ask(int x)
{
int ret=;
while(x)
{
int l=dfn[top[x]],r=dfn[x];
ret+=query(,,n,l,r,);
update(,,n,l,r,);
x=fa[top[x]];
}
return ret;
}
int main()
{
n=rd();
for(int i=;i<=n;i++)
{
fa[i]=rd()+;
edge[++ct]=N(i,head[fa[i]]);head[fa[i]]=ct;
}
dfs(); top[]=; dfs2(); build(,,n);
m=rd(); char ch[];
for(int i=,x;i<=m;i++)
{
scanf("%s",&ch); x=rd()+;
if(ch[]=='u')
{
printf("%d\n",query(,,n,dfn[x],end[x],));
update(,,n,dfn[x],end[x],);
}
if(ch[]=='i')
{
printf("%d\n",ask(x));
}
}
return ;
}

bzoj4196 [Noi2015]软件包管理器——树链剖分的更多相关文章

  1. [BZOJ4196][NOI2015]软件包管理器(树链剖分)

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

  2. BZOJ4196[Noi2015]软件包管理器——树链剖分+线段树

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

  3. [Bzoj4196] [NOI2015] 软件包管理器 [树链剖分,线段树]

    题解摘要:树链剖分后用线段树区间查询修改,对于安装软件,将改点到根的路径全部变为1,对于卸载软件,将子树清空.注意边界,编号是从0开始的,容易漏掉树根. 第一次写树剖- #include <io ...

  4. bzoj4196 [Noi2015]软件包管理器 树链剖分+线段树

    先把树剖分了(又是dfs1.dfs2),然后区间求和.区间覆盖即可 难得的1A好(shui)题 ——写了那么多题,终于有一道是1A的了,加上上一次连续交了几遍A的程序,我的状态莫名好看啊233 总结: ...

  5. 【BZOJ4196】[Noi2015]软件包管理器 树链剖分

    [Noi2015]软件包管理器 树链剖分 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从 ...

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

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

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

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

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

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

  9. 洛谷 P2146 [NOI2015]软件包管理器 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 输出样例#1: 输入样例#2: 输出样例#2: 说明 说明 思路 AC代码 总结 题面 题目链接 P ...

随机推荐

  1. NYOJ90-整数划分,经典递归思想~~

    整数划分 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 将正整数n表示成一系列正整数之和:n=n1+n2+-+nk,  其中n1≥n2≥-≥nk≥1,k≥1.  正整数 ...

  2. [luoguP1168]中位数(主席树+离散化)

    传送门 模板题一道,1A. ——代码 #include <cstdio> #include <algorithm> #define ls son[now][0], l, mid ...

  3. Android Application基本组成部分

    Android Application基本组成部分 四个核心的组件 Activity活动,主要用于前台和用户交互,即UI,Activity只是加载一个View而并非一个UI对象 Service服务,主 ...

  4. linux 开机启动脚本或者服务

    https://blog.csdn.net/zhuchunyan_aijia/article/details/53811368

  5. Spring基于Java的配置

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/java-based-configuration.html: 基于Java的配置选项,可以使你在不用 ...

  6. Java的finally语句在try或catch中的return语句执行之后还是之前?

    import java.util.HashMap; import java.util.Map; public class FinallyDemo1 { public static void main( ...

  7. IPTABLES基本例子

    iptables –F #删除已经存在的规则 iptables -P INPUT DROP #配置默认的拒绝规则.基本规则是:先拒绝所有的服务,然后根据需要再添加新的规则. iptables -A I ...

  8. 【Nginx】Hello world程序

    模块如何在运行中生效 配置文件中的location块决定了匹配某种URL的请求将会由相应的HTTP模块处理,因此,运行时HTTP框架会在接收完毕HTTP请求的头部后,将请求的URL与配置文件中的所有l ...

  9. DRBD+Heratbeat+NFS高可用文件共享存储

    一.概述 .通过ha-log日志可以看出主释放资源,备接管资源. 来自为知笔记(Wiz)

  10. Registration system

    Registration system 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 A new e-mail service "Berlandesk&q ...