社区讨论

树剖+线段树 WA on #11 求助

SP6779GSS7 - Can you answer these queries VII参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lo2ew4up
此快照首次捕获于
2023/10/23 12:42
2 年前
此快照最后确认于
2023/11/03 13:31
2 年前
查看原帖
样例已过,对着题解调试了,但没找出问题;
CPP
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cstring>

#define INF 0x3f3f3f3f

#define lson 2*x
#define rson 2*x+1

using namespace std;

int n, m;
int a[100010];

struct Range
{
    int mxl, mxr;
    int mx, val;

    Range()
    {
        mxl = mxr = mx = val = 0;
    }
};

Range merge(Range x, Range y)
{
    Range ret;

    ret.mxl = max(x.mxl, x.val + y.mxl);
    ret.mxr = max(y.mxr, y.val + x.mxr);
    ret.val = x.val + y.val;
    ret.mx = max(max(x.mx, y.mx), x.mxr + y.mxl);

    return ret;
}

Range rev(Range x)
{
    Range ret;
    
    ret.mx = x.mx;
    ret.mxl = x.mxr;
    ret.mxr = x.mxl;
    ret.val = x.val;

    return ret;
}

class SegTree
{
    private:
        struct Node
        {
            int l, r;
            int lazy = INF;
            Range x;
        }p[400010];

        void setRange(int x, int k)
        {
            p[x].x.val = k * (p[x].r-p[x].l+1);
            if(k >= 0)
                p[x].x.mx = p[x].x.mxl = p[x].x.mxr = k * (p[x].r-p[x].l+1);
            else
                p[x].x.mx = p[x].x.mxl = p[x].x.mxr = 0;
        }
    
    public:
        void buildtree(int x, int l, int r)
        {
            p[x].l = l;
            p[x].r = r;
            p[x].lazy = INF;

            if(l == r)
            {
                setRange(x, a[l]);
                return;
            }

            int mid = (l+r)/2;
            buildtree(lson, l, mid);
            buildtree(rson, mid+1, r);

            p[x].x = merge(p[lson].x, p[rson].x);
        }

        void pushdown(int x)
        {
            if(p[x].lazy == INF)
                return;
            if(p[x].l == p[x].r)
            {
                p[x].lazy = INF;
                return;
            }

            setRange(lson, p[x].lazy);
            setRange(rson, p[x].lazy);

            p[lson].lazy = p[rson].lazy = p[x].lazy;
            p[x].lazy = INF;
        }

        void modify(int x, int l, int r, int k)
        {
            pushdown(x);

            if(l <= p[x].l && p[x].r <= r)
            {
                setRange(x, k);
                p[x].lazy = k;

                return;
            }

            if(l <= p[lson].r) modify(lson, l, r, k);
            if(p[rson].l <= r) modify(rson, l, r, k);

            p[x].x = merge(p[lson].x, p[rson].x);
        }

        Range query(int x, int l, int r)
        {
            pushdown(x);

            if(l <= p[x].l && p[x].r <= r)
                return p[x].x;
            
            if(r <= p[lson].r) return query(lson, l, r);
            if(p[rson].l <= l) return query(rson, l, r);
            return merge(query(lson, l, r), query(rson, l, r));
        }
}tree;

class TreeChain
{
    private:
        int cnt, head[100010];
        struct Edge
        {
            int to, nxt;
        }p[200010];
    
    public:
        int siz[100010], mxson[100010], dep[100010], val[100010];
        int dfn[100010], fa[100010], tp[100010];
        int cnt2 = 0;

        void AddEdge(int x, int y)
        {
            cnt++;
            p[cnt].to = y;

            p[cnt].nxt = head[x];
            head[x] = cnt;
        }

        void dfs1(int x)
        {
            int val = 0;
            siz[x] = 1;
            for(int i=head[x]; i!=0; i=p[i].nxt)
                if(dep[p[i].to] == 0)
                {
                    dep[p[i].to] = dep[x] + 1;
                    fa[p[i].to] = x;
                    
                    dfs1(p[i].to);
                    if(siz[p[i].to] > val)
                    {
                        val = siz[p[i].to];
                        mxson[x] = p[i].to;
                    }
                    siz[x] += siz[p[i].to];
                }
        }

        void dfs2(int x, int cur)
        {
            dfn[x] = ++cnt2;
            tp[x] = cur;

            if(mxson[x] != 0)
                dfs2(mxson[x], cur);

            for(int i=head[x]; i!=0; i=p[i].nxt)
                if(dfn[p[i].to] == 0)
                    dfs2(p[i].to, p[i].to);
        }

        void reassign()
        {
            for(int i=1; i<=n; i++)
                a[dfn[i]] = val[i];
        }

        void modify(int x, int y, int c)
        {
            while(tp[x] != tp[y])
            {
                if(dep[tp[x]] < dep[tp[y]])
                    swap(x, y);

                tree.modify(1, dfn[tp[x]], dfn[x], c);
                x = fa[tp[x]];
            }

            if(dep[x] > dep[y])
                swap(x, y);
            tree.modify(1, dfn[x], dfn[y], c);
        }

        Range query(int x, int y)
        {
            Range xRange;
            Range yRange;

            while(tp[x] != tp[y])
            {
                if(dep[tp[x]] < dep[tp[y]])
                {
                    swap(x, y);
                    swap(xRange, yRange);
                }

                xRange = merge(tree.query(1, dfn[tp[x]], dfn[x]), xRange);
                x = fa[tp[x]];
            }

            if(dep[x] > dep[y])
            {
                swap(x, y);
                swap(xRange, yRange);
            }

            yRange = merge(tree.query(1, dfn[x], dfn[y]), yRange);
            
            swap(yRange.mxl, yRange.mxr);
            
            return merge(xRange, yRange);
        }
}graph;

int main()
{
    // memset(graph.mxson, 0, sizeof(graph.mxson));

    scanf("%d", &n);
    for(int i=1; i<=n; i++)
        scanf("%d", &graph.val[i]);
    for(int i=1; i<=n-1; i++)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        graph.AddEdge(x, y);
        graph.AddEdge(y, x);
    }

    graph.dep[1] = 1;
    graph.dfs1(1);
    graph.dfs2(1, 1);
    graph.reassign();
    tree.buildtree(1, 1, n);

    scanf("%d", &m);
    for(int i=1; i<=m; i++)
    {
        int opt, x, y, c;
        scanf("%d", &opt);
        if(opt == 1)
        {
            scanf("%d%d", &x, &y);
            printf("%d\n", graph.query(x, y).mx);
        }
        else
        {
            scanf("%d%d%d", &x, &y, &c);
            graph.modify(x, y, c);
        }
    }

    return 0;
}

回复

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

正在加载回复...