bzoj 4196:[NOI2015] 软件包管理器 (树链剖分)
第一次做树剖
找同学要了模板 + 各种借鉴
先用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] 软件包管理器 (树链剖分)的更多相关文章
- BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1352 Solved: 780[Submit][Stat ...
- Bzoj 4196: [Noi2015]软件包管理器 树链剖分
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 721 Solved: 419[Submit][Statu ...
- bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2852 Solved: 1668[Submit][Sta ...
- 【BZOJ4196】[Noi2015]软件包管理器 树链剖分
[Noi2015]软件包管理器 树链剖分 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从 ...
- [BZOJ4196][NOI2015]软件包管理器(树链剖分)
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2166 Solved: 1253[Submit][Sta ...
- 洛谷 P2146 [NOI2015]软件包管理器 树链剖分
目录 题面 题目链接 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 输出样例#1: 输入样例#2: 输出样例#2: 说明 说明 思路 AC代码 总结 题面 题目链接 P ...
- 【bzoj4196】[Noi2015]软件包管理器 树链剖分+线段树
题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...
- NOI2015 软件包管理器(树链剖分+线段树)
P2146 软件包管理器 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决 ...
- BZOJ4196[Noi2015]软件包管理器——树链剖分+线段树
题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...
- bzoj4196 [Noi2015]软件包管理器——树链剖分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4196 树链剖分. 代码如下: #include<iostream> #inclu ...
随机推荐
- cat基础用法
Linux中的cat命令连接文件并打印到标准输出设备上(通常是shell).cat的最常见用法之一是显示文件,还可以即时创建文件,并可以直接在终端上进行基本编辑. 创建文件 使用cat命令创建文件,请 ...
- linux centos7环境下安装apache2.4+php5.6+mysql5.6 安装及踩坑集锦(三)
linux centos7环境下安装apache2.4+php5.6+mysql5.6 安装及踩坑集锦(三) 安装PHP 1.yum方式安装PHP方法同安装apache一样传送门:linux cent ...
- JavaScript 15 Ajax异步登陆
/** * Created by KING on 2017/11/28. */ var g_xhr_ui;var g_xhr_login;var g_id; $(document).ready(fun ...
- ECMAScript基本语法——⑤运算符 算数运算符
+-*/%
- 你不知道的JavaScript下卷
阿喀琉斯之踵 学习编程最好的办法就是编写代码 比较 隐式类型转换 数字和字符串 比较 字符串会隐式转换为数字,再进行比较 == 类型转换 ecma
- UnicodeDecodeError: 'gbk' codec can't decode byte 0xfe in position 45: illegal multibyte sequence
常见的一种解码错误如题目所示,下面介绍该错误的解决方法 (1).首先在打开文本的时候,设置其编码格式,如:open(‘1.txt’, encoding=’gbk’): (2).若(1)不能解决,可能是 ...
- 洛谷P1219 八皇后 我。。。。。。
代码1 (学弟版) #include<bits/stdc++.h>using namespace std;int l[15];bool s[15]; ...
- 网页出现横向滚动条的原因可能是使用bootstrap不当引起
Bootstrap的栅格布局超级方便我们写网页.但是在不是全体配合使用的情况下,会出现横向滚动条的现象. 什么叫不是配合使用的情况呢? >>一种情况是:你使用了row作为你的第一层父元素: ...
- 安卓开发中遇到java.net.SocketException: Permission denied
仅需在AndroidManifest.xml添加 <uses-permission android:name="android.permission.INTERNET" /& ...
- 野路子码农(5)Python中的装饰器,可能是最通俗的解说
装饰器这个名词一听就充满了高级感,而且很多情况下确实也不常用.但装饰器有装饰器的好处,至少了解这个对装逼还是颇有益处的.网上有很多关于装饰器的解说,但通常都太过“循序渐进”,有的还会讲一些“闭包”之类 ...