https://www.luogu.org/problemnew/show/P2146 传送门

简单的树链剖分......维护下当前安装了多少个包......修改后查询下就行了......附上极其丑陋的代码......

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

;
int head[N], to[N], v[N], p;
void build(int a, int b) {    v[++ p] = b; to[p] = head[a]; head[a] = p; }

#define mid (l + r >> 1)
], lazy[N << ];

void push_down(int c, int l, int r) {
    if( !lazy[c]) return ;
    lazy[c] --;
    tr[c << ] = (mid - l + ) * lazy[c]; tr[c << |] = (r - mid) * lazy[c];
    lazy[c << ] = lazy[c << |] = lazy[c] + ; lazy[c] = ;
}

void change(int c, int l, int r, int L, int R, int o) {
    if( L <= l && R >= r) {
        tr[c] = (r - l + ) * o; lazy[c] = o + ; return ;
    }
    push_down(c, l, r);
    , l, mid, L, R, o);
    |, mid+, r, L, R, o);
    tr[c] = tr[c << ] + tr[c << |];
}

int get_(int c, int l, int r, int L, int R) {
    if( l == L && R == r) return  tr[c];
    push_down(c, l, r);
    , l, mid, L, R);
    |, mid+, r, L, R);
    , l, mid, L, mid) + get_(c << |, mid+, r, mid+, R);
}

int son[N], si[N];
void search(int u) {
    si[u] = ; son[u] = ;
    for( int i = head[u]; ~i; i = to[i]) {
        search(v[i]), si[u] += si[v[i]];
        if( si[v[i]] > si[son[u]]) son[u] = v[i];
    }
}

int top[N], dfs[N], dfn[N], cnt;
void build_son(int u, int c) {
    top[u] = c; dfs[u] = ++cnt;
    if( son[u]) build_son(son[u], c);
    for( int i = head[u]; ~i; i = to[i])
        if( v[i] != son[u]) build_son(v[i], v[i]);
    dfn[u] = cnt;
}

int n, q, pre[N];
void query(int a) {
    ];
    while( a) {
        change(, , n, dfs[top[a]], dfs[a], ); a = pre[top[a]];
    }printf(] - tcmp);
}

];
int main() {
    scanf(, ;
    ; i <= n; i ++) scanf("%d", pre + i), pre[i] ++ ;
    ; i <= n; i ++) build(pre[i], i);

    search();build_son(, );
    scanf("%d", &q);
    , a; i <= q; i ++) {
        scanf("%s%d", s, &a); a ++;
        ] == 'i') query(a);
        else {
            ]; change(, , n, dfs[a], dfn[a], );
            printf(]);
        }
    }
}

洛谷P2146 [NOI2015]软件包管理器的更多相关文章

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

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

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

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

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

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

  4. 洛谷 P2146 [NOI2015]软件包管理器

    真没有想到,这竟然会是一道NOI的原题,听RQY说,这套题是北大出的,北大脑抽认为树剖很难... 只恨没有早学几年OI,只A这一道题也可以出去吹自己一A了NOI原题啊 好了,梦该醒了,我们来看题 以后 ...

  5. 洛谷P2146 [NOI2015]软件包管理器 题解 树链剖分+线段树

    题目链接:https://www.luogu.org/problem/P2146 本题涉及算法: 树链剖分: 线段树(区间更新及求和,涉及懒惰标记) 然后对于每次 install x ,需要将 x 到 ...

  6. 洛谷 pP2146 [NOI2015]软件包管理器

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

  7. 洛谷 2146 [NOI2015]软件包管理器

    [题解] 每个软件只依赖另一个软件,且依赖关系不构成环,那么很容易想到这是树形结构. 我们用1表示以安装,用0表示未安装或已卸载:那么安装一个软件,就是把它到树根的路径上所有的点都改为1:卸载一个软件 ...

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

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

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

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

随机推荐

  1. laravel中的数据库操作(增删改查)方法一

    导入命名空间和DBnamespace App\Http\Controllers; use Illuminate\Support\Facades\DB; public function index(){ ...

  2. Druid配置属性列表及含义

    前两天,在排查springBoot使用双数据源出现的运行一段时候出现了数据库连接断开的问题的时候,查了很多关于Druid数据库连接池配置的文章,虽然最后问题的原因不是属性配置的问题,也可以说是 属性配 ...

  3. cocos2d-x 在vs2010下的环境配置

    cocos2d-x编译完成之后生成了一堆动态库,在window下分别为.dll , .lib ,其中*lib是在编译的时候需要链接的,*.dll是在运行的时候依赖的.所以当我们创建一个cocos2d- ...

  4. mybatis 框架 的应用之三(操作两张没有关联的表,存在主键和外键关系)

    #注意:要配置开启多条语句操作,否则会报错( org.apache.ibatis.exceptions.PersistenceException) lf-driver=com.mysql.jdbc.D ...

  5. SqlServer—大话函数依赖与范式

    说明:数据库中的某些概念真的很让人头疼,概念的东西本来就是很枯燥的,再加上枯燥的学习,那就更加枯燥了.概念这东西,你不理解也能生产东西,经验多了就行,但是为了更深入的学习,你还必须理解.这里,我抛开书 ...

  6. linux的deamon后台运行

    有的时候需要将程序一直跑在后台,比如一些服务类代码,或者一些监控类代码.使用deamon是正确的一种思路. 以前我们在看<unix环境高级编程>的时候,有专门的整章详细介绍如何编写一个后台 ...

  7. CF570D Tree Requests

    离线 + 树状数组 如果子树中的一个深度的所有点中有两个以上的字母出现了奇数次,那么这个询问的答案就是$No$,其他的情况吧都是$Yes$. 由于只有$26$个字母,我们可以考虑暴力检验,把树映射到$ ...

  8. 半平面交 (poj 1279(第一道半平面NlogN)完整注释 )

    半平面交的O(nlogn)算法(转载) 求n个半平面的交有三种做法: 第一种就是用每个平面去切割已有的凸多边形,复杂度O(n^2). 第二种就是传说中的分治算法.将n个半平面分成两个部分,分别求完交之 ...

  9. dynamic和nullable一起使用时的注意

    dynamic和nullable一起使用时的注意

  10. MySQL性能调优与架构设计——第6章 MySQL Server 性能的相关因素

    第6章 MySQL Server 性能的相关因素 前言 大部分人都一致认为一个数据库应用系统(这里的数据库应用系统概指所有使用数据库的系统)的性能瓶颈最容易出现在数据的操作方面,而数据库应用系统的大部 ...