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. error:crosses initialization of ...的解决办法

    switch(c) { case 0x01: int temp = a + b; .... break; case 0x02: break; default:break; } 此时会报如题所示错误 原 ...

  2. 面试题:ConcurrentHashMap实现线程安全的原理

    在ConcurrentHashMap没有出现以前,jdk使用hashtable来实现线程安全,但是hashtable是将整个hash表锁住,所以效率很低下. ConcurrentHashMap将数据分 ...

  3. 关于前端XSS攻击、短信轰炸等问题

    关于前端的XSS攻击: 这里有一篇Ryf老师的写的关于使用  Content Security Policy (简称 CSP 防御)来防御xss攻击,简单来说就是设置白名单,告诉浏览器哪些链接.内容是 ...

  4. 33.HAVING 子句

    HAVING 子句 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用. SQL HAVING 语法 SELECT column_name, aggregate_f ...

  5. python pipelines 用法

    http://zacstewart.com/2014/08/05/pipelines-of-featureunions-of-pipelines.html http://blog.csdn.net/m ...

  6. django获取字段列表(values/values_list/flat)

    django获取字段列表(values/values_list/flat) values方法可以获取number字段的字典列表 values_list可以获取number的元组列表 values_li ...

  7. MongoDB整理笔记のSharding分片

    这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding 的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB 集群.MongoDB 的数据分块称为 chu ...

  8. mysql 游标CURSOR

    FETCH cursor_works INTO num,provinceIDs,cityIDs,SourceID; 定义的变量值必须与 游标中的字段不同,一一对应 DECLARE cursor_wor ...

  9. 【转】android 布局优化

    前言 本篇文章为Android优化的布局部分,该部分应该是Android中很重要的,无论是在自定义控件中,还是在简单的书写布局时,都应该尽量遵循一些优化原则,这样布局的绘制效率才会更高,体验才能更好. ...

  10. 基于CentOS6定制自己的ISO安装光盘

    警告:转载请注明出处 https://www.cnblogs.com/BoyTNT/p/9322927.html  1.目标 >> 基于CentOS-6.10-x86_64-minimal ...