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用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过 ...
随机推荐
- Windows下使用Gflags检查内存越界
环境:windows xp. vs2005 Gflags可用于查找内存越界的问题. 访问一块申请的内存时,当访问的地址超过申请的范围时,就发生了内存越界的问题. 编写测试程序MemoryOverflo ...
- Spring---Bean的继承与依赖
Spring 允许继承 bean 的配置(通过Bean的parent属性来指定,例如parent=”teacher“), 被继承的 bean 称为父 bean. 继承这个父 Bean 的 Bean ...
- 2017Summmer_上海金马五校 F题,G题,I题,K题,J题
以下题目均自己搜 F题 A序列 一开始真的没懂题目什么意思,还以为是要连续的子串,结果发现时序列,简直智障,知道题意之后,好久没搞LIS,有点忘了,复习一波以后,直接双向LIS,处理处两个数组L和R ...
- jsp->jar
(2)新建 WEB-INF目录 (3)在 WEB-INF/web.xml 中输入如下内容 <web-app xmlns="http://java.sun.com/xml/ns/j2ee ...
- 简单JS旋转实现转盘抽奖效果
闲来没事,做了一个模拟转盘抽奖的HTML&JS的效果: 可以在设置的时候,选择几个区域,并且可以填写指针将要停止的区域 比如,我选择了"区域2",结果就是这样 具体可以见下 ...
- C#中字符数组,字节数组和string之间的转化
转自:http://blog.csdn.net/wangxiaoqin00007/article/details/17675419 NDC(NetworkDiskClient)的界面和后台程序之间用S ...
- 移动支付--银联,支付宝,微信(android)
在这个移动互联网快速发展的时代,手机已经成为人们生活或者出行之中必不可少的设备了,如今非常多城市的商户都能够採用支付宝,微信支付了.人们出门仅仅须要随身携带带手机.不用带大量现金就能够放心购物了.如今 ...
- JavaWeb-Servlet开发2
---恢复内容开始--- ServletConfig 配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servle ...
- npm命令,查看当前npm版本,更新nmp到最新版本,安装sails
打开Node.js command prompt 1 查看npm当前版本 npm -v 2 更新npm至最新版本 npm install npm@latest -g 3 安装sails npm in ...
- TensorFlow学习笔记(七)Tesnor Board
为了更好的管理.调试和优化神经网络的训练过程,TensorFlow提供了一个可视化工具TensorBoard.TensorBoard可以有效的展示TensorFlow在运行过程中的计算图..各种指标随 ...