内存限制:256 MiB 时间限制:1000 ms 标准输入输出
                           题目类型:传统 评测方式:文本比较
                                上传者: 匿名

树链剖分+线段树

屠龙宝刀点击就送

#include <vector>
#include <cstdio>
#define N 100005 using namespace std;
vector<int>G[N];
int n,q,tim,siz[N],fa[N],dep[N],belong[N],top[N];
struct Segment
{
int l,r,mid,sum,flag;
Segment *ch[];
Segment()
{
ch[]=ch[]=NULL;
sum=flag=;
}
}*root=new Segment;
void dfs1(int x)
{
siz[x]=;
dep[x]=dep[fa[x]]+;
for(int i=;i<G[x].size();++i)
{
int v=G[x][i];
if(fa[x]!=v)
{
fa[v]=x;
dfs1(v);
siz[x]+=siz[v];
}
}
}
void dfs2(int x)
{
if(!top[x]) top[x]=x;
int t=;
belong[x]=++tim;
for(int i=;i<G[x].size();++i)
{
int v=G[x][i];
if(fa[x]!=v&&siz[t]<siz[v]) t=v;
}
if(t) top[t]=top[x],dfs2(t);
for(int i=;i<G[x].size();++i)
{
int v=G[x][i];
if(fa[x]!=v&&v!=t) dfs2(v);
}
}
inline void pushup(Segment *&k) {k->sum=k->ch[]->sum+k->ch[]->sum;}
void build(Segment *&k,int l,int r)
{
k=new Segment;
k->l=l;k->r=r;
if(l==r) return;
k->mid=(l+r)>>;
build(k->ch[],l,k->mid);
build(k->ch[],k->mid+,r);
pushup(k);
}
void swap(int &m,int &n)
{
int tmp=n;
n=m;
m=tmp;
}
void pushdown(Segment *&k)
{
if(k->flag==)
{
k->ch[]->flag=k->flag;
k->ch[]->sum=k->ch[]->r-k->ch[]->l+;
k->ch[]->flag=k->flag;
k->ch[]->sum=k->ch[]->r-k->ch[]->l+;
k->flag=;
}
else
{
k->ch[]->flag=k->flag;
k->ch[]->sum=;
k->ch[]->flag=k->flag;
k->ch[]->sum=;
k->flag=;
}
}
int Tree_Query(Segment *&k,int l,int r)
{
if(k->l==l&&k->r==r) return k->sum;
if(k->flag) pushdown(k);
if(l>k->mid) return Tree_Query(k->ch[],l,r);
else if(r<=k->mid) return Tree_Query(k->ch[],l,r);
else return Tree_Query(k->ch[],l,k->mid)+Tree_Query(k->ch[],k->mid+,r);
pushup(k);
}
void Tree_Change(Segment *&k,int l,int r,int opt)
{
if(k->l==l&&k->r==r)
{
k->flag=opt;
if(opt==) k->sum=r-l+;
else k->sum=;
return;
}
if(k->flag) pushdown(k);
if(l>k->mid) Tree_Change(k->ch[],l,r,opt);
else if(r<=k->mid) Tree_Change(k->ch[],l,r,opt);
else Tree_Change(k->ch[],l,k->mid,opt),Tree_Change(k->ch[],k->mid+,r,opt);
pushup(k);
}
int Chain_Query(int x,int y)
{
int ret=;
for(;top[x]!=top[y];x=fa[top[x]])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ret+=Tree_Query(root,belong[top[x]],belong[x]);
}
if(dep[x]<dep[y]) swap(x,y);
ret+=Tree_Query(root,belong[y],belong[x]);
return ret;
}
void Chain_Change(int x,int y,int opt)
{
for(;top[x]!=top[y];x=fa[top[x]])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
Tree_Change(root,belong[top[x]],belong[x],opt);
}
if(dep[x]<dep[y]) swap(x,y);
Tree_Change(root,belong[y],belong[x],opt);
}
int Main()
{
scanf("%d",&n);
for(int pr,i=;i<=n;++i)
{
scanf("%d",&pr);
G[++pr].push_back(i);
G[i].push_back(pr);
}
dfs1();
dfs2();
build(root,,n);
scanf("%d",&q);
char opt[];
for(int x;q--;)
{
scanf("%s%d",opt,&x);++x;
if(opt[]=='i')
{
int ans=Chain_Query(,x);
Chain_Change(,x,);
printf("%d\n",dep[x]-ans);
}
else
{
int ans=Tree_Query(root,belong[x],belong[x]+siz[x]-);
Tree_Change(root,belong[x],belong[x]+siz[x]-,);
printf("%d\n",ans);
}
}
return ;
}
int sb=Main();
int main(int argc,char *argv[]) {;}

LibreOJ #2130. 「NOI2015」软件包管理器的更多相关文章

  1. 【LOJ】 #2130. 「NOI2015」软件包管理器

    题解 连树剖我都写跪一次,我现在怎么那么老年啊= = 简直滚粗预定了啊.. 我们线段树维护树剖只需要资瓷区间覆盖和区间求和就好了 安装的时候看看自己到根有多少包装了,dep减去这个数量就好 卸载的时候 ...

  2. 「NOI2015」软件包管理器

    题目描述 题面比较啰唆,我先把大体意思讲一下: 首先,有编号从\(0\)到\(N-1\)的\(N\)个节点,根节点一定是\(0\)号节点(无前驱) (我把下标都加上了一,转化为以\(1\)为起始下标的 ...

  3. 「NOI2015」「Codevs4621」软件包管理器(树链剖分

    4621 [NOI2015]软件包管理器 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond   题目描述 Description Linux用户和OSX用户一定对 ...

  4. 【BZOJ4196】【NOI2015】软件包管理器(树链剖分,线段树)

    [BZOJ4196][NOI2015]软件包管理器 题面 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你 ...

  5. BZOJ_4196_[NOI2015]_软件包管理器_(树链剖分)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=4196 给出一棵树,树上点权为0或1.u权值为1的条件是从根节点到u路径上的所有点权值都为1.u ...

  6. 【NOI2015】 软件包管理器 - 树链剖分

    noi2015 软件包管理器 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软 ...

  7. 【NOI2015】软件包管理器

    NOI难得的水题,话说还是T2诶……又学到了线段树的一种新的魔性使用 看sxysxy大神的代码才写出来的,sxysxy_orz 原题: Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包 ...

  8. NOI2015 D1T2 软件包管理器

    题目传送门; 这个貌似是我这个蒟蒻做的第一道NOI系列的题了吧...这题的算法是树链剖分,其实基本上就是很常见的树剖+线段树,题目既然是要求每次安装或卸载改变的软件包的数目,那么就在每次操作前记录下线 ...

  9. 【BZOJ4196】【Noi2015】软件包管理器

    原题传送门 题意: 给你一棵树,有2种操作: 1.使得某个点到根节点路径上的所有点权值赋为1. 2.使得某节点的子树中所有节点权值赋为0. 每次操作要求输出权值更改的节点个数. 解题思路: 显然是用树 ...

随机推荐

  1. day1 java基础回顾-泛型

    2.泛型(Generic) 当集合中存储的对象类型不同时,那么会导致程序在运行的时候的转型异常 1 import java.util.ArrayList; 2 import java.util.Ite ...

  2. Spring入门第七课

    Bean之间的关系:继承和依赖. 继承Bean配置 Spring允许继承bean的配置,被继承的bean称为父bean,继承这个父bean的Bean称为子Bean. 子Bean从父Bean中继承配置, ...

  3. [Makefile] 递归编译的Makefile的实现

    转自:http://www.linuxidc.com/Linux/2017-01/139702.htm 最近写了一个递归Makefile,目的是既可以实现子模块的单独编译,也可以不做任何修改就和整个程 ...

  4. Gridview 每秒刷新数据

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx. ...

  5. js 常用排序

    1. 冒泡排序 原理:从第一个元素开始,把当前元素和下一个索引元素进行比较.如果当前元素大,那么就交换位置,重复操作直到比较到最后一个元素 function bubbleSort(arr) { if ...

  6. ue4 fuck

    https://answers.unrealengine.com/questions/661969/uspringarmcomponent-ucameracomponent-not-identifie ...

  7. iOS 隐藏百度地图SDK的百度LOGO

    第一个思路:找到LOGO对应的UIIMageView,并将其隐藏hidden // 隐藏百度地图Logo UIView *mView = _mapView.subviews.firstObject; ...

  8. net Core 2.0应用程序发布到IIS

    .net Core 2.0应用程序发布到IIS上注意事项   .net Core2.0应用程序发布window服务器报错容易错过的配置. 1.应用程序发布. 2.IIS上新建网站. 3.应用程序池选择 ...

  9. Identity Service

    Identity Service - 解析微软微服务架构eShopOnContainers(二)   接上一篇,众所周知一个网站的用户登录是非常重要,一站式的登录(SSO)也成了大家讨论的热点.微软在 ...

  10. ASM 磁盘组的的scrip

    之前经常用如下方式进行查询:步骤 1 以oracle用户登录系统.步骤 2 执行如下命令改变ORACLE_SID环境变量.$ export ORACLE_SID=+ASM1[1或者2]需要通过ps - ...