卸载:把子树清空;

安装:把自己到$1$的链改为$1$

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #define R register int
  5. #define ls (tr<<1)
  6. #define rs (tr<<1|1)
  7. using namespace std;
  8. inline int g() {
  9. R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
  10. do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
  11. } const int N=;
  12. int n,m,cnt,num;
  13. int vr[N<<],nxt[N<<],fir[N],sz[N],top[N],dfn[N],pre[N],d[N],son[N],sum[N<<],tg[N<<];
  14. inline void add(int u,int v) {vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
  15. inline void dfs1(int u) { sz[u]=; R mx=;
  16. for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
  17. if(!d[v]) {
  18. d[v]=d[u]+; dfs1(v); sz[u]+=sz[v];
  19. if(sz[v]>mx) son[u]=v,mx=sz[v];
  20. }
  21. }
  22. }
  23. inline void dfs2(int u,int tp) {
  24. top[u]=tp; dfn[u]=++num;
  25. if(son[u]) dfs2(son[u],tp);
  26. for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];
  27. if(v!=pre[u]&&v!=son[u]) dfs2(v,v);
  28. }
  29. }
  30. inline void spread(int tr,int l,int r) { if(~tg[tr]) {
  31. R md=l+r>>;
  32. tg[ls]=tg[tr],sum[ls]=(md-l+)*tg[tr];
  33. tg[rs]=tg[tr],sum[rs]=(r-md)*tg[tr]; tg[tr]=-;
  34. }
  35. }
  36. inline void update(int tr,int l,int r,int LL,int RR,int d) {
  37. if(LL<=l&&r<=RR) {tg[tr]=d,sum[tr]=(r-l+)*d; return ;} spread(tr,l,r); R md=l+r>>;
  38. if(LL<=md) update(ls,l,md,LL,RR,d); if(RR>md) update(rs,md+,r,LL,RR,d);
  39. sum[tr]=sum[ls]+sum[rs];
  40. }
  41. inline void change(int u,int inc) {
  42. while(top[u]!=) {
  43. update(,,n,dfn[top[u]],dfn[u],inc);
  44. u=pre[top[u]];
  45. } update(,,n,,dfn[u],inc);
  46. }
  47. signed main() { memset(tg,0xff,sizeof(tg));
  48. n=g(); for(R i=,u;i<=n;++i) u=g()+,add(u,i),add(i,u),pre[i]=u;
  49. d[]=,dfs1(); dfs2(,); m=g();
  50. for(R i=,x;i<=m;++i) { register char ch; while(!isalpha(ch=getchar()));
  51. R tmp=sum[]; x=g()+;
  52. if(ch=='i') change(x,),printf("%d\n",sum[]-tmp);
  53. else if(ch=='u') {
  54. update(,,n,dfn[x],dfn[x]+sz[x]-,);
  55. printf("%d\n",tmp-sum[]);
  56. }
  57. }
  58. }

2019.07.03

Luogu P2146 [NOI2015]软件包管理器 树剖的更多相关文章

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

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

  2. 【题解】Luogu P2146 [NOI2015]软件包管理器

    题面:https://www.luogu.org/problemnew/lists?name=2146 这道题要用树链剖分,我博客里有对树链剖分的详细介绍 这道题就是树链剖分的模板,详细解释见程序. ...

  3. NOI2015软件包管理器 树剖线段树

    题目: 一棵树,兹磁 1.查询根到一个点的染色点数并全染好 2.查询子树内染色点数并把颜色洗掉 树剖裸题,丝毫不虚(为什么我考试的时候碰不到这种好题呢)好像20min写完搞定 #include < ...

  4. 【luogu P2146 [NOI2015]软件包管理器】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2146 变量名真毒瘤 我真的再也不把l,left,r,right弄反了 反向思维更好做一些 #include ...

  5. 洛谷 P2146 [NOI2015]软件包管理器 解题报告

    P2146 [NOI2015]软件包管理器 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软 ...

  6. [Luogu 2146] NOI2015 软件包管理器

    [Luogu 2146] NOI2015 软件包管理器 树剖好题. 通过对题目的分析发现,这些软件构成一棵树,\(0\) 是树根. 每下载一个软件,需要下载根到这个软件的路径上的所有软件: 每卸载一个 ...

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

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

  8. 题解 P2146 [NOI2015]软件包管理器

    P2146 [NOI2015]软件包管理器 感觉代码比其他题解更简洁qwq 树链剖分模板题 install x:将1~x的路径上的节点全部变成1(安装x需要先安装1~x) uninstall x:将x ...

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

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

随机推荐

  1. ARC083E. Bichrome Tree

    A viable configuration of the given tree can be divided into two trees, each consists of vertices of ...

  2. Netty源码剖析-发送数据

    参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! 开始之前先介绍下Netty写数据的三种方式: ①:write:写到一 ...

  3. cmake 升级

    cmake 升级 1下载   cmake-3.1.0.tar.gz2.解压 3.执行  ./configure 4.执行 make 5. 执行   sudo make install 6.添加环境变量 ...

  4. 【KMP】OKR-Periods of Words

    [KMP]OKR-Periods of Words 题目描述 串是有限个小写字符的序列,特别的,一个空序列也可以是一个串.一个串P是串A的前缀,当且仅当存在串B,使得A=PB.如果P≠A并且P不是一个 ...

  5. [Lua]LuaAPI整理

    ref :https://blog.csdn.net/ouyangshima/article/details/43339571   LUA和C/C++的沟通桥梁——栈 Lua生来就是为了和C交互的,因 ...

  6. spring-boot-plus CORS跨域处理

    CORS跨域处理 CORS:Cross-Origin Resource Sharing CORS是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domai ...

  7. 通过ADB调试安卓程序

    ADB,即 Android Debug Bridge,它是Android开发/测试人员不可替代的强大工具. 1.下载ADB后,将以下四个文件放到某个文件夹下即可.因为打开Cmd默认路径是 C:\Use ...

  8. 7-MySQL DBA笔记-研发规范

    第7章 研发规范 本章将为读者解读一份研发规范.为了更好地协同工作和确保所开发的应用尽可能的稳定.高效,建立一套数据库相关的研发规范是很有必要的,虽然研发规范的确立和推广是一项很耗时的工作,但所取得的 ...

  9. 命令行发送SMTP协议邮件(163邮箱)

    这里我们用163邮箱为例子,借助命令行发送smtp邮件 1.连接服务器 在终端上输入:telnet smtp.163.com 25 回车,然后就连接了服务器的25端口,成功会输出 220 163.co ...

  10. AngularJS-03 过滤器

    过滤器 可以对输入的值按照指定的方案进行处理后再输出的函数. 1.货比过滤器currency:{{ currency_expression | currency : symbol}} 2.日期过滤器: ...