题面:https://www.luogu.org/problemnew/lists?name=2146

这道题要用树链剖分,我博客里有对树链剖分的详细介绍

这道题就是树链剖分的模板,详细解释见程序。

学完树的dfs序,lca,线段树食用更佳。

不会这些学什么树剖(逃~

#include <bits/stdc++.h> //万能头文件
using namespace std;
int n,q,tot;
int fa[100005],size[100005],dep[100005],son[100005];
int lo[100005],top[100005];
int sum[800005],tag[800005];
vector <int> allson[100005];
//线段树
void pushup(int x)//更新
{
sum[x]=sum[x<<1]+sum[(x<<1)+1];
}
void pushdown(int x,int l,int r)//清除懒标记
{
if(tag[x]!=-1)
{
int m=(l+r)>>1;
int ls=x<<1;
int rs=ls+1;
tag[ls]=tag[rs]=tag[x];
sum[ls]=(m-l+1)*tag[x];
sum[rs]=(r-m)*tag[x];
tag[x]=-1;
}
}
void update(int x,int l,int r,int L,int R,int v)//修改
{
if(R<l||r<L)
return;
if(L<=l&&r<=R)
{
sum[x]=(r-l+1)*v;
tag[x]=v;
return;
}
pushdown(x,l,r);
int m=(l+r)>>1;
update(x<<1,l,m,L,R,v);
update((x<<1)+1,m+1,r,L,R,v);
pushup(x);
}
//树链剖分
void change(int x,int y,int v)//类似lca
{
int fx=top[x],fy=top[y];
while(fx!=fy)
{
if(dep[fx]<dep[fy])
swap(x,y),swap(fx,fy);
update(1,1,tot,lo[fx],lo[x],v);
x=fa[fx],fx=top[x];
}
if(lo[x]>lo[y])
swap(x,y);
update(1,1,tot,lo[x],lo[y],v);
}
void dfs1(int x)
{
size[x]=1;
for(int i=0;i<allson[x].size();++i)
{
int v=allson[x][i];
dep[v]=dep[x]+1;//深度
dfs1(v);
size[x]+=size[v];//子树大小
if(size[v]>size[son[x]])
son[x]=v;//重儿子
}
}
void dfs2(int x,int t)
{
lo[x]=++tot;
top[x]=t;//重链父亲
if(son[x])
dfs2(son[x],t);
for(int i=0;i<allson[x].size();++i)
{
int v=allson[x][i];
if(v!=son[x])
dfs2(v,v);
}
}
int main()
{
memset(tag,-1,sizeof(tag)); //lazy_tag为-1表示没有
ios::sync_with_stdio(0);
cin>>n;
fa[1]=1;
for(int i=2;i<=n;++i)
{
int x;
cin>>x;
fa[i]=x+1;
allson[x+1].push_back(i);
}
//预处理
dfs1(1);
dfs2(1,1);
cin>>q;
while(q--)
{
string s;
int x;
cin>>s>>x;
x++;
int before=sum[1];//改之前
if(s=="install")
{
change(1,x,1);//1到x路上全改成1
int after=sum[1];//改后
cout<<fabs(before-after)<<endl;
}
else
{
update(1,1,n,lo[x],lo[x]+size[x]-1,0);//把x的子树改成0
int after=sum[1];//改后
cout<<fabs(before-after)<<endl;
}
}
return 0;
}

【题解】Luogu P2146 [NOI2015]软件包管理器的更多相关文章

  1. 【luogu P2146 [NOI2015]软件包管理器】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2146 变量名真毒瘤 我真的再也不把l,left,r,right弄反了 反向思维更好做一些 #include ...

  2. Luogu P2146 [NOI2015]软件包管理器 树剖

    卸载:把子树清空: 安装:把自己到$1$的链改为$1$ #include<cstdio> #include<iostream> #include<cstring> ...

  3. 题解 P2146 [NOI2015]软件包管理器

    P2146 [NOI2015]软件包管理器 感觉代码比其他题解更简洁qwq 树链剖分模板题 install x:将1~x的路径上的节点全部变成1(安装x需要先安装1~x) uninstall x:将x ...

  4. 洛谷 P2146 [NOI2015]软件包管理器 解题报告

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

  5. [Luogu 2146] NOI2015 软件包管理器

    [Luogu 2146] NOI2015 软件包管理器 树剖好题. 通过对题目的分析发现,这些软件构成一棵树,\(0\) 是树根. 每下载一个软件,需要下载根到这个软件的路径上的所有软件: 每卸载一个 ...

  6. 洛谷 P2146 [NOI2015]软件包管理器 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 输出样例#1: 输入样例#2: 输出样例#2: 说明 说明 思路 AC代码 总结 题面 题目链接 P ...

  7. P2146 [NOI2015]软件包管理器

    题目链接:https://www.luogu.org/problemnew/show/P2146 题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安 ...

  8. 洛谷 P2146 [NOI2015]软件包管理器 (树链剖分模板题)

    题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...

  9. 【Luogu P2146】软件包管理器

    Luogu P2146 由于对于每一个软件包有且只有一个依赖的软件包,且依赖关系不存在环. 很显然这是一个树形的结构. 再看题目要求的操作,安装实际上对应的是覆盖根节点到当前节点的路径,卸载则是覆盖该 ...

随机推荐

  1. 常用的Lunix命令 记录

    使用normal模式下的  v命令,进入visual模式,v+ j/k/h/l   进行文本选中 对于选中的文本进行如下按键: (1.1)d   ------ 剪切操作 (1.2)y   ------ ...

  2. 自定django登录跳转限制

    django自定义一个登录跳转限制: 解释: 不登录不让跳转到其它页面. 原理: 做一个装饰器,在访问路由时,先进行判断,登录session是否存在,如果存在则跳转,不存在则返回到登录页面.或者你可以 ...

  3. XXE攻击学习

    环境:lAMP simplexml_load_string.php代码内容 <?php $data = file_get_contents('php://input'); $xml = simp ...

  4. maven pom文件报错:Multiple annotations found at this line 解决方案(转)

    研究maven多模块项目时,因为家里和公司不能同时开发,所以把家里搭建好的项目复制到公司继续研究, 当时家里的电脑搭建好项目之后是没问题的,但是复制到公司的eclipse上之后就看到pom文件出现下面 ...

  5. caffe-ssd的GPU安装时make runtest报错: BatchReindexLayerTest/3.TestGradient, where TypeParam = caffe::GPUDevice<double>

    报错原因:装了两个cuda,BatchReindexLayerTest/3.TestGradient不能确定用那个 解决办法1:删除其中一个(最好删除9.1,TensorFlow支持的是9.0,为了后 ...

  6. 10.for

    要遍历一个范围(如数组或表),使用 for 循环.在数组上迭代时,当前数组元素存储在循环变量中.在遍历字典时, index 存储在循环变量中. (in 内容测试) for x in [5, 7, 11 ...

  7. 4.无监督学习--K-means聚类

    K-means方法及其应用 1.K-means聚类算法简介: k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低.主要处理过程包括: 1.随机选择k个点作为 ...

  8. jQuery筛选--find(expr|obj|ele)和siblings([expr])

    find(expr|obj|ele) 概述 搜索所有与指定表达式匹配的元素.这个函数是找出正在处理的元素的后代元素的好方法 参数 expr  用于查找的表达式 jQuery object   一个用于 ...

  9. Life Winner Bo (博弈论)

    kind:维持让对手处于(奇数,奇数)的状态,就能赢. rook:维持让对手处于(A,A)相等的状态,就能赢. knight:画图找规律,没有到达终点的就是平局. queen:威佐夫博弈论,终点不一样 ...

  10. arm cortex-m0plus源码学习(三)GPIO

    概述: Cortex-m0的integration_kit提供三个GPIO接口,其中GPIO0传输到外部供用户使用,为EXTGPIO:GPIO1是内核自己的信号,不能乱改,会崩掉:GPIO2是一些中断 ...