NOI2015 软件包管理器 manager
显然链剖 然而只询问到根的信息,不用管lca,要好些很多(虽然我没那么写)
对于安装 查询和维护到根路径
对于卸载 查询和维护子树信息
因为链剖本身是用dfs序建的线段树,所以使得查询和修改子树非常方便。
- #include<iostream>
- #include<cstring>
- #include<cstdlib>
- #include<cstdio>
- #include<algorithm>
- using namespace std;
- const int Maxn=;
- int n;
- struct Data{
- int num[];
- Data(int a=,int b=) {num[]=a,num[]=b;}
- Data operator + (const Data&rhs) const {
- return Data(num[]+rhs.num[],num[]+rhs.num[]);
- }
- };
- struct SegmentTree{
- Data da[Maxn*];
- int tag[Maxn*];
- int lft,rgt,w;
- void add_tag(int s,int l,int r,int w) {
- if(w==-) return;
- da[s].num[w]=r-l+;
- da[s].num[w^]=;
- tag[s]=w;
- }
- void down(int s,int l,int r) {
- if(tag[s]==- || l==r) return;
- int mid=(l+r)>>;
- add_tag(s<<,l,mid,tag[s]);
- add_tag(s<<|,mid+,r,tag[s]);
- tag[s]=-;
- }
- void change(int s,int l,int r) {
- if(lft<=l && r<=rgt) {
- add_tag(s,l,r,w);
- return;
- }
- down(s,l,r);
- int mid=(l+r)>>;
- if(lft<=mid) change(s<<,l,mid);
- if(mid<rgt) change(s<<|,mid+,r);
- da[s] = da[s<<] + da[s<<|];
- }
- Data query(int s,int l,int r) {
- if(lft<=l&&r<=rgt) return da[s];
- down(s,l,r);
- int mid=(l+r)>>;
- if(rgt<=mid) return query(s<<,l,mid);
- if(mid<lft) return query(s<<|,mid+,r);
- return query(s<<,l,mid) + query(s<<|,mid+,r);
- }
- void build(int s,int l,int r) {
- if(l==r) {
- da[s]=Data(,);
- return;
- }
- int mid=(l+r)>>;
- build(s<<,l,mid);
- build(s<<|,mid+,r);
- da[s]=da[s<<]+da[s<<|];
- }
- }seg;
- int sz[Maxn],fa[Maxn],son[Maxn],dep[Maxn];
- struct Edge {
- int to;
- Edge*next;
- Edge(int to=,Edge*next=):to(to),next(next) {}
- }pool[Maxn*],*pis=pool,*fir[Maxn];
- void AddEdge(int from,int to) {
- *pis=Edge(to,fir[from]);fir[from]=pis++;
- *pis=Edge(from,fir[to]);fir[to]=pis++;
- }
- void dfs(int u) {
- sz[u] = ;
- son[u] = ;
- for(Edge*p=fir[u];p;p=p->next) {
- int v=p->to;
- if(v==fa[u]) continue;
- fa[v]=u;
- dep[v]=dep[u]+;
- dfs(v);
- sz[u]+=sz[v];
- if(sz[v]>sz[son[u]]) son[u]=v;
- }
- }
- int pos[Maxn],top[Maxn],tm,end[Maxn];
- void build(int u,int pre) {
- top[u] = pre;
- pos[u] = ++tm;
- if(son[u]) build(son[u],pre);
- for(Edge*p=fir[u];p;p=p->next) {
- int v=p->to;
- if(v==fa[u] || v==son[u]) continue;
- build(v,v);
- }
- end[u]=tm;
- }
- Data query(int a,int b) {
- int ta=top[a],tb=top[b];
- Data ret;
- for(;ta!=tb;a=fa[ta],ta=top[a]) {
- if(dep[ta]<dep[tb]) swap(a,b) ,swap(ta,tb);
- seg.lft=pos[ta],seg.rgt=pos[a];
- ret=ret+seg.query(,,n);
- }
- if(dep[a]>dep[b]) swap(a,b);
- seg.lft=pos[a],seg.rgt=pos[b];
- Data tmp=seg.query(,,n);
- return ret+tmp;
- }
- void change(int a,int b,int c) {
- int ta=top[a],tb=top[b];
- Data ret;
- for(;ta!=tb;a=fa[ta],ta=top[a]) {
- if(dep[ta]<dep[tb]) swap(a,b) ,swap(ta,tb);
- seg.lft=pos[ta],seg.rgt=pos[a];seg.w=c;
- seg.change(,,n);
- }
- if(dep[a]>dep[b]) swap(a,b);
- seg.lft=pos[a],seg.rgt=pos[b],seg.w=c;
- return seg.change(,,n);
- }
- void init() {
- memset(seg.tag,-,sizeof seg.tag);
- scanf("%d",&n);
- for(int x,i=;i<n;i++) {
- scanf("%d",&x);
- AddEdge(i+,x+);
- }
- dfs();
- build(,);
- seg.build(,,n);
- // seg.lft=1,seg.rgt=n,seg.w=0;change(1,1,n);
- }
- void work() {
- int m,x;
- char opt[];
- for(scanf("%d",&m);m--;) {
- scanf("%s%d",opt,&x);x++;
- if(opt[]=='i') {
- printf("%d\n",query(x,).num[]);
- change(x,,);
- }else {
- seg.lft=pos[x],seg.rgt=end[x],seg.w=;
- printf("%d\n",seg.query(,,n).num[]);
- seg.change(,,n);
- }
- }
- }
- int main() {
- freopen("manager.in","r",stdin);
- freopen("manager.out","w",stdout);
- init();
- work();
- return ;
- }
NOI2015 软件包管理器 manager的更多相关文章
- 洛谷 P2146 [NOI2015]软件包管理器 树链剖分
目录 题面 题目链接 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 输出样例#1: 输入样例#2: 输出样例#2: 说明 说明 思路 AC代码 总结 题面 题目链接 P ...
- BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1352 Solved: 780[Submit][Stat ...
- [BZOJ4196][NOI2015]软件包管理器
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1040 Solved: 603[Submit][Stat ...
- Bzoj 4196: [Noi2015]软件包管理器 树链剖分
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 721 Solved: 419[Submit][Statu ...
- [NOI2015]软件包管理器
4621 [NOI2015]软件包管理器 题目等级 : 钻石 Diamond 题目描述 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过 ...
- BZOJ_4196_[Noi2015]软件包管理器_树链剖分
BZOJ_4196_[Noi2015]软件包管理器_树链剖分 题意: Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助 ...
- bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2852 Solved: 1668[Submit][Sta ...
- 洛谷 P2146 [NOI2015]软件包管理器 解题报告
P2146 [NOI2015]软件包管理器 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软 ...
- 【BZOJ4196】[Noi2015]软件包管理器 树链剖分
[Noi2015]软件包管理器 树链剖分 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从 ...
随机推荐
- Bridge 模式
Bridge 模式将抽象和行为划分开来,各自独立,但能动态的结合.在面向对象设计的基本概念中,对象这个概念实际是由属性和行为两个部分组成的,属性我们可以认为是一种静止的,是一种抽象,一般情况下,行为是 ...
- 浅谈 trie树 及其实现
定义:又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构, 如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. 核心思想:是空间换时间.利用字符串的公共前缀来降低查询时间的开 ...
- Sublime Text 皮肤插件安装
安装皮肤, 举例sodahttps://github.com/buymeasoda/soda-themectrl+shift+p => Package Control: Install Pack ...
- CentOS7下安装配置vncserver
之前试了xmanager,不过好像和在centos6有很大不同,居然没成功,然后找到了vncserver,试了下,成了 参考:http://blog.csdn.net/jiangliqing1234/ ...
- c# winform 设置winform进入窗口后在文本框里的默认焦点
c# winform 设置winform进入窗口后在文本框里的默认焦点 进入窗口后默认聚焦到某个文本框,两种方法: ①设置tabindex 把该文本框属性里的tabIndex设为0,焦点就默认在这个文 ...
- wndows常用命令
1. 远程桌面 mstsc (Microsoft terminal services client)
- 《学习Opencv》第五章 习题6
这是第五章 习题5.6的结合版,其中实现了摄像头抓拍功能,能够成功运行. #include "stdafx.h" #include "cv.h" #includ ...
- “layout_”下划线开头的属性
观看幕课网的视频的收获 “layout_”下划线开头的属性都是交给父容器去处理的属性,如: android:layout_width="match_parent" android: ...
- 排他锁Lock
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 转:.NET 环境中使用RabbitMQ
原文来自于:http://blog.jobbole.com/83819/ 原文出处: 寒江独钓 欢迎分享原创到伯乐头条 在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统 ...