BZOJ4196——noi2015软件包管理器
1、题目大意:讲道理,就是让你有两个修改一个是把一个点到根的路径上的点权值全部变成1,另一个是把一个子树全部变成0
然后让你输出每次修改,改变的哪些节点的值
2、分析:就是一个树剖,树剖是满足dfs序的,然后我们就相当于建了一个既符合树剖,又满足dfs序的线段树,然后就在线段树上询
问就可以了
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- #define M 1000000
- struct tree_chain_parition{
- int Size[M], Top[M], Fa[M], Height[M], num[M];
- int tot, ST_tot;
- int left[M], right[M];
- int son[M], head[M], Next[M];
- int n;
- int q[M], lazy[M];
- inline void init(){
- memset(head, -1, sizeof(head));
- memset(lazy, -1, sizeof(lazy));
- tot = ST_tot = 0;
- Top[1] = 1;
- }
- inline void pushdown(int l, int r, int o){
- int mid = (l + r) / 2;
- if(lazy[o] != -1){
- q[2 * o] = (mid - l + 1) * lazy[o];
- q[2 * o + 1] = (r - mid) * lazy[o];
- lazy[2 * o] = lazy[2 * o + 1] = lazy[o];
- lazy[o] = -1;
- }
- }
- inline void add(int l, int r, int o, int x, int y, int k){
- if(x <= l && r <= y){
- q[o] = (r - l + 1) * k;
- lazy[o] = k;
- return;
- }
- pushdown(l, r, o);
- int mid = (l + r) / 2;
- if(x <= mid) add(l, mid, 2 * o, x, y, k);
- if(y > mid) add(mid + 1, r, 2 * o + 1, x, y, k);
- q[o] = q[2 * o] + q[2 * o + 1];
- }
- inline int query(int l, int r, int o, int x, int y){
- if(x <= l && r <= y){
- return q[o];
- }
- pushdown(l, r, o);
- int mid = (l + r) / 2;
- int ret = 0;
- if(x <= mid) ret += query(l, mid, 2 * o, x, y);
- if(y > mid) ret += query(mid + 1, r, 2 * o + 1, x, y);
- return ret;
- }
- inline int insert(int x, int y){
- tot ++;
- son[tot] = y;
- Next[tot] = head[x];
- head[x] = tot;
- }
- inline void dfs1(int x, int fa, int height){
- Height[x] = height;
- Fa[x] = fa;
- for(int i = head[x]; i != -1; i = Next[i]){
- dfs1(son[i], x, height + 1);
- Size[x] += Size[son[i]];
- }
- Size[x] ++;
- }
- inline void dfs2(int x, int fa){
- ST_tot ++;
- num[x] = ST_tot;
- left[x] = ST_tot;
- int o = 0, ss = 0;
- for(int i = head[x]; i != -1; i = Next[i]){
- if(Size[son[i]] > ss){
- o = i;
- ss = Size[son[i]];
- }
- }
- if(o != 0){
- Top[son[o]] = Top[x];
- dfs2(son[o], x);
- }
- for(int i = head[x]; i != -1; i = Next[i]) if(o != i){
- Top[son[i]] = son[i];
- dfs2(son[i], x);
- }
- right[x] = ST_tot;
- }
- inline int Install(int x){
- int y = 1;
- int ret = 0;
- while(Top[x] != Top[y]){
- if(Height[Top[x]] < Height[Top[y]]) swap(x, y);
- ret += (num[x] - num[Top[x]] + 1) - query(1, n, 1, num[Top[x]], num[x]);
- add(1, n, 1, num[Top[x]], num[x], 1);
- x = Fa[Top[x]];
- }
- if(Height[x] < Height[y]) swap(x, y);
- ret += (num[x] - num[y] + 1) - query(1, n, 1, num[y], num[x]);
- add(1, n, 1, num[y], num[x], 1);
- return ret;
- }
- inline int Unstall(int x){
- int ret = query(1, n, 1, left[x], right[x]);
- add(1, n, 1, left[x], right[x], 0);
- return ret;
- }
- } wt;
- int main(){
- int n;
- scanf("%d", &n);
- wt.n = n;
- wt.init();
- for(int i = 2; i <= n; i ++){
- scanf("%d", &wt.Fa[i]);
- wt.Fa[i] ++;
- wt.insert(wt.Fa[i], i);
- }
- wt.dfs1(1, -1, 1);
- wt.dfs2(1, -1);
- int m;
- scanf("%d", &m);
- char str[20];
- int x;
- for(int i = 1; i <= m; i ++){
- scanf("%s%d", str, &x);
- x ++;
- if(str[0] == 'i'){
- printf("%d\n", wt.Install(x));
- }
- else printf("%d\n", wt.Unstall(x));
- }
- return 0;
- }
BZOJ4196——noi2015软件包管理器的更多相关文章
- [UOJ#128][BZOJ4196][Noi2015]软件包管理器
[UOJ#128][BZOJ4196][Noi2015]软件包管理器 试题描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管 ...
- [BZOJ4196][NOI2015]软件包管理器(树链剖分)
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2166 Solved: 1253[Submit][Sta ...
- [BZOJ4196][NOI2015]软件包管理器
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1040 Solved: 603[Submit][Stat ...
- [bzoj4196][Noi2015]软件包管理器_树链剖分_线段树
软件包管理器 bzoj-4196 Noi-2015 题目大意:Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件 ...
- BZOJ4196[Noi2015]软件包管理器——树链剖分+线段树
题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...
- BZOJ4196 [Noi2015]软件包管理器 【树剖】
题目 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件 ...
- BZOJ4196: [Noi2015]软件包管理器(树链剖分)
Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...
- bzoj4196 [Noi2015]软件包管理器 树链剖分+线段树
先把树剖分了(又是dfs1.dfs2),然后区间求和.区间覆盖即可 难得的1A好(shui)题 ——写了那么多题,终于有一道是1A的了,加上上一次连续交了几遍A的程序,我的状态莫名好看啊233 总结: ...
- bzoj4196 [Noi2015]软件包管理器——树链剖分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4196 树链剖分. 代码如下: #include<iostream> #inclu ...
随机推荐
- JavaWeb---总结(七)HttpServletResponse对象(一)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象即然代表请求和响应,那我们 ...
- java泛型中<?>和<T>有什么区别?
public static void printColl(ArrayList<?> al){ Iterator<?> it = al.iter ...
- 对Java垃圾回收最大的误解是什么
当 我还是小孩的时候,父母常说如果你不好好学习,就只能去扫大街了.但他们不知道的是,清理垃圾实际上是很棒的一件事.可能这也是即使在Java的世界中, 同样有很多开发者对GC算法产生误解的原因--包括它 ...
- Python特殊语法:filter、map、reduce、lambda [转]
Python特殊语法:filter.map.reduce.lambda [转] python内置了一些非常有趣但非常有用的函数,充分体现了Python的语言魅力! filter(function, s ...
- 使用wp_editor函数实现可视化编辑器
在最近的wp项目中遇到了需要使用可视化编辑器来接收用户的输入,正好就研究了一下wp_editor这个函数的用法,利用这个函数能很方便的把textarea文本域变成可视化编辑器. Wp_editor函数 ...
- linux远程登录(Telnet、SSH)
系统:RHEL 5.5 64位,使用CentOS的yum源并作更新处理 参考书目<Linux兵书>/电子工业出版社/刘丽霞,细节之处稍有变动. 一.Telnet(远程登录推荐SSH) 1. ...
- Python之路【第七篇续】:I/O多路复用
回顾原生Socket 一.Socket起源: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用[打开][读写][关闭]模式来操作. socket就是该模式的 ...
- Web启动服务器上的某一个服务
情景是这样的.. 网页打开一个数据列表..数据要求实时从其他多个平台上获取.. 所以就有了一个Web页面..还有个WinService的服务来定时获取这些数据... 问题来了.. 发现Service有 ...
- SQL查询表字段的信息
如题,代码: select * from information_schema.columns where table_name = 'TableName'
- H5 使用
关闭页面 http://www.bcty365.com/content-146-3343-1.html 回退页面: plus.key.addEventListener('backbutton', fu ...