传送门1
传送门2
写在前面:感冒,在家休养,已陷入动物城不能自拔
思路:真的是莫名其妙就A了……加了个lazy标记什么的而且用了一些奇怪姿势的线段树?删一个包就是对它的子树进行统计,计算有多少个已安装的子节点,安一个包就是看它到根的路径上有多少没安装过的包(其实可以一直找父亲直到有安装过的?),po主反正是闲的蛋疼乱搞了一坨,在BZOJ上跑了9s+……
注意:如果你像我一样蛋疼的话lazy标记加的时候最好小心些
代码:

#include<bits/stdc++.h>
using namespace std;
int tot,n,x,q,cnt;
int first[100010],fa[100010],son[100010],pre[100010],dep[100010],siz[100010],top[100010],L[100010],R[100010];
char ch;
struct os
{int u,v,next;
}e[200010];
struct node
{int lazy,sum;
}tree[800010];
void add(int x,int y)
{e[++tot].u=x;e[tot].v=y;e[tot].next=first[x];first[x]=tot;
}
void pushdown(int now,int l,int r)
{if (!tree[now].lazy) return;int mid=(l+r)>>1;tree[now<<1].sum=(tree[now].lazy-1)*(mid-l+1);tree[now<<1].lazy=tree[now].lazy;tree[now<<1|1].sum=(tree[now].lazy-1)*(r-mid);tree[now<<1|1].lazy=tree[now].lazy;tree[now].lazy=0;
}
void dfs1(int now)
{siz[now]=1;for (int i=first[now];i;i=e[i].next)if (e[i].v!=fa[now]){fa[e[i].v]=now;dep[e[i].v]=dep[now]+1;dfs1(e[i].v);if (siz[e[i].v]>siz[son[now]]) son[now]=e[i].v;siz[now]+=siz[e[i].v];}
}
void dfs2(int now,int tp)
{L[now]=++cnt;pre[cnt]=now;top[now]=tp;if (son[now]) dfs2(son[now],tp);for (int i=first[now];i;i=e[i].next)if (e[i].v!=son[now]&&e[i].v!=fa[now])dfs2(e[i].v,e[i].v);R[now]=cnt;
}
void update(int now,int begin,int end,int l,int r,int flag)//flag是打标记用的,可以随便搞搞
{if (l<=begin&&end<=r){tree[now].lazy=flag+1;tree[now].sum=(end-begin+1)*flag;return;}pushdown(now,begin,end);int mid=(begin+end)>>1;if (l<=mid) update(now<<1,begin,mid,l,r,flag);if (r>mid) update(now<<1|1,mid+1,end,l,r,flag);tree[now].sum=tree[now<<1].sum+tree[now<<1|1].sum;
}
int get(int now,int begin,int end,int l,int r)
{if (l<=begin&&end<=r) return tree[now].sum;pushdown(now,begin,end);int ans=0,mid=(begin+end)>>1;if (mid>=l) ans+=get(now<<1,begin,mid,l,r);if (mid<r) ans+=get(now<<1|1,mid+1,end,l,r);return ans;
}
void solve(int l,int r)
{int ans,f1=top[l],f2=top[r];ans=dep[l]-dep[r]+1;//某个点到根路径上所经过的点数就是深度之差+1while (f1!=f2){if (dep[f1]<dep[f2]) swap(f1,f2),swap(l,r);ans-=get(1,1,cnt,L[f1],L[l]);update(1,1,cnt,L[f1],L[l],1);l=fa[f1];f1=top[l];}if (dep[l]>dep[r]) swap(l,r);ans-=get(1,1,cnt,L[l],L[r]);update(1,1,cnt,L[l],L[r],1);printf("%d\n",ans);
}
main()
{scanf("%d",&n);for (int i=2;i<=n;i++)scanf("%d",&x),add(x+1,i),add(i,x+1);dfs1(1);dfs2(1,1);scanf("%d",&q);while (q--){ch=getchar();while (ch!='i'&&ch!='u') ch=getchar();while (getchar()!=' ');scanf("%d",&x);x++;if (ch=='i') solve(x,1);else{int ans=get(1,1,cnt,L[x],R[x]);printf("%d\n",ans);update(1,1,cnt,L[x],R[x],0);}}
}

【BZOJ4196】【codevs4621】软件包管理器,树链剖分练习相关推荐

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

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

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

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

  3. NOI2015 Day1 T2 软件包管理器 树链剖分

    NKOJ3423 NOI2015 软件包管理器 时间限制 : 20000 MS 空间限制 : 524288 KB 问题描述 Linux用户和OS X用户一定对软件包管理器不会陌生.通过软件包管理器,你 ...

  4. BZOJ - 4196 软件包管理器 (树链剖分+dfs序+线段树)

    题目链接 设白色结点为未安装的软件,黑色结点为已安装的软件,则: 安装软件i:输出结点i到根的路径上的白色结点的数量,并把结点i到根的路径染成黑色.复杂度$O(nlog^2n)$ 卸载软件i:输出结点 ...

  5. bzoj4196:[Noi2015]软件包管理器

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

  6. BZOJ4196: [Noi2015]软件包管理器 (好题

    好题啊,做到这题想起以前靠线段树维护子树的时候 那时候没见过链操作,搞不清树剖有什么用 这题就结合了子树操作和树链操作,也是把dfs序的in out完整用上了 树剖exp++ #include< ...

  7. 软件包管理器(树链剖分)

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

  8. 树链剖分概念及模板 + 例题 [POJ3237 tree + 软件包管理器]

    文章目录 概念 模板 例题1:软件包管理器 题目 题解 代码实现 例题2:POJ3237 tree 题目 题解 代码实现 概念 树链剖分主要是用于解决以下这两个问题. 1.更改树上点x到点y的最短路径 ...

  9. BZOJ4196:[NOI2015]软件包管理器——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4196 https://www.luogu.org/problemnew/show/P2146 你决定 ...

  10. 【树链剖分】软件管理(luogu 2146/金牌导航 树链剖分-2)

    正题 luogu 2146 金牌导航 树链剖分-2 题目大意 有若干软件,除了软件0,所有软件都依赖且只依赖于另外一个软件 当要删除一个软件时,所有依赖于该软件的软件都要删掉 当安装一个软件时,该软件 ...

最新文章

  1. mysql锁机制总结
  2. java int不将0忽略_Java微服务:蛋糕是骗人的,但您不能忽略它
  3. 【渝粤教育】电大中专建筑材料 (3)作业 题库
  4. mysql 学习笔记04 insert与update语句
  5. 火狐最实用的几款插件介绍[含附件]
  6. 一周冲刺计划2//第一天
  7. windowbuilder安装
  8. 一个STM32编译Makefile模板
  9. java基类和派生类圆_java – 当基类和派生类都具有相同名称的变量时会发生什么...
  10. JAVASCRIPT 上传文件的几种方式
  11. 一次完整的http请求过程是怎样的?
  12. (PhotoShop)如何用PS给证件照换底色(目前换底最成功的一个教程)
  13. 雷神战争中简单megetexture地图制作
  14. ABAP 新特性 - CORRESPONDING
  15. 警惕消费陷阱和霸王条款:在携程网订的机票2070元退票费1560元
  16. 【每日蓝桥】2、一三年省赛Java组真题“组素数”
  17. ESP8266-01 MQTT固件烧录并连接阿里云服务器
  18. 3DSMAX中英文对照大全(从A-Z分类)
  19. 颜值,自拍,美学三大任务简介和数据集下载
  20. Java 性能优化的七个方向

热门文章

  1. 用php写出显示客户端ip与服务器ip的代码.,PHP面试题答案
  2. 运用时间增益方法对 gprmax 模拟的探地雷达数据进行处理
  3. python form_Python中form的使用
  4. python机器学习2021年6月19日09:35:06
  5. SQL Server where语句使用举例
  6. python random模块
  7. 帮助文档的制作(控制台、eclipse两种方式)
  8. matlab icol,Matlab 图像处理相关函数命令大全
  9. 什么是静态,静态有什么作用呢?
  10. java解析csv文件写入mysql_java读取cvs文件并导入数据库