BZOJ_P4196 [NOI2015]软件包管理器(树链剖分+dfs序)-程序员宅基地

技术标签: NOI  树链剖分  BZOJ  

BZOJ传送门

Linux 用户和 OS X 用户一定对软件包管理器不会陌生。通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件包的安装所依赖的其它软件包),完成所有的配置。Debian/Ubuntu 使用的 apt-get,Fedora/CentOS 使用的 yum,以及 OS X 下可用的 homebrew 都是优秀的软件包管理器。

你决定设计你自己的软件包管理器。不可避免地,你要解决软件包之间的依赖问题。如果软件包 AA 依赖软件包 BB,那么安装软件包 AA 以前,必须先安装软件包 BB。同时,如果想要卸载软件包 BB,则必须卸载软件包 AA。现在你已经获得了所有的软件包之间的依赖关系。而且,由于你之前的工作,除 00 号软件包以外,在你的管理器当中的软件包都会依赖一个且仅一个软件包,而 00 号软件包不依赖任何一个软件包。依赖关系不存在环(若有 mm (m≥2)(m≥2) 个软件包 A1,A2,A3,…,AmA1,A2,A3,…,Am,其中 A1A1 依赖 A2A2,A2A2 依赖 A3A3,A3A3 依赖 A4A4,……,Am−1Am−1 依赖 AmAm,而 AmAm 依赖 A1A1,则称这 mm 个软件包的依赖关系构成环),当然也不会有一个软件包依赖自己。

现在你要为你的软件包管理器写一个依赖解决程序。根据反馈,用户希望在安装和卸载某个软件包时,快速地知道这个操作实际上会改变多少个软件包的安装状态(即安装操作会安装多少个未安装的软件包,或卸载操作会卸载多少个已安装的软件包),你的任务就是实现这个部分。注意,安装一个已安装的软件包,或卸载一个未安装的软件包,都不会改变任何软件包的安装状态,即在此情况下,改变安装状态的软件包数为 00。

输入格式
输入文件的第 11 行包含 11 个正整数 nn,表示软件包的总数。软件包从 00 开始编号。

随后一行包含 n−1n−1 个整数,相邻整数之间用单个空格隔开,分别表示 1,2,3,…,n−2,n−11,2,3,…,n−2,n−1 号软件包依赖的软件包的编号。

接下来一行包含 11 个正整数 qq,表示询问的总数。

之后 qq 行,每行 11 个询问。询问分为两种:

install xx:表示安装软件包 xx
uninstall xx:表示卸载软件包 xx
你需要维护每个软件包的安装状态,一开始所有的软件包都处于未安装状态。对于每个操作,你需要输出这步操作会改变多少个软件包的安装状态,随后应用这个操作(即改变你维护的安装状态)。

输出格式
输出文件包括 qq 行。

输出文件的第 ii 行输出 11 个整数,为第 ii 步操作中改变安装状态的软件包数。

样例一
input

7
0 0 0 1 1 5
5
install 5
install 6
uninstall 1
install 4
uninstall 0

output

3
1
3
2
3

explanation

一开始所有的软件包都处于未安装状态。

安装 55 号软件包,需要安装 0,1,50,1,5 三个软件包。

之后安装 66 号软件包,只需要安装 66 号软件包。此时安装了 0,1,5,60,1,5,6 四个软件包。

卸载 11 号软件包需要卸载 1,5,61,5,6 三个软件包。此时只有 00 号软件包还处于安装状态。

之后安装 44 号软件包,需要安装 1,41,4 两个软件包。此时 0,1,40,1,4 处在安装状态。

最后,卸载 00 号软件包会卸载所有的软件包。

样例二
input

10
0 1 2 1 3 0 0 3 2
10
install 0
install 3
uninstall 2
install 7
install 5
install 9
uninstall 9
install 4
install 1
install 9

output

1
3
2
1
3
1
1
1
0
1

样例三
见样例数据下载。

限制与约定
测试点编号 nn 的规模 qq 的规模 备注
1 n=5000n=5000 q=5000q=5000
2
3 n=100000n=100000 q=100000q=100000 数据不包含卸载操作
4
5 n=100000n=100000 q=100000q=100000 编号为 ii 的软件包所依赖的软件包编号在 [0,i−1][0,i−1] 内均匀随机。
每次执行操作的软件包编号在 [0,n−1][0,n−1] 内均匀随机。
6
7
8
9 n=100000n=100000 q=100000q=100000
10
11
12
13
14
15
16
17
18
19
20
时间限制:1s1s
空间限制:512MB

Sol:
NOI水题…

#include<cstdio>
#include<vector>
#include<iostream>
using namespace std;
#define N 500005
#define mid ((l+r)>>1)
int n,m,cnt;vector<int> g[N];
int sz[N],top[N],p[N],f[N],son[N],dep[N],dfsn[N];
struct SegTree{
    int d[N*4],g[N*4],lg[N*4];
    void Updata(int o){d[o]=d[o<<1]+d[o<<1|1];}
    void Push(int o){
        if(~g[o]){
            if(g[o]) d[o<<1]=lg[o<<1],d[o<<1|1]=lg[o<<1|1];
            else d[o<<1]=d[o<<1|1]=0;
            g[o<<1]=g[o<<1|1]=g[o],g[o]=-1;
        }
    }
    void Build(int o,int l,int r){
        if(l==r){d[o]=0,g[o]=-1,lg[o]=1;return;}
        Build(o<<1,l,mid);Build(o<<1|1,mid+1,r);
        lg[o]=lg[o<<1]+lg[o<<1|1],g[o]=-1;
    }
    int Query0(int o,int l,int r,int ql,int qr,int res=0){
        if(ql<=l&&r<=qr) return lg[o]-d[o];
        Push(o);
        if(ql<=mid) res+=Query0(o<<1,l,mid,ql,qr);
        if(qr>mid) res+=Query0(o<<1|1,mid+1,r,ql,qr);
        return res;
    }
    int Query1(int o,int l,int r,int ql,int qr,int res=0){
        if(ql<=l&&r<=qr) return d[o];
        Push(o);
        if(ql<=mid) res+=Query1(o<<1,l,mid,ql,qr);
        if(qr>mid) res+=Query1(o<<1|1,mid+1,r,ql,qr);
        return res;
    }
    void Change(int o,int l,int r,int ql,int qr,int v){
        if(ql<=l&&r<=qr){g[o]=v,d[o]=lg[o]*v;return;}
        Push(o);
        if(ql<=mid) Change(o<<1,l,mid,ql,qr,v);
        if(qr>mid) Change(o<<1|1,mid+1,r,ql,qr,v);
        Updata(o);
    }
    int GetAns(int u,int v,int res=0){
        int f1=top[u],f2=top[v];
        while(f1!=f2){
            if(dep[f1]<dep[f2]) swap(u,v),swap(f1,f2);
            res+=Query0(1,1,n,p[f1],p[u]);Change(1,1,n,p[f1],p[u],1);
            u=f[f1],f1=top[u];
        }
        if(dep[u]>dep[v]) swap(u,v);
        res+=Query0(1,1,n,p[u],p[v]);Change(1,1,n,p[u],p[v],1);
        return res;
    }
}seg;
void dfs1(int u,int fa,int d){
    f[u]=fa,sz[u]=1,dep[u]=d;
    for(int i=0,v,lim=g[u].size();i<lim;i++)
        if((v=g[u][i])!=fa){
            dfs1(v,u,d+1),sz[u]+=sz[v];
            if(!son[u]||sz[v]>sz[son[u]]) son[u]=v;
        }
}
void dfs2(int u,int tp){
    p[u]=++cnt,top[u]=tp;
    if(!son[u]){dfsn[u]=cnt;return;}dfs2(son[u],tp);
    for(int i=0,v,lim=g[u].size();i<lim;i++){
        if((v=g[u][i])!=f[u]&&v!=son[u]) dfs2(v,v);
    }dfsn[u]=cnt;
}
inline int in(int x=0,char ch=getchar()){
   while(ch>'9'||ch<'0') ch=getchar();
    while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x;}
char str[65];
void print(long long x){
    int l=0;if(!x){
   putchar('0');return;}if(x<0) putchar('-'),x=-x;
    while(x) str[++l]=x%10+'0',x/=10;while(l) putchar(str[l--]);}
int main(){
    n=in();
    for(int i=2,x;i<=n;i++) x=in()+1,g[x].push_back(i);
    dfs1(1,1,1);dfs2(1,1);seg.Build(1,1,n);
    m=in();char opt[15];
    while(m--){
        scanf("%s",opt);
        if(opt[0]=='i'){
            print(seg.GetAns(1,in()+1)),putchar('\n');
        }else{
            int x=in()+1;
            print(seg.Query1(1,1,n,p[x],dfsn[x])),putchar('\n'),
                seg.Change(1,1,n,p[x],dfsn[x],0);
        }
    }
    return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_18455665/article/details/51033744

智能推荐

STM32+BM8563时钟芯片不走时问题解决(含配置代码)_bm8563esa stm32 代码-程序员宅基地

文章浏览阅读7.8k次,点赞2次,收藏34次。STM32+BM8563时钟芯片不走时问题解决(含配置代码)一、寄存器BM8563是一款低功耗CMOS实时时钟/日历芯片,它提供一个可编程的时钟输出,一个中断输出和一个掉电检测器,所有的地址和数据都通过I2C总线接口串行传递。最大总线速度为400Kbits/s,每次读写数据后,内嵌的字地址寄存器会自动递增。BM8563有16个寄存器,其中11个是BCD格式。配置是要注意值范围,不能超出。更多具体应用请看官方手册。二、晶振晶振选择非常重要。32.768不用说了,主要是ESR值,不能小了,也不能太大_bm8563esa stm32 代码

利用VGG16网络模块进行迁移学习,实操(附源码)_vgg16迁移学习-程序员宅基地

文章浏览阅读1.6w次,点赞27次,收藏170次。原文代码+Food_5K数据集,提取码:zws7什么是迁移学习当数据集没有大到足以训练整个CNN网络时,通常可以对预训练好的imageNet网络(如VGG16,Inception-v3等)进行调整以适应新任务。通常来说,迁移学习有两种类型:特征提取 微调(fine-tuning)第一种迁移学习是将预训练的网络视为一个任意特征提取器。图片经过输入层,然后前向传播,最后在指定层停......_vgg16迁移学习

SpringBoot第十九篇:邮件服务_springboot mail-程序员宅基地

文章浏览阅读643次。作者:追梦1819原文:https://blog.csdn.net/weixin_39759846/article/details/94428903版权声明:本文为博主原创文章,转载请附上博文链接!引言  邮件的重要性也无需多说了,例如注册验证,消息通知,系统异常提醒等,都离不开邮件的发送。版本信息JDK:1.8 SpringBoot :2.1.4.RELEASE m..._springboot mail

PID 控制器代码实现_pid源码-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏7次。PID 控制器代码实现PID 控制器代码实现效果展示实现代码PID 控制器代码实现PID:比列(Proportion),积分(Integral),微分(Differential)偏差 e:某时刻的系统的输出值(output)和目标值(target)之差Kp: 比列系数Ki: 积分系数Kd: 微分系数Ti: 积分时间Td: 微分时间比例系数Kp:增大比例系数使系统反应灵敏,调节速度加快,并且可以减小稳态误差。但是比例系数过大会使超调量增大,振荡次数增加,调节时间加长,动态性能变坏,比例系数_pid源码

mysql order by根据某一个字符串字段排序的问题_convert( a.province using gbk ) collate gbk_chines-程序员宅基地

文章浏览阅读1.6k次。mysql 在根据某一个字符串字段进行排序的时候,往往没法按照字母进行排序,这时候需要在oder by后面更换成以下形式就可以按照字母就行排序了ORDER BY CONVERT(c.NAME USING gbk) COLLATE gbk_chinese_ci ASC;CONVERT(c.NAME USING gbk) 表示把该字段按照gbk进行重新编码;COLLATE gbk_chines..._convert( a.province using gbk ) collate gbk_chinese_ci asc

AI宝典:AI超强工具大整合-程序员宅基地

文章浏览阅读3.9k次,点赞29次,收藏98次。AI超强工具大揭秘!你想要的我都有_ai宝典

随便推点

mmseg 增加词库_mmseg 新增词库-程序员宅基地

文章浏览阅读998次。/usr/local/mmseg/etc这个目录下1、了解几个文件mmseg.ini unigram.txt uni.libuni.lib --------- 编译后的词库unigram.txt ---- 原词库给人看的, 在这里面添加词库2、添加词条海斯队 1x:1丝路 1x:1令人心悸 1x:13、重新编_mmseg 新增词库

FAST特征点检测_fast 特征检测-程序员宅基地

文章浏览阅读1.3k次。一、原始检测方法具体内容如下: 判别特征点pp是否是一个特征点,可以通过判断以该点为中心画圆,该圆过16个像素点。设在圆周上的16个像素点中是否最少有nn个连续的像素点满足都比Ip+tIp+t大,或者都比Ip−tIp−t小。(这里IpIp指的点pp的灰度值,tt是一个阈值)如果满足这样的要求,则判断pp是一个特征点,否则pp不是。在原论文中nn的值一般设为12。 如下图所示: 由于在检测特征点时..._fast 特征检测

Oracle查询客户端编码集_oracle 获取机器码-程序员宅基地

文章浏览阅读3.7k次。Oracle查询客户端编码集SQL> select userenv('language') from dual; USERENV('LANGUAGE')----------------------------------------------------AMERICAN_AMERICA.ZHS16GBK_oracle 获取机器码

前后端常见的几种鉴权方式_强鉴权-程序员宅基地

文章浏览阅读458次。最近在重构公司以前产品的前端代码,摈弃了以前的session-cookie鉴权方式,采用token鉴权,忙里偷闲觉得有必要对几种常见的鉴权方式整理一下。 目前我们常用的鉴权有四种: HTTP Basic Authenticationsession-cookieT..._强鉴权

try3-2-程序员宅基地

文章浏览阅读1.4k次。あIOC:国際オリンピック委い員会 IOC: International Olympic Committee 国际奥林匹克委员会愛情 love, affection 爱情アイディア ...

3D slicer编译过程中遇到的问题总结_3d slicer package生成时报错 file install cannot find-程序员宅基地

文章浏览阅读1.5k次,点赞4次,收藏2次。3D slicer编译过程中遇到的问题总结1,有关python部分编译1>------ 已启动生成: 项目: python-setuptools, 配置: Debug x64 ------1> Creating directories for 'python-setuptools'1> Building Custom Rule D:/S/S4/CMakeLists.txt1> No download step for 'python-setuptools'1>_3d slicer package生成时报错 file install cannot find

推荐文章

热门文章

相关标签