【BZOJ4196】【Noi2015】软件包管理器
题意:
给你一棵树,有2种操作:
1.使得某个点到根节点路径上的所有点权值赋为1。
2.使得某节点的子树中所有节点权值赋为0.
每次操作要求输出权值更改的节点个数。
解题思路:
显然是用树剖来解决问题,考虑用区间赋值的线段树维护区间内1的个数,然后直接按题意树剖求解即可。
操作1的时间效率为\( O ( \log^{2} n) \) ,操作2的时间效率为\( O( \log n) \) ,总时间复杂度最坏为\( O (m \log^{2} n) \).
BZOJ上跑了5900ms,6960KB
#include <stdio.h>
#define MN 100005
#define Mn (1<<17)
#define ls (k<<1)
#define rs (k<<1|1)
#define mid (l+r>>1)
#define v edge[i].to
int mark[Mn<<],sum[Mn<<],siz[MN],dep[MN],son[MN],fa[MN],top[MN],head[MN],cnt,n,q,dfsn,l[MN],r[MN];
struct zxy{int to,nxt;}edge[MN];
inline void ins(int x,int y){edge[++cnt].to=y,edge[cnt].nxt=head[x],head[x]=cnt;}
inline int in(){
int x=,f=;char ch=getchar();
while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x*f;
}
inline void dfs1(int u,int d){
dep[u]=d,siz[u]=,son[u]=-;
for (register int i=head[u]; i; i=edge[i].nxt){
dfs1(v,d+);siz[u]+=siz[v];
if (son[u]==-||siz[v]>siz[son[u]]) son[u]=v;
}
}
inline void dfs2(int u,int tp){
top[u]=tp;l[u]=(++dfsn);if (son[u]!=-) dfs2(son[u],tp);
for (register int i=head[u]; i; i=edge[i].nxt)
if (v!=son[u]) dfs2(v,v);r[u]=dfsn;
}
inline void pushdown(int k,int l,int r){
if (mark[k]==-)return;
register int x=r-l+;mark[ls]=mark[rs]=mark[k];
sum[ls]=mark[k]*(x-(x>>));sum[rs]=mark[k]*(x>>);mark[k]=-;
}
inline void A(int l,int r,int a,int b,int k,int ad){
if (a<=l&&r<=b) {mark[k]=ad; sum[k]=(r-l+)*ad;return;}
pushdown(k,l,r);if (a<=mid) A(l,mid,a,b,ls,ad);
if (b>mid) A(mid+,r,a,b,rs,ad);sum[k]=sum[ls]+sum[rs];
}
inline int Q(int l,int r,int a,int b,int k){
if (a==l&&b==r) return sum[k];pushdown(k,l,r);
if (b<=mid) return Q(l,mid,a,b,ls);
if (mid<a) return Q(mid+,r,a,b,rs);
return Q(l,mid,a,mid,ls)+Q (mid+,r,mid+,b,rs);
}
inline int install(int x){
register int res=;
while (top[x]) res+=l[x]-l[top[x]]-Q(,n,l[top[x]],l[x],)+,A(,n,l[top[x]],l[x],,),x=fa[top[x]];
res+=l[x]-l[]+-Q(,n,l[],l[x],);A(,n,l[],l[x],,);return res;
}
inline int uninstall(int x){
register int res=Q(,n,l[x],r[x],);
A(,n,l[x],r[x],,);return res;
}
void init(){
n=in();for (register int i=; i<n; ++i) fa[i]=in(),ins(fa[i],i);
dfs1(,);dfs2(,);
}
void solve(){
for (q=in(); q--;){
register char op[];scanf("%s",op);register int x=in();
if (op[]=='i') printf("%d\n",install(x));
else printf("%d\n",uninstall(x));
}
}
int main(){init();solve();return ;}
【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软件包管理器
1.题目大意:讲道理,就是让你有两个修改一个是把一个点到根的路径上的点权值全部变成1,另一个是把一个子树全部变成0 然后让你输出每次修改,改变的哪些节点的值 2.分析:就是一个树剖,树剖是满足dfs序 ...
- bzoj4196 [Noi2015]软件包管理器——树链剖分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4196 树链剖分. 代码如下: #include<iostream> #inclu ...
随机推荐
- 《结对-HTML贪吃蛇游戏项目-测试过程》
项目托管平台地址:https://gitee.com/zhaojianhuiAA/TanChiShe/blob/master/snake.html 项目成员:赵建辉.马壮. 测试: 1.界面:用jav ...
- WORK
团队展示 队伍信息 队名:小狗队 队长:刘映华(201421122021) 队员:兰运良(201421122030).郭和水(201421122017) 团队项目描述 团队项目描述是基于之前的四则运算 ...
- python functools.lru_cache做备忘功能
import time import functools def clock(func): @functools.wraps(func)#还原被装饰函数的__name__和__doc__属性 def ...
- scrapy csvfeed spider
class CsvspiderSpider(CSVFeedSpider): name = 'csvspider' allowed_domains = ['iqianyue.com'] start_ur ...
- Network in Network
 论文要点: 用更有效的非线性函数逼近器(MLP,multilayer perceptron)代替 GLM 以增强局部模型的抽象能力.抽象能力指的模型中特征是对于同一概念的变体的不变形. 使用 gl ...
- js实现图片(高度不确定)懒加载
最近一直在弄广告页,由于广告页几乎都是图片拼凑起来的,为了减少服务器压力和带宽,采用图片懒加载方式,但是我们的图片高度又不确定,所以我在网上下载了echo.js自己改了一下. 大体思路是:让首页先加载 ...
- 新概念英语(1-113)Small Change
Lesson 113 Small Change 零钱 Listen to the tape then answer this question. Who has got some change?听录音 ...
- java中的引用类型的对象存放在哪里
根据上下文来确定.比如void func(){ Object obj = new Object();//这个obj在函数的栈里.}class Test{ private Object obj ...
- Python:使用youtube-dl+ffmpeg+FQ软件下载youtube视频
声明:本文所述内容都是从http://blog.csdn.net/u011475134/article/details/71023612博文中学习而来. 背景: 一同学想通过FQ软件下载一些youtu ...
- python常用的一些东西——sys、os等(转)
1.常用内置函数:(不用import就可以直接使用) help(obj) 在线帮助, obj可是任何类型 callable(obj) 查看一个obj是不是可以像函数一样调用 ...