P4315 树剖求调
  • 板块灌水区
  • 楼主OneLeft
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/24 10:16
  • 上次更新2024/1/24 12:19:13
查看原帖
P4315 树剖求调
574215
OneLeft楼主2024/1/24 10:16

rt,过了样例但是全部 WA。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5,INF=(int)1e18+5;
struct Edge
{
    int u,v,w;
}x[N];
string op;
int n,u,v,k,a[N],b[N];
list<int>edge[N];
class Segment_tree
{
    private:
        int node[N*4],lazy1[N*4],lazy2[N*4];
        void push_up(int id)
        {
            node[id]=max(node[id*2],node[id*2+1]);
        }
        void push_down(int id)
        {
            if(lazy1[id]!=-INF)
            {
                node[id*2]=node[id*2+1]=lazy1[id];
                lazy1[id*2]=lazy1[id*2+1]=lazy1[id];
                lazy2[id*2]=lazy2[id*2+1]=0;
                lazy1[id]=-INF;
            }
            if(lazy2[id]!=0)
            {
                node[id*2]+=lazy2[id];
                node[id*2+1]+=lazy2[id];
                lazy2[id*2]+=lazy2[id];
                lazy2[id*2+1]+=lazy2[id];
                lazy2[id]=0;
            }
        }
    public:
        void build(int id,int l,int r,int a[N])
        {
            if(l==r)
            {
                node[id]=a[l];
                lazy1[id]=-INF;
                lazy2[id]=0;
            }
            else
            {
                lazy1[id]=-INF;
                int mid=(l+r)/2;
                build(id*2,l,mid,a);
                build(id*2+1,mid+1,r,a);
                push_up(id);
            }
        }
        void updata1(int id,int l,int r,int x,int y,int z)
        {
            if(x<=l&&r<=y)
            {
                node[id]=lazy1[id]=z;
                lazy2[id]=0;
            }
            else
            {
                push_down(id);
                int mid=(l+r)/2;
                if(x<=mid)updata1(id*2,l,mid,x,y,z);
                if(y>mid)updata1(id*2+1,mid+1,r,x,y,z);
                push_up(id);
            }
        }
        void updata2(int id,int l,int r,int x,int y,int z)
        {
            if(x<=l&&r<=y)
            {
                node[id]+=z;
                lazy2[id]+=z;
            }
            else
            {
                push_down(id);
                int mid=(l+r)/2;
                if(x<=mid)updata2(id*2,l,mid,x,y,z);
                if(y>mid)updata2(id*2+1,mid+1,r,x,y,z);
                push_up(id);
            }
        }
        int query(int id,int l,int r,int x,int y)
        {
            if(x<=l&&r<=y)return node[id];
            push_down(id);
            int mid=(l+r)/2,res=-INF;
            if(x<=mid)res=max(res,query(id*2,l,mid,x,y));
            if(y>mid)res=max(res,query(id*2+1,mid+1,r,x,y));
            return res;
        }
}T;
int cnt,deep[N],fa[N],siz[N],son[N],top[N],dfn[N];
void build(int u,int v)
{
    edge[u].push_back(v);
    edge[v].push_back(u);
}
void DFS1(int u,int f)
{
    siz[u]=1,fa[u]=f;
    deep[u]=deep[f]+1;
    for(auto v:edge[u])
    {
        if(v==f)continue;
        DFS1(v,u);
        siz[u]+=siz[v];
        if(siz[v]>siz[son[u]])
            son[u]=v;
    }
}
void DFS2(int u)
{
    dfn[u]=++cnt;
    b[cnt]=a[u];
    if(son[fa[u]]==u)
        top[u]=top[fa[u]];
    else top[u]=u;
    if(son[u]!=0)
        DFS2(son[u]);
    for(auto v:edge[u])
    {
        if(v==fa[u]||v==son[u])
            continue;
        DFS2(v);
    }
}
void LCA_updata1(int u,int v,int x)
{
    while(top[u]!=top[v])
    {
        if(deep[top[u]]<deep[top[v]])
            swap(u,v);
        T.updata1(1,1,n,dfn[top[u]],dfn[u],x);
        u=fa[top[u]];
    }
    if(deep[u]<deep[v])
        swap(u,v);
    T.updata1(1,1,n,dfn[v],dfn[u],x);
}
void LCA_updata2(int u,int v,int x)
{
    while(top[u]!=top[v])
    {
        if(deep[top[u]]<deep[top[v]])
            swap(u,v);
        T.updata2(1,1,n,dfn[top[u]],dfn[u],x);
        u=fa[top[u]];
    }
    if(deep[u]<deep[v])
        swap(u,v);
    T.updata2(1,1,n,dfn[v],dfn[u],x);
}
int LCA_query(int u,int v)
{
    int res=-INF;
    while(top[u]!=top[v])
    {
        if(deep[top[u]]<deep[top[v]])
            swap(u,v);
        res=max(res,T.query(1,1,n,dfn[top[u]],dfn[u]));
        u=fa[top[u]];
    }
    if(deep[u]<deep[v])
        swap(u,v);
    return max(res,T.query(1,1,n,dfn[v],dfn[u]));
}
signed main()
{
    cin>>n;
    for(int i=1;i<n;i++)
    {
        cin>>x[i].u>>x[i].v>>x[i].w;
        build(x[i].u,x[i].v);
    }
    DFS1(1,0);
    for(int i=1;i<n;i++)
    {
        if(deep[x[i].u]<deep[x[i].v])
            a[x[i].v]=x[i].w;
        else a[x[i].u]=x[i].w;
    }
    DFS2(1);
    T.build(1,1,n,b);
    for(;;)
    {
        cin>>op;
        if(op=="Stop")break;
        cin>>u;
        if(op=="Change")
        {
            cin>>k;
            if(deep[x[u].u]<deep[x[u].v])
                T.updata1(1,1,n,dfn[x[u].v],dfn[x[u].v],k);
            else T.updata1(1,1,n,dfn[x[u].u],dfn[x[u].u],k);
        }
        if(op=="Cover")
        {
            cin>>v>>k;
            LCA_updata1(u,v,k);
        }
        if(op=="Add")
        {
            cin>>v>>k;
            LCA_updata2(u,v,k);
        }
        if(op=="Max")
        {
            cin>>v;
            cout<<LCA_query(u,v)<<'\n';
        }
    }
    return 0;
}
2024/1/24 10:16
加载中...