【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 ...
随机推荐
- alpha-咸鱼冲刺day1
一,合照 emmmmm.自然是没有的. 二,项目燃尽图 三,项目进展 登陆界面随意写了一下.(明天用来做测试的) 把学姐给我的模板改成了自家的个人主页界面,侧边栏啥的都弄出来了(快撒花花!) 四,问题 ...
- 咬碎STL空间配置器
STL空间配置器 一.开场白: 给我的感觉就是,了解是空间配置器的功能,是那么的明了:在看原理,我还是很开心:接下来是360度大转变: 那么长的变量或者函数命名.那么多的宏.不爽,不过,遇上我这种二货 ...
- Scrum 冲刺 第二日
Scrum 冲刺 第二日 目录 要求 项目链接 燃尽图 问题 今日任务 明日计划 成员贡献量 要求 各个成员今日完成的任务(如果完成的任务为开发或测试任务,需给出对应的Github代码签入记录截图:如 ...
- Mysql-5.7.21安装配置
搞开发多年,其实MySql前前后后安装配置了无数次,但是每次都需要到网上搜教程,折腾半天才搞定,这次索性把整个过程全部记录下来,以便以后查阅. 下载 到MySql官网,导航找到DOWNLOADS> ...
- JAVA_SE基础——61.字符串入门
public class Demo1 { public static void main(String[] args) { String str1 = "hello"; Strin ...
- Linux的打印rpm包的详细信息的shell脚本
#!/bin/bash # list a content summary of a number of RPM packages # USAGE: showrpm rpmfile1 rpmfile2 ...
- python 单例模式的四种创建方式
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- Mego开发文档 - 快速概述
Mego 快速概述 Mego 是一款轻量级,可扩展和跨平台的数据访问技术. Mego 是一个对象关系映射器(O / RM),它使.NET开发人员能够使用.NET对象处理数据库.它消除了开发人员通常需要 ...
- Mego开发文档 - 基本保存操作
基本保存操作 在Mego中没有更改跟踪,也就是说所有的新增.更新及删除都需要开发者自行判断.Mego会最为实际的将各个数据操作提交给数据库并执行. 添加数据 using (var db = new O ...
- javascript改变style样式和css样式
转载 在很多情况下,都需要对网页上元素的样式进行动态的修改.在JavaScript中提供几种方式动态的修改样式,下面将介绍方法的使用.效果.以及缺陷. 1.使用obj.className来修改样式表的 ...