题目: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. 【dp】D. Caesar's Legions

    https://www.bnuoj.com/v3/contest_show.php?cid=9146#problem/D [题意]给定n1个A,n2个B,排成一排,要求A最多能连续k1个紧挨着,B最多 ...

  2. 【贪心+前缀】C. Fountains

    http://codeforces.com/contest/799/problem/C [题意] 有n做花园,有人有c个硬币,d个钻石 (2 ≤ n ≤ 100 000, 0 ≤ c, d ≤ 100 ...

  3. Tsinghua OJ Zuma

    Description Let's play the game Zuma! There are a sequence of beads on a track at the right beginnin ...

  4. codevs——1269 匈牙利游戏

    1269 匈牙利游戏 2012年CCC加拿大高中生信息学奥赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Descript ...

  5. loj6158 A+B Problem (扩展KMP)

    题目: https://loj.ac/problem/6158 分析: 先把S串逆置,就是从低位向高位看 我们再弄个T串,S串前面有x个连续的0,那么T串前面也有x个连续的0 第x+1位,满足S[x+ ...

  6. ArrayList源码分析超详细(转载)

    ArrayList源码分析超详细   ArrayList源码分析超详解 想要分析下源码是件好事,但是如何去进行分析呢?以我的例子来说,我进行源码分析的过程如下几步: 找到类:利用 IDEA 找到所需要 ...

  7. 通过继承Thread类来创建多线程 关键词 start

    // 代码 public class MyThread extends Thread { public void run(){ for(int i=0;i<10;i++){ try { Thre ...

  8. Working with Validators and Messages in AngularJS

    原文:http://odetocode.com/blogs/scott/archive/2014/10/16/working-with-validators-and-messages-in-angul ...

  9. OSX: 第三方部署Profile的方法和比較

    眼下至少有三个第三方部署Profile的方法. 一个Profile Handler, 是利用Launchd对制定文件夹改变而激活的机制,把须要的profiles文件斗存放在制定目标机器的文件夹内,系统 ...

  10. Robot Framework操作

    Robot Framework 介绍 RobotFramework是一款基于python的开源自动化测试框架,遵守Apache License 2.0协议,在此协议下所有人都可以免费开发和使用.因为R ...