首页 > 其他分享 >蓝桥杯 2014 国 C- 套娃 【倍增】

蓝桥杯 2014 国 C- 套娃 【倍增】

时间:2022-12-18 21:11:08浏览次数:70  
标签:套娃 int top father 蓝桥 link 2014 include

参考:https://www.luogu.com.cn/blog/edisnimorF/solution-p8616

题面

https://www.luogu.com.cn/problem/P8616

分析

套娃\(u\)套着\(v\)视为u->v建边,那么整张图就是一棵树。查找入度为\(0\)的点作为根节点即可。

假设\(out[i]\)表示第\(i\)个点已经被断开。那么“打开套娃以看大小为\(x\)的娃娃”实质就是:从\(x\)点出发,一直遇到第一个\(out[i]=1\)的点的距离。

对于\(P\)操作,假设两点分别为\(u\)与\(v\)。在计算完u->v距离后,需要断开u->v路径上所有的点;同时路径上的每个点也需要断开与其相连的每个点(因为套娃一旦拿开,次级的所有套娃都会被拿出来)。

\(Q\)操作则只需要计算距离,不需要断点。

因为查找点的实质是向父节点跳跃,所以只需要倍增即可实现查找(动态)根节点。

\(O(nlogn)\)

Code

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>

const int maxn = 1e5 + 10;
int n, m;
int head[maxn], to[maxn << 1], nxt[maxn << 1], val[maxn << 1];
int tot;

void add(int a, int b) {
    to[++tot] = b;
    nxt[tot] = head[a];
    head[a] = tot;
}

int N;
int fa[maxn << 1][21 + 1];//节点u的2^k祖先
int depth[maxn << 1];
bool link[maxn << 1];

void dfs1(int u, int x) {//预处理fa[u][k]倍增
    fa[u][0] = x;
    depth[u] = depth[x] + 1;
    for (int i = 1; i <= 21; i++)
        fa[u][i] = fa[fa[u][i - 1]][i - 1];
    for (int i = head[u]; i; i = nxt[i]) {
        int v = to[i];
        if (v == x) continue;
        //fa[v][0] = u;
        dfs1(v, u);
    }
}

int solve(int x) {//寻找第一个断开的边
    for (int i = N; ~i; i--) {
        if (fa[x][i] && link[fa[x][i]] == 0) x = fa[x][i];
    }
    return x;
}

int rd[maxn << 1], rt;

int main() {
    scanf("%d%d", &n, &m);
    N = log2(n);
    for (int i = 1; i <= n - 1; i++) {
        int u, v;
        scanf("%d%d", &u, &v);
        rd[v]++;
        add(u, v);
        add(v, u);

    }
    for (int i = 1; i <= n; i++)
        if (!rd[i]) {
            rt = i;
            break;
        }
    dfs1(rt, 0);
    link[rt] = 1;
    while (m--) {
        char ch;
        int t;
        std::cin >> ch;
        scanf("%d", &t);
        if (ch == 'P') {
            if (link[t]) {//已经断开
                for (int i = head[t]; i; i = nxt[i])
                    link[to[i]] = 1;
                puts("0");
                continue;
            }
            int top = solve(t);
            int father = fa[top][0];
            printf("%d\n", depth[t] - depth[father]);
            for (;; t = fa[t][0]) {
                link[t] = 1;
                for (int i = head[t]; i; i = nxt[i])
                    link[to[i]] = 1;
                if (t == father) break;
            }
        } else {
            if (link[t]) {
                puts("0");
                continue;
            }
            int top = solve(t);
            int father = fa[top][0];
            printf("%d\n", depth[t] - depth[father]);
        }
    }
    return 0;
}

标签:套娃,int,top,father,蓝桥,link,2014,include
From: https://www.cnblogs.com/MrWangnacl/p/16990930.html

相关文章

  • 蓝桥杯 2020 国 ABC-答疑 贪心
    题面有\(n\)位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑。一位同学答疑的过程如下:首先进入......
  • 2021年蓝桥杯A组省赛-回路计数 【状压dp】
    题面分析单源最短Hamilton路径的状压dp模板题。\(dp[i][j]\)表示终点为\(j\),经过的点集状态为\(i\)的方案数。假设状态由\(k\)转移到\(j\)。当前计算\(dp[i][j]\),那么i......
  • P8810 [蓝桥杯 2022 国 C] 数组个数 题解
    思路比较简单的一道题。用的五维dp,看到二维和三维的dp直接膜了orz。正文开始。分析不难看出dp。因为\(b_i\)的值只与\(a_{i-1},a_i,a_{i+1}\)有关,所以我们定......
  • k倍区间【第八届蓝桥杯省赛C++B组,第八届蓝桥杯省赛JAVAB组】
    k倍区间给定一个长度为\(N\)的数列,\(A1,A2,…AN\),如果其中一段连续的子序列\(Ai,Ai+1,…Aj\)之和是\(K\)的倍数,我们就称这个区间\([i,j]\)是\(K\)倍区间。你能......
  • SQL2014出现无效的许可证数据,需要重新安装
    SQL2014出现如下状况时:我们需要做如下操作:我这里是因为visualstudio2010Shell失效引起找到SQL2014安装文件夹:路径:sql2014\cn_sql_server_2014_enterprise_editio......
  • 那年不“匆匆”---我的2014年总结
           在《文明之光》的引子中,吴军老师提到:“人类的历史相对我们这个星球的历史,大约相当于一年中的半个小时。”人类是年轻的,对于整个世界,我们只是认识了很小一部......
  • 四平方和【第七届蓝桥杯省赛C++A/B组,第七届蓝桥杯省赛JAVAB/C组】
    四平方和四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和。如果把0包括进去,就正好可以表示为4个数的平方和。比如:\(5=0^2+0^2+1^2......
  • [NEERC2014]Epic Win!
    链接:https://www.luogu.com.cn/problem/P6989题目描述:定义\(RPS\)自动机为一张有向图,每个点有一个\(R,P,S\)中的某个字符表示在这个节点时会出什么手势,同时有三条出边......
  • [AHOI2014/JSOI2014]骑士游戏
    链接:https://www.luogu.com.cn/problem/P4042题目描述:对于一个怪物\(i\),可以花费\(c_{i}\)的代价将其变为一个怪物集合,或花费\(c2_{i}\)的代价消灭他。求消灭怪物\(1\)的......
  • [AHOI2014/JSOI2014]支线剧情
    链接:https://www.luogu.com.cn/problem/P4044题目描述:给定一个\(DAG\),求若干条条路径,覆盖所有的点,并最小化路径的权值和。题解:由于图是一个\(DAG\),所以原问题可以转化......