P4211 [LNOI2014]LCA LCT

P4211 [LNOI2014]LCA

链接

loj
luogu

思路

多次询问\(\sum\limits_{l \leq i \leq r}dep[LCA(i,z)]\)
可以转化成l到r上的点到根的路径+1
最后求一下1到z的路径和就是所求
区间\([l,r]\)是可以差分的
离线直接求就行了。
树剖常数小,但还是比LCT多个log
我的LCT好慢啊

代码

#include <bits/stdc++.h>
#define ls c[x][0]
#define rs c[x][1]
using namespace std;
const int N = 1e5 + 7, mod = 201314;
int read() {
    int x = 0, f = 1; char s = getchar();
    for (;s > '9' || s < '0'; s = getchar()) if (s == '-') f = -1;
    for (;s >= '0' && s <= '9'; s = getchar()) x = x * 10 + s - '0';
    return x * f;        
}
int f[N], c[N][2], w[N], siz[N], sum[N], stak[N], lazy[N], lazytwo[N];
bool isroot(int x) {return c[f[x]][0] == x || c[f[x]][1] == x;}
void tag(int x){swap(ls,rs), lazy[x] ^= 1;}
void tagtwo(int x, int val) {
    sum[x] = (sum[x] + 1LL * val * siz[x] % mod) % mod;
    w[x] = (w[x] + val) % mod;
    lazytwo[x] = (lazytwo[x] + val) % mod;
}
void pushdown(int x) {
    if (lazy[x]) {
        if (ls) tag(ls);
        if (rs) tag(rs);
        lazy[x] ^= 1;
    }
    if (lazytwo[x]) {
        if (ls) tagtwo(ls, lazytwo[x]);
        if (rs) tagtwo(rs, lazytwo[x]);
        lazytwo[x] = 0; 
    }
}
void pushup(int x) {
    sum[x] = (sum[ls] + sum[rs] + w[x]) % mod;
    siz[x] = siz[ls] + siz[rs] + 1;
}
void rotate(int x) {
    int y = f[x], z = f[y], k = c[y][1] == x, w = c[x][!k];
    if (isroot(y)) c[z][c[z][1] == y] = x;
    c[x][!k] = y;
    c[y][k] = w;
    if (w) f[w] = y;
    f[x] = z;
    f[y] = x;
    pushup(y);
}
void splay(int x) {
    int y = x, z = 0;
    stak[++z] = y;
    while (isroot(y)) stak[++z] = y = f[y];
    while (z) pushdown(stak[z--]);
    while (isroot(x)) {
        y = f[x], z = f[y];
        if (isroot(y)) rotate((c[y][0] == x)^(c[z][0] == y) ? x : y);
        rotate(x);
    }
    pushup(x);
}
void access(int x) {
    for (int y = 0; x;x = f[y = x])
        splay(x), rs = y, pushup(x);
}
void makeroot(int x) {
    access(x), splay(x);
    tag(x);
}
int findroot(int x) {
    access(x), splay(x);
    while(ls) pushdown(x), x = ls;
    return x;
}
void split(int x, int y) {
    makeroot(x), access(y), splay(y);
}
void link(int x, int y) {
    makeroot(x);
    if (findroot(y) != x) f[x] = y;
}
void cut(int x, int y) {
    makeroot(x);
    if (findroot(y) == x && f[x] == y && !rs) {
        f[x] = c[y][0] = 0;
        pushup(y);
    }
}
struct node {
    int id, l, z, ans;
    node(int a = 0, int b = 0, int c = 0) {
        id = a, l = b, z = c;
    }
} Q[N];
bool cmp1(const node &a, const node& b) {
    return a.l < b.l;
}
bool cmp2(const node &a, const node& b) {
    return a.id < b.id;
}
int main() {
    // freopen("a.in", "r", stdin);
    int n = read(), m = read();
    for (int i = 2; i <= n; ++i) {
        int x = read() + 1;
        link(i, x);
    }
    for (int i = 1; i <= m; ++i) {
        int l = read() + 1, r = read() + 1, z = read() + 1;
        Q[i * 2 - 1] = node(i * 2 - 1, l - 1, z);
        Q[i * 2] = node(i * 2, r, z);
    }
    m <<= 1;
    sort(Q + 1, Q + 1 + m, cmp1);
    int js = 1;
    for (int i = 0; i <= n; ++i) {
        if (i) split(1, i),tagtwo(i, 1);
        while(Q[js].l == i) {
            split(1, Q[js].z);
            Q[js].ans = sum[Q[js].z];
            js++;
        }
    }
    sort(Q + 1, Q + 1 + m, cmp2);
    for (int i = 2; i <= m; i += 2) {
        int ans = Q[i].ans - Q[i - 1].ans;
        ans = (ans % mod + mod) % mod;
        printf("%d\n", ans);
    }
    return 0;
}
全部评论

相关推荐

酷酷的喜马拉雅山:感觉这比一直在初筛不动的好多了
点赞 评论 收藏
分享
来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
注意格局:去年超发意向是忘了
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务