裸的树链剖分。

对于安装 查询和维护到根路径

对于卸载 查询和维护子树信息

一开始线段树add[]标记要全赋值为-1


 #include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std; typedef long long LL; #define N 200010 int id;
int fa[N],siz[N],top[N],son[N];
int pos[N],r[N];
LL sum[N<<],add[N<<]; struct Node
{
int to,next;
}e[N];
int head[N];
int cnt; int a; char s; int n,q; int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} void link(int x,int y)
{
e[++cnt]=(Node){y,head[x]};
head[x]=cnt;
} void dfs(int x)
{
siz[x]=;
for (int i=head[x],mx=;i;i=e[i].next)
if (e[i].to!=fa[x])
{
fa[e[i].to]=x;
dfs(e[i].to);
siz[x]+=siz[e[i].to];
if (siz[e[i].to]>mx)
mx=siz[e[i].to],son[x]=e[i].to;
}
} void dfs2(int x,int cha)
{
top[x]=cha;
pos[x]=++id;
if (son[x])
dfs2(son[x],cha);
for (int i=head[x];i;i=e[i].next)
if(e[i].to!=fa[x] && e[i].to!=son[x])
dfs2(e[i].to,e[i].to);
r[x]=id;
} void pushup(int now)
{
sum[now]=sum[now<<]+sum[now<<|];
} void pushdown(int nowl,int nowr,int now,int mid)
{
if (add[now]!=-)
{
LL t=add[now];
add[now]=-;
add[now<<]=t;
add[now<<|]=t;
sum[now<<]=t*(mid-nowl+);
sum[now<<|]=t*(nowr-mid);
}
} void update(int nowl,int nowr,int now,int s,int t,LL d)
{
if (nowl>=s && nowr<=t)
{
add[now]=d;
sum[now]=(nowr-nowl+)*d;
return ;
}
int mid=(nowl+nowr)>>;
pushdown(nowl,nowr,now,mid);
if (s<=mid)
update(nowl,mid,now<<,s,t,d);
if (t>mid)
update(mid+,nowr,now<<|,s,t,d);
pushup(now);
} int query(int nowl,int nowr,int now,int s,int t)
{
if (nowl>=s && nowr<=t)
return sum[now];
int mid=(nowl+nowr)>>;
int ans=;
pushdown(nowl,nowr,now,mid);
if (s<=mid)
ans+=query(nowl,mid,now<<,s,t);
if (t>mid)
ans+=query(mid+,nowr,now<<|,s,t);
return ans;
} int work1(int x)
{
int ans,res=;
while (x)
{
ans=query(,n,,pos[top[x]],pos[x]);
res+=pos[x]-pos[top[x]]+-ans;
update(,n,,pos[top[x]],pos[x],);
if (ans)
break;
x=fa[top[x]];
}
return res;
} int work2(int x)
{
int res;
res=query(,n,,pos[x],r[x]);
update(,n,,pos[x],r[x],);
return res;
} int main()
{
n=read();
for (int i=;i<n;i++)
{
a=read();
link(a+,i+);
}
dfs();
dfs2(,);
memset(add,-,sizeof(add));
q=read();
while (q--)
{
scanf("%c",&s);
a=read();
if (s=='i')
printf("%d\n",work1(a+));
else
printf("%d\n",work2(a+));
}
return ;
}

【bzoj4196】[Noi2015]软件包管理器的更多相关文章

  1. [UOJ#128][BZOJ4196][Noi2015]软件包管理器

    [UOJ#128][BZOJ4196][Noi2015]软件包管理器 试题描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管 ...

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

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

  3. [BZOJ4196][NOI2015]软件包管理器

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

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

    软件包管理器 bzoj-4196 Noi-2015 题目大意:Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件 ...

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

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

  6. BZOJ4196 [Noi2015]软件包管理器 【树剖】

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

  7. BZOJ4196: [Noi2015]软件包管理器(树链剖分)

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

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

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

  9. BZOJ4196——noi2015软件包管理器

    1.题目大意:讲道理,就是让你有两个修改一个是把一个点到根的路径上的点权值全部变成1,另一个是把一个子树全部变成0 然后让你输出每次修改,改变的哪些节点的值 2.分析:就是一个树剖,树剖是满足dfs序 ...

  10. bzoj4196 [Noi2015]软件包管理器——树链剖分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4196 树链剖分. 代码如下: #include<iostream> #inclu ...

随机推荐

  1. bash基础——管道符、通配符

    1.多命令顺序执行 多命令顺序执行 格式 作用 ; 命令1 ; 命令2 多个命令之间没有任何逻辑联系 && 命令1&&命令2 逻辑与 当命令1正确执行,则命令2才会执行 ...

  2. 第1节 yarn:13、yarn资源调度的介绍

    Yarn资源调度 yarn集群的监控管理界面: http://192.168.52.100:8088/cluster jobHistoryServer查看界面: http://192.168.52.1 ...

  3. C# 使用MongoDB(学习记录)

    1)下载MongoDB https://www.mongodb.com/download-center#community 2)在D盘新建Data->db 3)执行命令 mongod --dbp ...

  4. jsMap地图网点

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name=& ...

  5. P2347 砝码称重(动态规划递推,背包,洛谷)

    题目链接:P2347 砝码称重 参考题解:点击进入 纪念我第一道没理解题意的题 ''但不包括一个砝码也不用的情况'',这句话我看成了每个砝码起码放一个 然后就做不出来了 思路: 1.这题数据很小,10 ...

  6. 零基础入门学习Python(15)--格式化

    前言 上节课我们介绍了字符串N多种奇葩方法的用法,但是我们唯独漏掉了format方法,那为何不把format方法和上节课的内容一起讲呢? 因为小甲鱼觉得format方法,跟今天的主题是如出一辙的,都是 ...

  7. mysql、MariaDB的简单操作

    mysql的简单操作 一.查看数据库 SHOW DATABASES; 例如: MariaDB [(none)]> show databases; +--------------------+ | ...

  8. MySQL-----删

    删 **清空数据库内容** delete from 数据库表名; ----清内容,但是自增列的数不清. truncate table 数据库表名; --------自增列的数也清. **清除指定的行数 ...

  9. MyBatis 多参问题

    当传入的参数为多个参数时 1 可以不封装为Javabean直接传入,写法如下 public List<XXXBean> getXXXBeanList(String xxId, String ...

  10. <git>……git的基本使用……//

    1.切换到存放git版本库的地方 2.Git clone url(github上的地址) 3.设置全局用户(输入一次即可) git config --global user.name github上的 ...