Luogu 2146 [NOI 2015] 软件包管理器

2023-05-16

          • 传送门
          • 思路
          • 参考代码

传送门
思路

  唉,我太弱了,什么都不会,好不容易遇到一道傻逼题,又出了个傻逼错误,爆得只剩 30 30 分了。唉,我太弱啦!

  显然,安装了的软件是一棵以 0 0 为根的树。安装某个包需要安装根结点到这个包的路径上的所有包;卸载某个包需要卸载这个包的子树的所有包。显然这两个问题都可以单独用 DFS 序在 O(nlogn) 的时间内解决。现在要求两个问题一起解决,那就用 O(nlog2n) O ( n log 2 ⁡ n ) 的树剖就好了。而且链上操作和子树操作显然是树剖资瓷的操作。

  于是我傻逼地写错了链上操作的循环部分。

参考代码
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <cassert>
#include <cctype>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <list>
#include <functional>
typedef long long LL;
typedef unsigned long long ULL;
using std::cin;
using std::cout;
using std::endl;
typedef int INT_PUT;
INT_PUT readIn()
{
    INT_PUT a = 0; bool positive = true;
    char ch = getchar();
    while (!(ch == '-' || std::isdigit(ch))) ch = getchar();
    if (ch == '-') { positive = false; ch = getchar(); }
    while (std::isdigit(ch)) { a = a * 10 - (ch - '0'); ch = getchar(); }
    return positive ? -a : a;
}
void printOut(INT_PUT x)
{
    char buffer[20]; int length = 0;
    if (x < 0) putchar('-'); else x = -x;
    do buffer[length++] = -(x % 10) + '0'; while (x /= 10);
    do putchar(buffer[--length]); while (length);
    putchar('\n');
}

const int maxn = int(1e5) + 5;
int n;
struct Graph
{
    struct Edge
    {
        int to, next;
    } edges[maxn];
    int i;
    int head[maxn];
    Graph() : i() { memset(head, -1, sizeof(head)); }
    void addEdge(int from, int to)
    {
        edges[i].to = to;
        edges[i].next = head[from];
        head[from] = i;
        i++;
    }
#define idx(G) idx_##G
#define wander(G, node) for (int idx(G) = G.head[node]; ~idx(G); idx(G) = G.edges[idx(G)].next)
#define DEF(G) const Graph::Edge& e = G.edges[idx(G)]; int to = e.to
} T;

class TreeChain
{
    Graph& G;

public:
    TreeChain() : G(T) {}

private:
    int parent[maxn];
    int size[maxn];
    int heavy[maxn];
    void DFS1(int node)
    {
        heavy[node] = -1;
        size[node] = 1;
        wander(G, node)
        {
            DEF(G);
            parent[to] = node;
            DFS1(to);
            size[node] += size[to];
            if (!~heavy[node] || size[heavy[node]] < size[to])
                heavy[node] = to;
        }
    }
    int dfn[maxn];
    int end[maxn];
    int top[maxn];
    int stamp;
    void DFS2(int node, int belong)
    {
        if (belong == -1)
            belong = node;
        dfn[node] = ++stamp;
        top[node] = belong;
        if (heavy[node] != -1)
            DFS2(heavy[node], belong);
        wander(G, node)
        {
            DEF(G);
            if (to == heavy[node]) continue;
            DFS2(to, -1);
        }
        end[node] = stamp;
    }

    class SegTree
    {
        struct Node
        {
            int sum;
            int lazy;
            bool bLazy;
            Node() : sum(), lazy(), bLazy() {}
        } nodes[maxn * 2];
        static inline int code(int l, int r)
        {
            return (l + r) | (l != r);
        }

        int g_L, g_R, g_Val;
        inline void cover(Node& t, int l, int r, int v)
        {
            t.sum = v * (r - l + 1);
            t.lazy = v;
            t.bLazy = true;
        }
        inline void pushdown(int l, int r)
        {
            Node& t = nodes[code(l, r)];
            if (t.bLazy)
            {
                int mid = (l + r) >> 1;
                Node& lc = nodes[code(l, mid)];
                Node& rc = nodes[code(mid + 1, r)];
                cover(lc, l, mid, t.lazy);
                cover(rc, mid + 1, r, t.lazy);
                t.bLazy = false;
            }
        }
        int handle(int l, int r)
        {
            Node& t = nodes[code(l, r)];
            int ret = 0;
            if (g_L <= l && r <= g_R)
            {
                ret = t.sum;
                cover(t, l, r, g_Val);
                return ret;
            }
            pushdown(l, r);
            int mid = (l + r) >> 1;
            if (g_L <= mid) ret += handle(l, mid);
            if (g_R > mid) ret += handle(mid + 1, r);
            t.sum = nodes[code(l, mid)].sum + nodes[code(mid + 1, r)].sum;
            return ret;
        }

    public:
        int queryAndModify(int l, int r, int v)
        {
            g_L = l;
            g_R = r;
            g_Val = v;
            return handle(1, n);
        }
    } st;

public:
    void init()
    {
        parent[0] = -1;
        DFS1(0);
        DFS2(0, -1);
    }
    int modifySubtree(int node)
    {
        int sum = st.queryAndModify(dfn[node], end[node], 0);
        return sum;
    }
    int modifyChain(int node)
    {
        int sum = 0;
        while (~node)
        {
            sum += (dfn[node] - dfn[top[node]] + 1) - st.queryAndModify(dfn[top[node]], dfn[node], 1);
            node = parent[top[node]];
        }
        return sum;
    }
} tc;

void run()
{
    n = readIn();
    for (int i = 1; i < n; i++)
        T.addEdge(readIn(), i);
    tc.init();

    int m = readIn();
    while (m--)
    {
        char ins[15];
        scanf("%s", ins);
        if (ins[0] == 'i')
            printOut(tc.modifyChain(readIn()));
        else if (ins[0] == 'u')
            printOut(tc.modifySubtree(readIn()));
    }
}

int main()
{
    run();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Luogu 2146 [NOI 2015] 软件包管理器 的相关文章

  • Visual Studio 2017/2015远程调试Linux程序(opencv)

    liu
  • 面试经历---YY欢聚时代(2015年11月21日上午初试、25日下午复试)

    YY欢聚时代一年多前去面试过一次 xff0c 当时鄙视了 xff0c 在现在的公司呆了1年半了 xff0c 感觉做得很不爽 xff0c 而且薪资又不满意 xff0c 所以想找个新工作 xff0c 就想去YY面试 下面将两次YY面试的经历写出
  • MySQL DataSource 性能对比(2015-8-19)

    1 本地性能测试耗时 xff08 一 xff09 共同条件 xff1a 测试程序与数据库在同一台主机上 xff0c 各DataSource均采用默认配置 xff0c 每个线程循环1000次 xff0c 查询语句为select from ta
  • 百度2015校园招聘软件开发笔试题及答案

    简单题 xff08 本题共30分 xff09 请简述Tcp ip的3次握手以及4次挥手过程 xff1f 并解释为何关闭连接需要4次挥手 10分 详细答案参见TCP IP协议三次握手与四次握手流程解析 TCP三次握手 四次挥手过程如下 通常情
  • 颜色代码表#FFFFFF #FF0000 #00FF00 #FF00FF (2015-07-21 10:39)转载

    标签 xff1a 颜色代码表 白色 ffffff 红色 ff0000 黑色 000000 it 分类 xff1a hht 1 白色 FFFFFF 2 红色 FF0000 3 绿色 00FF00 4 蓝色 0000FF 5 牡丹红 FF00F
  • 【2015-2016,我在路上】

    前言 xff1a 每天 xff0c 每时 xff0c 每分 xff0c 时光的步伐永远不会停止 xff0c 当我提起笔 xff0c 写下的这一瞬间 xff0c 时间又是一年 xff0c 一年的时光 xff0c 在没逝去时 xff0c 感觉很
  • 2015-2016 ACM-ICPC Pacific Northwest Regional Contest Div.2( Problem V Gears)

    题目地址 xff1a 点击打开链接 题意 xff1a 给你很多齿轮 xff0c 让你判断第一个齿轮和第n个齿轮的关系 有三种关系题目中已经给出 解题思路 xff1a 算是比较直观的一个dfs题目了 xff0c 重点是怎么样处理这个dfs 结
  • luogu P1593 因子和

    不要吐槽博主总做这些数论氵题 首先我们看到这种因数问题 果断质因数分解 所以当前数 a 61 p 1 k 1 p 2 k 2 p m k m 可得 a b 61 p 1 k 1 b p 2 k 2 b p m k m b 考虑因数和 假设数
  • 安装Visual Studio 2015时出现安装包丢失或损坏

    1 现象描述 在线安装vs时 xff0c 在线下载一直为0 xff0c 提示网络异常 xff0c 检查网络 xff1b 实际网络是能联网的 离线安装ISO xff0c 安装1分钟左右 提示安装包损坏或丢失 xff0c 选择从inter下载或
  • Luogu 3631 [APIO 2011] 方格染色

    传送门思路参考代码细节 传送门 思路 很不错的一道题 xff0c 用到的东西不深 xff0c 但是要想到确实需要一定思维 一开始我想的是动态规划 xff0c 发现如果要设状态需要知道一个格子左边 xff0c 上边和左上边三个格子的状态 然后
  • Luogu 3632 [APIO 2011] 寻路

    传送门正解参考代码 传送门 正解 暴力连边跑最短路就好了 xff0c 只不过代码太长太难写啦 xff01 参考代码 span class hljs preprocessor include lt cstdio gt span span cl
  • Luogu 3647 [APIO 2014] 连珠线

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 又看错题了 题目中说一个新的珠子和一个已经添加的珠子连接起来 xff0c 我没有看到 xff0c 然后就凉了 立个 flag xff1a 已经连续看错五题了 xff0c
  • Luogu 3645 [APIO 2015] 雅加达的摩天楼

    传送门思路正解参考代码Update 传送门 思路 唉 xff0c 我太弱了 xff0c 我都看出来要分块了 xff0c 就是做不来 不过终于把题读对了 先来看子任务三怎么做 显然可以有一个 O m 2 O m 2
  • Luogu 1117 [NOI 2016] 优秀的拆分

    传送门思路利用后缀数组解决重复子串问题注意事项参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 连暴力都想不到 xff0c 唉 xff0c 我太弱啦 xff01 考虑暴力法 xff0c 可以枚举一个中间点
  • 2015考研数学复习全书【数一】

    2015考研数学复习全书 数一 链接 https pan baidu com s 1nuXM0fINXRKCYbyy o kSg 提取码 vr45 复制这段内容后打开百度网盘手机App xff0c 操作更方便哦
  • 我的2014作的一手好死,2015求轻虐

    真的好想上来开头就写 新的一年 xff0c 全新的自己 xff0c 但是这样自欺欺人的话我还是别说了 xff0c 省得一大批损友又来吐嘈我 2015年希望找到自己的另一半这样的话我也不想再提了 xff0c 因为这样写了两年 依旧单身 xff
  • 浙江省赛2015 _ J - Convert QWERTY to Dvorak -> ZOJ 3878

    模拟水题 题目 xff1a ZOJ 3878 Edward a poor copy typist is a user of the Dvorak Layout But now he has only a QWERTY Keyboard wi
  • 浙江省赛2015 _ G - Lunch Time -> ZOJ - 3875

    水题 这道题比赛当时没有做出来 原因是 ends xff0c C 43 43 对ends的处理是在缓冲区插入 0 然后刷新 xff0c 而不是空格 xff0c 能输出空格是因为Windows对 0 默认的处理方式是输出一个空格 xff0c
  • P1586 四方定理

    Powered by NEFU AB IN Link 文章目录 P1586 四方定理 题意 思路 代码 P1586 四方定理 题意 四方定理是众所周知的 任意一个正整数n 可以分解为不超过四个整数的平方和 给定的正整数n 编程统计它能分解的
  • [NOI 2015复习][BZOJ 1509][NOI 2003]逃学的小孩(树的直径)

    题目链接 http www lydsy com JudgeOnline problem php id 1509 题目大意 要从一棵树中找出三个点 X Y Z X Y Z 使得 min dis A C dis B C dis A B min

随机推荐

  • Luogu 3631 [APIO 2011] 方格染色

    传送门思路参考代码细节 传送门 思路 很不错的一道题 xff0c 用到的东西不深 xff0c 但是要想到确实需要一定思维 一开始我想的是动态规划 xff0c 发现如果要设状态需要知道一个格子左边 xff0c 上边和左上边三个格子的状态 然后
  • Luogu 3632 [APIO 2011] 寻路

    传送门正解参考代码 传送门 正解 暴力连边跑最短路就好了 xff0c 只不过代码太长太难写啦 xff01 参考代码 span class hljs preprocessor include lt cstdio gt span span cl
  • Luogu 3634 [APIO 2012] 守卫

    传送门思路正解参考代码 传送门 思路 感觉自己越来越笨了 首先 xff0c 很明显这道题需要把没有看到忍者的区间给删去 xff0c 可以用前缀和 O n O n 处理 xff0c 然后对没有删去的地方重新标号 重新标号时 xff0c 需要对
  • Luogu 1552 [APIO 2012] 派遣

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 题读错了两次 xff0c 一开始读成了一个一般的背包 xff0c 然后读成了一个价值和花费相同的背包 xff0c 最后才发现原来是一个价值为 1
  • 贪玩 CF 之旅

    文章目录 CF 7D Palindrome Degree http codeforces com problemset problem 7 D 题解 CF 713C Sonya and Problem Wihtout a Legend ht
  • Luogu 3638 [APIO 2013] 机器人

    传送门思路正解参考代码关于 SPFA 传送门 思路 n n 这么小 会不会是搜索题 稍有经验的我直接否定了这个结论 仔细读题并分析样例 发现原来一个位置可以有多个机器人 且机器人行走的时候无视其它机器人 那这个就是一张图啊 可以将这张图预处
  • Luogu 3647 [APIO 2014] 连珠线

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 又看错题了 题目中说一个新的珠子和一个已经添加的珠子连接起来 xff0c 我没有看到 xff0c 然后就凉了 立个 flag xff1a 已经连续看错五题了 xff0c
  • 【转】mingw64的安装方法

    转自 xff1a http write blog csdn net postlist mingw64的安装方法 1 下载ming w64 http sourceforge net projects mingw w64 files or x8
  • Luogu 3645 [APIO 2015] 雅加达的摩天楼

    传送门思路正解参考代码Update 传送门 思路 唉 xff0c 我太弱了 xff0c 我都看出来要分块了 xff0c 就是做不来 不过终于把题读对了 先来看子任务三怎么做 显然可以有一个 O m 2 O m 2
  • Luogu 3644 [APIO 2015] 八邻旁之桥

    传送门思路当 k 61 2 时参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 题也做不来 很明显这道题先要把不过河的人排除了 xff0c 剩下的都是要过河的 当 k 61 1 k 61 1 时 xff0
  • Luogu 3646 [APIO 2015] 巴厘岛的雕塑

    传送门总结 APIO 2015思路参考代码总结 传送门 总结 APIO 2015 争取今天做完一套 QAQ T1 我最多之能想到从高位向低位做 xff0c 然后就完全不会了 xff1b T2 我想到了分情况讨论 xff0c 但是没有建图成功
  • UOJ 2016 [APIO 2016] Gap

    传送门思路参考代码交互题 交互题大致形式Windows 平台下 xff08 Dev C 43 43 xff09 Ubuntu 平台下 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 题也做不来 这道题简直就是利用
  • CF 940F Machine Learning

    传送门题目大意思路参考代码Remarks 传送门 题目大意 给你一个数组 a 1 n n 10 5 a 1 n
  • CF 976D Degree Set

    传送门题目大意思路参考代码总结 传送门 题目大意 给你一个长度为 n n 的正整数序列 d 1 d 2 d n d1 d2 dn xff08 d 1 lt d 2 lt lt d n
  • Luogu 3778 [APIO 2017] 商旅

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 看到这道题就想到了二分答案找负环 xff0c 但是怎么做呢 xff1f 完全不会 唉 xff0c 我太弱啦 xff01 先注意题目中说可以重复经过点和边 x
  • CF 963E Circles of Waiting

    传送门题目大意思路参考代码 传送门 题目大意 在平面直角坐标系上 xff0c 有一个神奇的点 xff0c 一开始在 0 0 0 0 每秒钟这个点都会随机移动 xff1a 如果它在 x y
  • CF 976F Minimal k-covering

    传送门题目大意 输入格式输出格式 思路参考代码 传送门 题目大意 给你一张二分图 G 61 U V E G 61 U V
  • CF 963A Alternating Sum

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 好不容易做得来一道题 xff0c 还是 A 题 xff08 所以不要瞧不起 A 题 xff09 xff0c 结果还写错了 xff08 不知道为什
  • iOS中瀑布流布局详解

    前段时间在逛淘宝的时候发现淘宝的商品界面的布局是瀑布流 我记得明明之前不是瀑布流的 x1f611 刚好手上活忙完了 xff0c 写了一个瀑布流的布局 xff0c 简单的封装了下 xff0c 以便日后使用 x1f60f 其实说到底瀑布流也就是
  • Luogu 2146 [NOI 2015] 软件包管理器

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 好不容易遇到一道傻逼题 xff0c 又出了个傻逼错误 xff0c 爆得只剩 30 30 分了 唉 xff0c 我太弱啦 xff01 显然 xff