第一次做树剖

找同学要了模板 + 各种借鉴

先用dfs在划分轻重链并编号, install的时候就从查询的节点到根寻找标记的点有多少个,再用深度减去标记的点的个数,并把路径上所有点都标记

uninstall就是搜索查询的点的子树的标记个数,并取消所有的标记。

代码如下

 /**************************************************************
Problem: 4196
Language: C++
Result: Accepted
Time:8312 ms
Memory:7416 kb
****************************************************************/ #include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
#define g(l, r) (l + r | l != r)
#define o g(l, r)
#define ls g(l, mid)
#define rs g(mid + 1, r)
const int N = ; int n, dep[N], fa[N], hs[N], size[N], top[N], pos[N], mark[N<<], sum[N<<], tot, L, R, m;
vector < int > edge[N]; inline void dfs1(int u, int d, int f){
dep[u] = d; fa[u] = f; hs[u] = -; size[u] = ;
int tmp = ;
for (int i = ; i < edge[u].size(); i++){
int &v = edge[u][i];
dfs1(v, d + , u);
if (size[v] > tmp)
hs[u] = v, tmp = size[v];
size[u] += size[v];
}
} inline void dfs2(int u, int T){
top[u] = T; pos[u] = ++tot;
if (hs[u] == -) return ;
dfs2(hs[u], T);
for (int i = ; i < edge[u].size(); i++){
int &v = edge[u][i];
if (hs[u] == v) continue;
dfs2(v, v);
}
} inline void push(int l, int r) {
if (mark[o] == -) return;
int mid = l + r >> ;
if (l < r) {
mark[ls] = mark[o];
sum[ls] = mark[o] * (mid - l + );
mark[rs] = mark[o];
sum[rs] = mark[o] * (r - (mid + ) + );
}
mark[o] = -;
} void modify(int l, int r){
if (L <= l && r <= R){
sum[o] = m * (r - l + );
mark[o] = m;
return ;
}
push(l, r);
int mid = l + r >> ;
if (L <= mid) modify(l, mid);
if (R >= mid + ) modify(mid + , r);
sum[o] = sum[ls] + sum[rs];
} int getSum(int l, int r){
if (L <= l && r <= R){
return sum[o];
}
push(l, r);
int mid = l + r >> , ans = ;
if (L <= mid) ans += getSum(l, mid);
if (R >= mid + ) ans += getSum(mid + , r);
return ans;
} inline void install(int u){
int f = top[u], ans = dep[u];
m = ;
while(f){
L = pos[f], R = pos[u];
ans -= getSum(, tot);
modify(, tot);
u = fa[f]; f = top[u];
}
L = pos[f], R = pos[u];
ans -= getSum(, tot);
modify(, tot);
printf("%d\n", ans);
} inline void uninstall(int u){
L = pos[u], R = pos[u] + size[u] - , m = ;
int ans = getSum(, tot);
modify(, tot);
printf("%d\n", ans);
} int main(){
scanf("%d", &n);
for (int i = ; i < n; i++){
int x; scanf("%d", &x);
edge[x].push_back(i);
}
dfs1(, , -); dfs2(, );
int q;
scanf("%d", &q);
memset(mark, 0xff, sizeof(mark));
while(q--){
char str[]; int x;
scanf("%s%d", str, &x);
if (*str == 'i') install(x);
else uninstall(x);
}
return ;
}

bzoj 4196:[NOI2015] 软件包管理器 (树链剖分)的更多相关文章

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

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

  2. Bzoj 4196: [Noi2015]软件包管理器 树链剖分

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 721  Solved: 419[Submit][Statu ...

  3. bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)

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

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

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

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

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

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

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

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

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

  8. NOI2015 软件包管理器(树链剖分+线段树)

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

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

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

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

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

随机推荐

  1. centos7安装显示中文

    系统通过环境变量LANG设置语言格式编码 查看当前语言环境 echo $LANG 查看是否安装中文语言,Linux中通过locale来设置程序运行的不同语言环境 locale -a | grep 'z ...

  2. FirstJavaWeb

    (未完成)出错有点多,Tomcat的配置也出问题了,Tomcat突然找不到jdk了,好像是我之前下载过一回然后没卸干净有残留文件,还有连接数据库的代码也有问题.       <%@page im ...

  3. python复习基础题目

    第一部分 必答题(每题2分) 简述列举了解的编程语言及语言间的区别? 编译型语言:一次性全部编译成二进制码,再去执行 解释性语言:编译一句,运行一句 python 解释型,简洁高效,容易上手 Java ...

  4. linux常见目录介绍

    /bin:/usr/bin: 可执行二进制文件目录,如常用命令ls.cat /boot: 放置linux启动时用到的一些文件,建议分区的时候独立分区 /dev: 存在linux系统下的设备文件,访问该 ...

  5. OpenCV3.2.0+VS2015开发环境配置

    vs2015安装可参考:https://www.jianshu.com/p/391e67529bd3 OpenCV3.2.0配置可参考:https://www.jianshu.com/p/026093 ...

  6. webservice后台起调试

    https://blog.csdn.net/smile00_0/article/details/72763114

  7. a标签绑定事件

    <a href="javascript:void(0);" onclick="js_method()"></a> 这种方法是很多网站最常 ...

  8. Java 11 新垃圾回收器 ZGC

    可伸缩.低延迟的垃圾回收器 GC 暂停时间不超过 10ms 堆管理容量范围(小M级别,大到T级别) 对应用吞吐量影响不超过15%(对比 G1) 为进一步的添加新特性和优化做基础 默认支持 Linux/ ...

  9. laravel多条件模糊查询

    1.运用cmd在项目根目录下创建路由组 php artisan make:controller queryController --resource 1.1数据库信息(student) CREATE ...

  10. mysql5.6创建账户不能本地登录

    1.通过xshell连接linux,命令登录mysql 2.创建一个新的库(其实创建不创建都可以) 3.创建账号权限 创建账号luffy 密码luffy 针对库luffy所有权限,允许任何人远程登录 ...