社区讨论

今天不宜打数据结构

P3384【模板】重链剖分 / 树链剖分参与者 4已保存回复 11

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
11 条
当前快照
1 份
快照标识符
@mi7copii
此快照首次捕获于
2025/11/20 19:31
4 个月前
此快照最后确认于
2025/11/20 21:59
4 个月前
查看原帖
MLE, WA???
CPP
#include <bits/stdc++.h>
#define endl '\n'

class fastIO {
private:
    char rbuf[100000], wbuf[100000], *p1, *p2, *p3;
    int l, tag;
    inline char get(void) {
        return p1 == p2 && (p2 = (p1 = rbuf) + fread(rbuf, 1, 100000, stdin), p1 == p2) ? EOF : *p1++;
    }
    inline void put(char x) {
        l == 100000 ? (p3 = wbuf, fwrite(wbuf, 1, 100000, stdout), l = 1, *p3++ = x) : (l++, *p3++ = x);
        return;
    }
public:
    fastIO() : l(0), p1(rbuf), p2(rbuf), p3(wbuf), tag(0) {}
    ~fastIO() {fwrite(wbuf, 1, l, stdout);}
    inline void putLine(const char* x) {
        fwrite(wbuf, 1, l, stdout);
        fwrite(x, 1, strlen(x), stdout);
        l = 0;
        p3 = wbuf;
        return;
    }
    inline void getLine(std::string& x) {
        x.clear();
        char c = get();
        while ((c < 33 || c > 126) && c != EOF) c = get();
        if (c == EOF) tag = 1;
        while ((c >= 33 && c <= 126) || c == ' ') {
            x += c;
            c = get();
        }
        return;
    }
template <typename T>
    inline fastIO& operator >> (T& x) {
        x = 0;
        bool f = 0;
        char c = get();
        while (!isdigit(c) && c != EOF) {
            f |= (c == '-');
            c = get();
        }
        if (c == EOF) tag = 1;
        while (isdigit(c)) {
            x = (x << 1) + (x << 3) + (c ^ 48);
            c = get();
        }
        x = f ? ~x + 1 : x;
        return *this;
    }
    inline fastIO& operator >> (char& x) {
        x = get();
        while ((x < 33 || x > 126) && x != EOF) {
            if (x == EOF) tag = 1;
            x = get();
        }
        return *this;
    }
    inline fastIO& operator >> (std::string& x) {
        x.clear();
        char c = get();
        while ((c < 33 || c > 126) && c != EOF) c = get();
        if (c == EOF) tag = 1;
        while (c >= 33 && c <= 126) {
            x += c;
            c = get();
        }
        return *this;
    }
template <typename Y>
    inline fastIO& operator << (Y x) {
        int putList[25];
        int cnt = 0;
        !x ? (put('0'), 0) : 0;
        x < 0 ? (put('-'), x = ~x + 1) : 0;
        while (x > 0) {
            putList[++cnt] = x % 10 + 48;
            x /= 10;
        }
        while (cnt) put(putList[cnt--]);
        return *this;
    }
    inline fastIO& operator << (char* x) {return putLine(x), *this;}
    inline fastIO& operator << (char x) {return put(x), *this;}
    inline fastIO& operator << (const std::string& x) {return putLine(x.c_str()), *this;}
    inline operator bool() {return tag ? 0 : 1;}
}io;

const int _ = 1e5 + 10;
int dep[_], Size[_], father[_], inTree[_], self[_], v[_], son[_], top[_];
long long p;
std::vector<int> lty[_];

inline void dfs1(int now, int fa, int deep) { //处理点的深度与子树大小 
    dep[now] = deep;
    Size[now] = 1;
    father[now] = fa;//now的father 
    int maxSon = 0;
    for (int i = 0; i < lty[now].size(); i++) {
        if (lty[now][i] == fa) continue;
        dfs1(lty[now][i], now, deep + 1);
        Size[now] += Size[lty[now][i]];
        if (Size[lty[now][i]] > maxSon) {
            son[now] = lty[now][i];
            maxSon = Size[lty[now][i]];
        }
    }
    return;
}

inline void dfs2(int now, int topfather) {
    inTree[now] = ++inTree[0];   //dfs序 
    self[inTree[0]] = v[now];    //新编号对应的值 
    top[now] = topfather;
    if (!son[now]) return;
    dfs2(son[now], topfather);//先走重儿子 
    for (int i = 0; i < lty[now].size(); i++) {
        if (lty[now][i] == father[now] || lty[now][i] == son[now]) continue;
        dfs2(lty[now][i], lty[now][i]);
    }
    return;
}

struct node {//线段树 
    int l, r;
    long long TeRi, lazy;
    node* child[2];
    node(int lty = 0, int yzl = 0) : l(lty), r(yzl), TeRi(0), lazy(0) {
        child[0] = child[1] = NULL;
    }
}*root, point[_ * 2];

inline node* newnode(int lty, int yzl) {
    static int cnt = 0;
    node* o = &point[cnt++];
    o->l = lty;
    o->r = yzl;
    return o;
}

回复

11 条回复,欢迎继续交流。

正在加载回复...