警示后人
查看原帖
警示后人
678858
ShiRoZeTsuHL卜奎BBQ!楼主2023/10/9 17:01

如果你使用线段树合并,并成功被 HACK

最后一个 HACK 点死活过不去,连 debug 都 debug 不了,最后使用强大的 devc++ 开大了栈空间才 debug 出来。这题给我卡傻了。

请开大栈空间至 128MiB128 MiB,以便您更好地 debug。

顺便贴一下我的 CODE:

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;

const int maxn = 1e6 + 5;

int read() {
    int res = 0, flag = 1; char c = getchar();
    while(c < '0' || c > '9') { if(c == '-') flag = -1; c = getchar(); }
    while(c >= '0' && c <= '9') { res = res*10 + c-'0'; c = getchar(); }
    return res*flag;
}

void print(int x) {
    if(x>9) print(x/10);
    putchar(x%10 + '0');
}

int n, q, cnt, top;
int ans[maxn], dep[maxn], root[maxn], st[22][maxn];

struct edge {
    int to, nxt;
} e[maxn];

int tot = 1, head[maxn];
void addedge(int u, int v) {
    e[++tot].to = v;
    e[tot].nxt = head[u];
    head[u] = tot;
}

struct node {
    int p, id;
};
vector<node> ask[maxn];

void prework(int u) {
    dep[u] = dep[st[0][u]] + 1;
    for(int i = 1; (1<<i) < dep[u]; i++)
        st[i][u] = st[i-1][st[i-1][u]];
    for(int i = head[u]; i; i = e[i].nxt) {
        int v = e[i].to;
        prework(v);
    }
}

#define mid ((l + r) >> 1)

int sum[maxn<<3], ls[maxn<<3], rs[maxn<<3], stk[maxn<<4];

int newnode() {
    if(top) {
        int x = stk[top];
        top--;
        return x;
    }
    else return ++cnt;
}

void del(int o) {
    ls[o] = rs[o] = sum[o] = 0;
    stk[++top] = o;
}

void build(int& o, int l, int r, int pos) {
    if(!o) o = newnode();
    if(l == r) { sum[o] = 1; return; }
    if(pos <= mid) build(ls[o], l, mid, pos);
    else build(rs[o], mid+1, r, pos);
    sum[o] = sum[ls[o]] + sum[rs[o]];
}

void merge(int& o, int p, int l, int r) {
    if(!o || !p) { o += p; return; }
    if(l == r) { sum[o] += sum[p]; del(p); return; }
    merge(ls[o], ls[p], l, mid);
    merge(rs[o], rs[p], mid+1, r);
    sum[o] = sum[ls[o]] + sum[rs[o]];
    del(p);
}

int query(int o, int l, int r, int pos) {
    if(l == r) return sum[o];
    if(pos <= mid) return query(ls[o], l, mid, pos);
    else return query(rs[o], mid+1, r, pos);
}

void dfs(int u) {
    build(root[u], 1, n, dep[u]);
    for(int i = head[u]; i; i = e[i].nxt) {
        int v = e[i].to;
        dfs(v);
        merge(root[u], root[v], 1, n);
    }
    for(int i = 0; i < ask[u].size(); i++) {
        int p = ask[u][i].p, id = ask[u][i].id;
        ans[id] = query(root[u], 1, n, p) - 1;
    }
}

int main() {
	freopen("in.txt", "r", stdin);
	
    n = read(), q = read();
    for(int i = 2; i <= n; i++) {
        st[0][i] = read();
        addedge(st[0][i], i);
    }
    prework(1);

    for(int i = 1; i <= q; i++) {
        int u, v, k;
        u = read(), k = read();
        v = u;
        for(int p = 20; p >= 0; p--)
            if((k>>p) & 1) v = st[p][v];
        if(v) ask[v].push_back((node){dep[u], i});
    }
    dfs(1);

    for(int i = 1; i <= q; i++)
        print(ans[i]), putchar(' ');
    return 0;
}

2023/10/9 17:01
加载中...