[题解向] Luogu2146[NOI2015]软件包管理器
#\(\mathcal{\color{red}{Description}}\)
一道\(zz\)的树剖题\(qwq\)。
#\(\mathcal{\color{red}{Solution}}\)
我天\(NOI\)怎么可能有这种水题啊……
很显然的就是 线段树区间染色 + 统计根到每个节点的距离 + 子树和 + 修改子树 ……
纯纯的板子啊!
\(emmmmm\)于是这道题就完了~
#include <cstdio>
#include <vector>
#include <iostream>
#define il inline
#define MAXN 200010
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
#define mid ((l + r) >> 1)
using namespace std ;
char in[30] ;
vector <int> sons[MAXN] ; int Id[MAXN], tot ;
int dis[MAXN << 1], s[MAXN << 1], tag[MAXN << 1], i ;
int N, M, In, fa[MAXN], dep[MAXN], Top[MAXN], sub[MAXN], hs[MAXN] ;
inline int qrr(){
    int k = 0 ; char c = getchar() ;
    while (c < '0' || c > '9') c = getchar() ;
    while (c <= '9' && c >= '0') k = (k << 1) + (k << 3) + c - 48, c = getchar() ;
    return k ;
}
void _dfs1(int deep, int now, int f){
    dep[now] = deep, fa[now] = f ; sub[now] = 1 ;
    int _hs = -1 ;
    for (int k = 0 ; k < sons[now].size() ; ++ k){
        _dfs1(deep + 1, sons[now][k], now) ;
        sub[now] += sub[sons[now][k]] ;
        if(sub[sons[now][k]] > _hs)
            _hs = sub[sons[now][k]], hs[now] = sons[now][k] ;
    }
}
void _dfs2(int now, int Tp){
    Top[now] = Tp, Id[now] = ++ tot ;
    if (!hs[now]) return ;
    _dfs2(hs[now], Tp) ;
    for (int k = 0 ; k < sons[now].size() ; ++ k){
        if (sons[now][k] == hs[now]) continue ;
        _dfs2(sons[now][k], sons[now][k]) ;
    }
}
void build(int rt, int l, int r){
    if (l == r) {dis[rt] = 1 ; return  ;}
    build(ls(rt), l, mid) ;
    build(rs(rt), mid + 1, r) ;
    dis[rt] = dis[ls(rt)] + dis[rs(rt)] ;
}
il void p_d(int rt, int l, int r){
    if(tag[rt] != -1){
        s[ls(rt)] = (mid - l + 1) * tag[rt] ;
        s[rs(rt)] = (r - mid) * tag[rt] ;
        tag[ls(rt)] = tag[rs(rt)] = tag[rt] ;
        tag[rt] = -1 ;
    }
}
int query_D(int rt, int l, int r, int ql, int qr){
    int res = 0 ;
    if (ql <= l && r <= qr){res += dis[rt] ; return res ;}
    if (ql <= mid) res += query_D(ls(rt), l, mid, ql, qr) ;
    if (qr > mid) res += query_D(rs(rt), mid + 1, r, ql, qr) ;
    return res ;
}
int query_C(int rt, int l, int r, int ql, int qr){
    int res = 0 ;
    if (ql <= l && r <= qr){res += s[rt] ; return res ;}
    p_d(rt, l, r) ;
    if (ql <= mid) res += query_C(ls(rt), l, mid, ql, qr) ;
    if (qr > mid) res += query_C(rs(rt), mid + 1, r, ql, qr) ;
    return res ;
}
void update_C(int rt, int l, int r, int ul, int ur, int k){
    if (ul <= l && r <= ur){
         s[rt] = (r - l + 1) * k ;
         tag[rt] = k ;
         return  ;
    }
    p_d(rt, l, r) ;
    if (ul <= mid) update_C(ls(rt), l, mid, ul, ur, k) ;
    if (ur > mid) update_C(rs(rt), mid + 1, r, ul, ur, k) ;
    s[rt] = s[rs(rt)] + s[ls(rt)] ;
}
inline void qv(int now){
    int ans = 0, dif = 0 ;
    while (Top[now] != Top[1]){
        ans += query_D(1, 1, N, Id[Top[now]], Id[now]) ;
        dif += query_C(1, 1, N, Id[Top[now]], Id[now]) ;
        now = fa[Top[now]] ;
    }
    ans += query_D(1, 1, N, 1, Id[now]) ;
    dif += query_C(1, 1, N, 1, Id[now]) ;
    printf("%d\n", ans - dif) ;
}
inline void uv(int now){
    while (Top[now] != Top[1]){
        update_C(1, 1, N, Id[Top[now]], Id[now], 1) ;
        now = fa[Top[now]] ;
    }
    update_C(1, 1, N, 1, Id[now], 1) ;
}
int main(){
    //freopen("manager.in", "r", stdin) ;
    //freopen("manager.out", "w", stdout) ;
    N = qrr() ;
    fill (tag + 1, tag + (MAXN << 1) + 1, -1) ;
    for (i = 2; i <= N ;i ++){
        fa[i] = qrr() + 1,
        sons[fa[i]].push_back(i) ;
    } M = qrr() ;
    _dfs1(1, 1, 0), _dfs2(1, 1), build(1, 1, N) ;
    for (i = 1; i <= M ; i ++){
        scanf("%s", in) ;
        if (in[0] == 'u'){
            In = qrr() + 1 ;
            printf("%d\n", query_C(1, 1, N, Id[In], Id[In] + sub[In] - 1)) ;
            update_C(1, 1, N, Id[In], Id[In]+ sub[In] - 1, 0) ;
            continue ;
        }
        In = qrr() + 1 ;
        qv(In), uv(In) ;
    }
}
番外:以下是三次评测:

最快的是\(qread + printf + O2\),其次是\(qread + printf\),最慢的是\(qread + cout\)……
[题解向] Luogu2146[NOI2015]软件包管理器的更多相关文章
- 题解 P2146 【[NOI2015]软件包管理器】
		题目大意  给你一棵树, 求一点到根的路径上有多少个未标记点并全标记, 和询问一个点的子树内有多少已标记点和撤销标记 解题方法 1: install 操作  这个操作是求一点到根的路径上有多少个未 ... 
- luogu2146 [NOI2015]软件包管理器
		安装就把根节点到它全设为 1 删除就把以它为根的子树全设为 0 记得标记初始化为-1,因为标记是 0 的情况也是要处理的. #include <iostream> #include < ... 
- 【题解】NOI2015软件包管理器
		[题解][P2146 NOI2015]软件包管理器 实际上就是树链剖分板子题. 对于\(install\)操作,直接查询它到\(0\)节点有多少已经安装了的,再用总数减去它. 对于\(uninstal ... 
- 题解 P2146 [NOI2015]软件包管理器
		P2146 [NOI2015]软件包管理器 感觉代码比其他题解更简洁qwq 树链剖分模板题 install x:将1~x的路径上的节点全部变成1(安装x需要先安装1~x) uninstall x:将x ... 
- Bzoj 4196: [Noi2015]软件包管理器  树链剖分
		4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 721 Solved: 419[Submit][Statu ... 
- 【BZOJ4196】[Noi2015]软件包管理器 树链剖分
		[Noi2015]软件包管理器 树链剖分 Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从 ... 
- [UOJ#128][BZOJ4196][Noi2015]软件包管理器
		[UOJ#128][BZOJ4196][Noi2015]软件包管理器 试题描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管 ... 
- 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 ... 
随机推荐
- SQL Server中用户账号在数据库中的安全性,可以控制用户的权限
			今天在公司SQL Server数据库中,查到一个SQL Server用户账号"DemoUser": "DemoUser"不在数据库服务器的sysadmin角色中 ... 
- C#条码生成及打印实例代码
			";//条码 ; ; //打印按钮 private void button1_Click(object sender, EventArgs e) { //实例化打印对象 PrintDocum ... 
- YAML语言简明教程
			编程免不了要写配置文件,如果你还在用xml/ini/json,就有点过时了,怎么写配置也是一门学问. YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便. 本文介绍 YAM ... 
- 无法打开内核设备:\\Global\\vmx86
			关于如题目的问题,网上有好几个解决办法,这里只介绍最方便的一个办法,利用脚本来解决 @Echo Off title Hankcs's program color 8F CD %~d0 CD %~dp0 ... 
- 【转载】C#通过Remove方法移除DataTable中的某一列数据
			在C#中的Datatable数据变量的操作过程中,有时候我们需要移除当前DataTable变量中的某一列的数据,此时我们就需要使用到DataTable变量内部的Columns属性变量的Remove方法 ... 
- Csharp 基础笔记知识点整理
			/* * @version: V.1.0.0.1 * @Author: fenggang * @Date: 2019-06-16 21:26:59 * @LastEditors: fenggang * ... 
- JavaScript 简单类型和复杂类型区别
			一.基本类型 1.概述 值类型又叫做基本数据类型,简单数据类型.在存储时,变量中存储的是值本身,因此叫做值类型 2.基本类型在内存中的存储 基本数据类型存储在栈区中. 3.基本类型作为函数的参数 基本 ... 
- HTML 初始
			HTML(Hyper Text Markup Language的缩写)中文译为“超文本标记语言”,主要是通过HTML标签对网页中的文本.图片.声音等内容进行描述. 一.HTML 骨架结构 每种语言都有 ... 
- 从CMS到G1:LinkedIn个人主页调优实战
			本文转载自公众号:阿飞的博客,阅读大约需要13分钟.阿飞是我认识几年的好友,对技术有很强的专研精神,跟他讨论GC问题的时候一些观点都很深刻. LinkedIn中的个人主页是访问量最多的页面之一,它允许 ... 
- 面试常问的join
			少壮不努力,老大徒伤悲 工作大半辈子了,来到个陌生的过度,从零开始,像个应届毕业生一样投入茫茫人才市场,碰的满头包. 凡是涉及到sql server的都会问,join的问题,不烦记录下: SQL的jo ... 
