首页 > 其他分享 >Codeforces 932D Tree

Codeforces 932D Tree

时间:2024-03-01 09:56:43浏览次数:18  
标签:int sum ans Tree Codeforces 932D i64 fa maxm

首先有个动态加叶子的操作,考虑到树剖需要离线下来预处理,便考虑用倍增来维护。

首先要找到 \(\ge a_u\) 的最深的父亲 \(v\),便可以先用倍增处理好长度为 \(2^i\) 的链上的 \(\max\)。
如果 \(\max < a_u\),就往上跳,跳不了就是到点 \(v\) 了。

考虑连边 \(v\to u\),这仍然会是一棵树(建个虚根为 \(0\))。
于是可以考虑在这棵树上再维护一个 \(2^i\) 长度的链的 \(\sum\)。
如果 \(W\ge sum\) 就可以往上跳并减掉 \(sum\)。

时间复杂度 \(O(n\log n)\)。

代码
#include<bits/stdc++.h>
using i64 = long long;
const i64 inf = 0x3f3f3f3f3f3f3f3f;
const int maxn = 4e5 + 10, maxm = 20;
int fa[maxn][maxm], mx[maxn][maxm];
int fas[maxn][maxm]; i64 sum[maxn][maxm];
inline i64 Sum(i64 a, i64 b) {return std::min(a + b, inf);}
int main() {
    int Q; scanf("%d", &Q);
    int n = 1, ans = 0;
    for (int i = 0; i < maxm; i++) sum[0][i] = inf;
    for (int i = 1; i < maxm; i++) sum[1][i] = inf;
    auto jmp = [&](int u, int v) {
        for (int i = maxm - 1; ~ i; i--) mx[u][i] < v && (u = fa[u][i]);
        return u;
    };
    while (Q--) {
        int op; scanf("%d", &op);
        if (op == 1) {
            int f, w; scanf("%d%d", &f, &w);
            f ^= ans, w ^= ans;
            n++;
            mx[n][0] = w, sum[n][0] = w, fa[n][0] = f;
            for (int i = 1; i < maxm; i++) fa[n][i] = fa[fa[n][i - 1]][i - 1], mx[n][i] = std::max(mx[n][i - 1], mx[fa[n][i - 1]][i - 1]);
            fas[n][0] = jmp(f, w), sum[n][0] = w;
            for (int i = 1; i < maxm; i++) fas[n][i] = fas[fas[n][i - 1]][i - 1], sum[n][i] = Sum(sum[n][i - 1], sum[fas[n][i - 1]][i - 1]);
        } else {
            int u; i64 w; scanf("%d%lld", &u, &w);
            u ^= ans, w ^= ans;
            ans = 0;
            for (int i = maxm - 1; ~ i; i--) w >= sum[u][i] && (ans |= 1 << i, w -= sum[u][i], u = fas[u][i]);
            printf("%d\n", ans);
        }
    }
    return 0;
}

标签:int,sum,ans,Tree,Codeforces,932D,i64,fa,maxm
From: https://www.cnblogs.com/rizynvu/p/18046298

相关文章

  • Tree Queries
    应用DFS序非常好的一道题目首先考虑暴力如何做,我们先考虑删除的点\(a\)在\(x\)下方,那么就相当于移除\(a\)的子树,由于与子树有关,所以可以想到DFS序设\(in[a]\)表示DFS序中\(a\)第一次出现的位置,\(out[a]\)表示DFS序中\(a\)第二次出现的位置当\(x\)固定的时候,如果删除的\(a\)是\(......
  • Codeforces 1455E Four Points
    首先确定每个点最后走到的是哪一个点。这部分可以枚举全排列。假设左上角的点为\((x_0,y_0)\),右上角的点为\((x_1,y_1)\),左下角的点为\((x_2,y_2)\),右下角的点为\((x_3,y_3)\)。令最终的点为\((x'_0,y'_0)\),以此类推。那么最终的答案就是\(\sum\limits_{i=0}^3|......
  • Codeforces 451E Devu and Flowers
    首先考虑没有\(f_i\)的限制的时候,此时可以用插板法得到方案数为\(\binom{s+n-1}{n-1}\)。考虑钦定\(f_i\)不合法,那么就相当于先在\(i\)这里选\(f_i+1\),剩下的随意分配,方案数就为\(\binom{s-(f_i+1)+n-1}{n-1}\)。算完过后能发现会算重存在\(>1\)......
  • Codeforces 1830C Hyperregular Bracket Strings
    考虑到区间的限制\([l,r]\)就是要求\([l,r]\)里的字符会在\([l,r]\)里找到匹配。假设还有个区间\([l',r']\)满足\(l\lel'\ler\ler'\),能够发现限制变成了\([l,l'),[l',r],(r,r']\)这\(3\)个区间内的字符能在对应区间内找到匹配。继续,假设\(l\lel'\le......
  • Codeforces 863E Turn Off The TV
    能发现其实就是区间加查询区间最小值。如果最小值\(>1\)则这个区间可以删掉。考虑离散化端点,先把区间表示为\([l_i,r_i)\)的形式,方便离散化端点。这样子离散化出来的端点也是\([x,y)\)的形式。对于区间加查询区间最小值,很容易用线段树维护。时间复杂度\(O(n\logn)......
  • CF383C Propagating tree 题解
    题目链接:CF或者洛谷比较朴素的题,注意到这个涉及到子树变化,我们考虑优先处理出\(dfs\)序,方便处理。注意到第一个问题较为繁琐,我们着重解决下第一个问题。在树上问题,我们这种间隔点常常使用\(deep\)进行区分。根的\(deep\)为奇数,那么对自己子树范围内的奇数\(deep\)......
  • Codeforces Round 929 (Div. 3)
    CodeforcesRound929(Div.3)A-TurtlePuzzle:RearrangeandNegate代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=pa......
  • 13 Codeforces Round 886 (Div. 4)G. The Morning Star(简单容斥)
    G.TheMorningStar思路:用map记录x,y,以及y-x、y+x从前往后统计一遍答案即可公式\(ans+=cnt[x]+cnt[y]-2*cnt[x,y]+cnt[y+x]+cnt[y-x]\)\(cnt[x]+cny[y]-2*cnt[x,y]\)是统计坐标轴方向的,-2倍是需要把本身这个点给减去容斥是减一倍,这里还需要把自己给挖掉\(cnt[y+x]+cnt[y......
  • Codeforces 264E Roadside Trees
    首先考虑时间增长的问题,设第\(i\)棵树的种植时间为\(t_i\)。那么第\(x\)棵树比第\(y\)棵树高就是\(h_x+(t_y-t_x)>h_y\),也就是\(h_x-t_x>h_y-t_y\)。所以可以直接用\(h_i-t_i\)当作第\(i\)棵树的高度,即\(h'_i\leftarrowh_i-t_i\)。对于增加,考虑......
  • CodeForces 1844H Multiple of Three Cycles
    洛谷传送门CF传送门首先环是不用管的,只用判环长是否为\(3\)的倍数即可。考虑设\(f(x,y,z)\)表示\(x\)个\(1\)链,\(y\)个\(2\)链,\(z\)个\(0\)链,组成所有环长都为\(3\)的倍数的方案数。注意到\(f(x,y,z)=(x+y+z)f(x,y,z-1)\)(可以接到剩下的任意......