4196: [Noi2015]软件包管理器
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 412 Solved: 251
[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
一开始所有的软件包都处于未安装状态。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
typedef long long LL;
const int maxn=;
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int N,M;
int dep[maxn],siz[maxn],fa[maxn],son[maxn],top[maxn],id[maxn];
int val[maxn];
int num;
char s[];
vector<int> to[maxn];
inline void dfs1(int rt,int fath,int deep){
dep[rt]=deep; siz[rt]=; son[rt]=; fa[rt]=fath;
for(int i=;i<to[rt].size();i++){
int y=to[rt][i];
if(y!=fa[rt]){
dfs1(y,rt,deep+);
siz[rt]+=siz[y];
if(siz[son[rt]]<siz[y]){
son[rt]=y;
}
}
}
}
inline void dfs2(int rt,int tp){
top[rt]=tp;
id[rt]=++num;
if(son[rt]!=) dfs2(son[rt],tp);
for(int i=;i<to[rt].size();i++){
int y=to[rt][i];
if(y!=fa[rt]&&y!=son[rt]){
dfs2(y,y);
}
}
} struct Tree{
int l,r,sum,lazy;
}tree[maxn*];
inline void build(int rt,int l,int r){
tree[rt].l=l; tree[rt].r=r;
if(l==r){
tree[rt].sum=;
tree[rt].lazy=;
return ;
}
int mid=(l+r)>>;
build(rt<<,l,mid); build(rt<<|,mid+,r);
tree[rt].sum=tree[rt<<].sum+tree[rt<<|].sum;
}
inline void update_son(int rt){
int d=tree[rt].lazy;
if(d!=){
tree[rt<<].sum+=(tree[rt<<].r-tree[rt<<].l+)*d;
if(tree[rt<<].sum<) tree[rt<<].sum=;
if(tree[rt<<].sum>(tree[rt<<].r-tree[rt<<].l+))
tree[rt<<].sum=(tree[rt<<].r-tree[rt<<].l+);
tree[rt<<|].sum+=(tree[rt<<|].r-tree[rt<<|].l+)*d;
if(tree[rt<<|].sum<) tree[rt<<|].sum=;
if(tree[rt<<|].sum>(tree[rt<<|].r-tree[rt<<|].l+))
tree[rt<<|].sum=(tree[rt<<|].r-tree[rt<<|].l+);
tree[rt<<].lazy=tree[rt].lazy; tree[rt<<|].lazy=tree[rt].lazy;
tree[rt].lazy=;
}
}
inline void change(LL rt,LL l,LL r,LL delta){
if(l<=tree[rt].l&&tree[rt].r<=r){
tree[rt].sum+=(tree[rt].r-tree[rt].l+)*delta;
if(tree[rt].sum<) tree[rt].sum=;
if(tree[rt].sum>(tree[rt].r-tree[rt].l+)) tree[rt].sum=(tree[rt].r-tree[rt].l+);
tree[rt].lazy=delta;
return ;
}
update_son(rt);
LL mid=(tree[rt].l+tree[rt].r)>>;
if(l<=mid) change(rt<<,l,r,delta);
if(mid+<=r) change(rt<<|,l,r,delta);
tree[rt].sum=tree[rt<<].sum+tree[rt<<|].sum;
} inline LL query(LL rt,LL l,LL r){
if(l<=tree[rt].l&&tree[rt].r<=r){
return tree[rt].sum;
}
update_son(rt);
LL ans=;
LL mid=(tree[rt].l+tree[rt].r)>>;
if(l<=mid) ans+=query(rt<<,l,r);
if(mid+<=r) ans+=query(rt<<|,l,r);
return ans;
}
inline void ASK(int u,int v){
int tp1=top[u],tp2=top[v];
int ans=,tmpv=v;
if(u==-){//卸载
ans=query(,id[v],id[v]);
if(ans==){
ans=query(,id[v],id[v]+siz[v]-);//子树权值之和
printf("%d\n",ans);
change(,id[v],id[v]+siz[v]-,-);
}
else printf("0\n");
}
else{//安装
ans=query(,id[v],id[v]);
if(ans==){
while(tp1!=tp2){
if(dep[tp1]<dep[tp2]){
swap(tp1,tp2);
swap(u,v);
}
ans+=query(,id[tp1],id[u]);
change(,id[tp1],id[u],);
u=fa[tp1],tp1=top[u];
}
if(dep[u]>dep[v]) swap(u,v);
ans+=query(,id[u],id[v]);
ans=dep[tmpv]-ans;
change(,id[u],id[v],);
printf("%d\n",ans);
}
else printf("0\n");
}
}
int main(){
N=read();
for(int i=,u;i<=N;i++){
u=read(); u++;
to[u].push_back(i); to[i].push_back(u);
}
dfs1(,,); dfs2(,);
build(,,num);
M=read();
for(int i=,x;i<=M;i++){
scanf("%s%d",s,&x);
x++;
if(s[]=='i'){
ASK(,x);
}
else if(s[]=='u'){
ASK(-,x);
}
}
return ;
}
现再提供造数据的程序(根据需要调数据范围),给那些死都调不出来的小伙伴们。。。
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("makedata.out","w",stdout);
srand(time());
int N,M;
N=rand()%+;
cout<<N<<endl;
for(int i=;i<=N-;i++){
int to=rand()%i;
cout<<to<<" ";
}
cout<<endl;
M=rand()%+;
cout<<M<<endl;
for(int i=;i<=M;i++){
int kin=rand()%;
if(kin==) cout<<"install"<<" ";
else cout<<"uninstall"<<" ";
cout<<rand()%N<<endl;
}
return ;
}
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 ...
- bzoj 4196: [Noi2015]软件包管理器
Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...
- 4196. [NOI2015]软件包管理器【树链剖分】
Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...
- 【刷题】BZOJ 4196 [Noi2015]软件包管理器
Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...
- [BZOJ4196][NOI2015]软件包管理器
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1040 Solved: 603[Submit][Stat ...
- [BZOJ4196][NOI2015]软件包管理器(树链剖分)
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2166 Solved: 1253[Submit][Sta ...
- [NOI2015]软件包管理器
4621 [NOI2015]软件包管理器 题目等级 : 钻石 Diamond 题目描述 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过 ...
随机推荐
- win10系统下把Oracle卸载干净
我和大家一样,遇到了一个问题,就是如何把Oracle从自己的电脑卸载干净,很多人都觉得很难把Oracle卸载干净,于是选择重装系统,因为解决不了Oracle没有卸载干净之后,重装不了的问题,有时候真的 ...
- Program terminated with signal SIGABRT, Aborted.
linux C++ 程序 启动后就奔溃 #0 0x00007f01ee4c21f7 in raise () from /lib64/libc.so.6 #1 0x00007f01ee4c38e8 in ...
- type为number的<input>标签 type和size属性失效
html5中input的type属性增的可取值新增几种,对于不支持这几种新增值的浏览器会统一解析为text类型. Firefox.ie9不支持
- riemann的安装和使用
Riemann monitors distributed systems. 具体介绍就不多说了,一个分布式的监控系统.可以接收各种event上报,然后通过强大的脚本和插件,展示曲线,柱状,饼图等来对系 ...
- Django资源汇总(转)
Django 我和Django¶ 我使用python的很大一部分原因就是django.虽然在以前也用过python,不过始终没有什么特别的感觉.然后接触到了django.可以说django非常对我的胃 ...
- 消息编解码Nanopb - protocol buffers
Google Protocol Buffer 有各种版本的代码包,Python C/C++.JAVA.C.OBJ-C..NET等,嵌入式设备中使用的protobuf版本,我们选择的是nanoprobu ...
- PAT 1077 Kuchiguse [一般]
1077 Kuchiguse (20 分) The Japanese language is notorious for its sentence ending particles. Personal ...
- Redis操作手册
一.Redis简介 1.1 NoSQL NoSQL,泛指非关系型数据库,NoSQL数据库分为四大类:键值存储数据库(Redis,Voldemort,Oracle BDB).列存储数据库(HBase,R ...
- python全栈开发从入门到放弃之socket并发编程多进程
1.1 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程 ...
- [笔记]Delphi 2007写DLL供VC调用实例
考虑如下几种常用情况: - VC传入int,返回int- VC传入char *,返回int- VC传入char *,返回char *及int 为简化问题,传递的字符串参数只考虑ANSI格式,不考虑UN ...