题目: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. python去掉BOM头的方法

    今天在写批量生成身份证号造数据的时候出现了问题,其中一个是报不能转成int型,后经查找,发现是utf-8BOM头的问题. 什么是BOM? 在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示 ...

  2. HDU1711 最基础的kmp算法

    Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], .... ...

  3. 前端接收到的json的属性的首字母会自动变成小写,解决办法如下

    使用的json包是alibaba.fastjson. 把TypeUtils.compatibleWithJavaBean = true; 如图位置:

  4. Gearman 初窥【转载】

    Gearman是一个分发任务的程序框架,可以用在各种场合,与Hadoop相 比,Gearman更偏向于任务分发功能.它的任务分布非常简单,简单得可以只需要用脚本即可完成.Gearman最初用于Live ...

  5. js命名

    JS变量名前加 _ 与 $ 的区别: 下划线一般当做私有属性, 业界会比较常用$开头作为框架.库的关键词前缀,目的是避免命名冲突

  6. [Bzoj4832][Lydsy2017年4月月赛]抵制克苏恩 (期望dp)

    4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 673  Solved: 261[Submit][ ...

  7. datasnap中间件如何控制长连接的客户端连接?

    ActiveConnections: TClientDataSet; ... 有客户端连接上来的时候 procedure TForm8.DSServer1Connect(DSConnectEventO ...

  8. History(历史)命令用法 15 例

    如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率.本文将通过实例的方式向你介绍 history 命令的 15 个用法. 使用 HISTTIMEFORMAT ...

  9. Codeforces div.2 B. The Child and Set

    题目例如以下: B. The Child and Set time limit per test 1 second memory limit per test 256 megabytes input ...

  10. Codeforces 344B Simple Molecules

    #include<bits/stdc++.h> using namespace std; int main() { int a,b,c; scanf("%d%d%d", ...