[BZOJ4196][NOI2015]软件包管理器
4196: [Noi2015]软件包管理器
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 1040 Solved: 603
[Submit][Status][Discuss]
Description
Linux用户和OSX用户一定对软件包管理器不会陌生。通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件包的安装所依赖的其它软件包),完成所有的配置。Debian/Ubuntu使用的apt-get,Fedora/CentOS使用的yum,以及OSX下可用的homebrew都是优秀的软件包管理器。
Input
输入文件的第1行包含1个正整数n,表示软件包的总数。软件包从0开始编号。
Output
输出文件包括q行。
Sample Input
0 0 0 1 1 5
5
install 5
install 6
uninstall 1
install 4
uninstall 0
Sample Output
1
3
2
3
HINT
一开始所有的软件包都处于未安装状态。
Source
树链剖分裸题,安装相当于把到根的路径设为1,卸载相当于把子树设成0。
#include<cstdio>
#include<algorithm>
#define N 100010
using namespace std;
int n,tot,q,head[N];
struct edge{int next,to;}e[N<<];
inline void add(int u,int v)
{
e[++tot]=(edge){head[u],v};
head[u]=tot;
}
int fa[N],size[N],deep[N],son[N];
void dfs1(int x)
{
size[x]=;
deep[x]=deep[fa[x]]+;
for(int i=head[x];i;i=e[i].next)
{
dfs1(e[i].to);
size[x]+=size[e[i].to];
if(size[son[x]]<size[e[i].to])
son[x]=e[i].to;
}
}
int pos[N],npos[N],id,top[N];
void dfs2(int x)
{
npos[pos[x]=++id]=x;
if(son[fa[x]]==x)top[x]=top[fa[x]];
else top[x]=x;
if(son[x])dfs2(son[x]);
for(int i=head[x];i;i=e[i].next)
if(e[i].to!=son[x])dfs2(e[i].to);
}
#define mid (t[k].l+t[k].r>>1)
struct tree{int l,r,tag,sum;}t[N<<];
inline void pushup(int k)
{
t[k].sum=t[k<<].sum+t[k<<|].sum;
}
inline void pushdown(int k)
{
if(t[k].tag!=-)
{
t[k<<].sum=t[k].tag*(mid-t[k].l+);
t[k<<].tag=t[k].tag;
t[k<<|].sum=t[k].tag*(t[k].r-mid);
t[k<<|].tag=t[k].tag;
t[k].tag=-;
}
}
void build(int k,int l,int r)
{
t[k]=(tree){l,r,-,};
if(l==r)return;
build(k<<,l,mid);
build(k<<|,mid+,r);
}
void change(int k,int l,int r,int val)
{
if(t[k].l==l&&t[k].r==r)
{
t[k].tag=val;
t[k].sum=val*(r-l+);
return;
}
pushdown(k);
if(r<=mid)change(k<<,l,r,val);
else if(l>mid)change(k<<|,l,r,val);
else change(k<<,l,mid,val),change(k<<|,mid+,r,val);
pushup(k);
}
void getchange(int x,int y,int val)
{
int fx=top[x],fy=top[y];
while(fx!=fy)
{
if(deep[fx]<deep[fy])swap(x,y),swap(fx,fy);
change(,pos[fx],pos[x],val);
x=fa[fx];fx=top[x];
}
if(deep[x]<deep[y])swap(x,y);
change(,pos[y],pos[x],val);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&fa[i]);
add(++fa[i],i);
}
dfs1();dfs2();build(,,n);
scanf("%d",&q);
int x,ans;
char s[];
while(q--)
{
scanf("%s%d",s,&x);x++;
ans=t[].sum;
if(s[]=='i')getchange(,x,);
else change(,pos[x],pos[x]+size[x]-,);
printf("%d\n",abs(t[].sum-ans));
}
}
[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]软件包管理器_树链剖分_线段树
软件包管理器 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 ...
随机推荐
- 【Android自学日记】【转】Android Fragment 真正的完全解析(上)
自从Fragment出现,曾经有段时间,感觉大家谈什么都能跟Fragment谈上关系,做什么都要问下Fragment能实现不~~~哈哈,是不是有点过~~~ 本篇博客力求为大家说明Fragment如何产 ...
- ajax获取json数据 for select2
json数据“a.json” [ { "id": "1", "text": "张三" }, { "id&quo ...
- WPF菜单
1.Menu Menu 是水平放置它的项的,默认情况下把灰色栏作为背景. 把Menu 添加到它的ItemsControl 基类的唯一公开的API 是IsMainMenu 属性.当为true(默认的)时 ...
- composer 使用笔记
使用composer 更新项目比如: composer create-project topthink/think wwwroot dev-master --prefer-dist提示openssl异 ...
- 解决JSP页面获取的数据库数据乱码问题
将java项目部署到服务器,页面数据乱码: 解决:首先查看了数据库编码和jsp编码都是utf-8,说明jsp和数据库没问题,于是查看了tomcat设置的编码 没有设置编码,于是加了URIEncodin ...
- MySql的一些用法
1.怎样找到MySql数据的存储目录? 答:从服务中查看正在运行的MySql,查看它的启动参数,可能是这个样子: "D:\Program Files\MySQL\MySQL Server 5 ...
- jdbcTemplate批量插入(添加)
public void addSubscibe(List<PermedipUserSubscribeVo> list) { final List<PermedipUserSubscr ...
- CentOS下采用Crontab实现PHP脚本定时任务
简单实现一个需求,每5分钟往特定表中插入2条数据.经过分析还是采用crontab方式靠谱,另外执行php脚本的方式,不用担心链接超时等问题. 1.准备工作,创建1个数据表“person”, CREAT ...
- monkey之三:monkey测试测略(摘抄)
一.分类 Monkey测试针对不同的对象,不同的目的,采用不同的测略方案. 测试类型分为: 应用程序的稳定性测试和压力测试 测试对象分为: 单个APK和多个APK集合 测试目的分为: 解决问题的测试( ...
- 先定一个小目标,自己封装个ajax
你是否发现项目中有很多页面只用到了框架不到十分之一的内容,还引了压缩后还有70多kb的jquery库 你是否发现项目中就用了两三个underscore提供的方法,其他大部分的你方法你甚至从来没有看过 ...