为什么会RE,本机上确实是RE,但没挑出来。
查看原帖
为什么会RE,本机上确实是RE,但没挑出来。
141958
楠枫楼主2021/5/24 10:53
#include<bits/stdc++.h>
#define ri register int
#define p(i) ++i
using namespace std;
namespace IO{
    char buf[1<<21],*p1=buf,*p2=buf;
     char gc() {return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
     int read() {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
        return x*f;
    }
}
using IO::read;
namespace nanfeng{
    static const int N=2e5+7;
    static const int INF=1e9+7;
    struct edge {int v,w,nxt;}e[N<<1];
    int first[N],G[N],siz[N],wm[N],dep[N],bc[N],coldep[N],col[N],q[N],vis[N],sum[N],res1[N],res2[N],po[N],res,mx1,mx2,n,m,ll,rl,t=1,cnt,pos,tot,ans=-INF;
     void test(int x) {printf("test%d\n",x);}
    struct Q{
        struct Que{
            int dep,w;
             Que(){}
            Que(int dep,int w):dep(dep),w(w){}
        }que[N];
        int h,t;
        void init() {h=1,t=0;}
        void pop() {p(h);}
         Que newq(int dep,int w) {return Que(dep,w);}
         void push(Que q) {
            while(h<=t&&que[t].w<q.w) --t;
            que[p(t)]=q; 
        }
         int empty() {return h>t;}
         Que top() {return que[h];}
    }que;
    bool cmp(int x,int y) {return col[x]==col[y]?dep[x]<dep[y]:coldep[col[x]]<coldep[col[y]];}
    void add(int u,int v,int w) {
        e[t].v=v;
        e[t].w=w;
        e[t].nxt=first[u];
        first[u]=t++;
    }
    void dfs_find(int S,int x,int fa) {
        siz[x]=1;
        ri GS=0;
        for (ri i(first[x]),v;i;i=e[i].nxt) {
            if ((v=e[i].v)==fa||G[v]) continue;
            dfs_find(S,v,x);
            siz[x]+=siz[v];
            GS=max(GS,siz[v]);
        } 
        GS=max(GS,S-siz[x]);
        if (GS<cnt) cnt=GS,pos=x;
    }
    void dfs_dep(int x,int fa,int dis) {
        dep[x]=dis;
        for (ri i(first[x]),v;i;i=e[i].nxt) {
            if ((v=e[i].v)==fa||G[v]) continue;
            dfs_dep(v,x,dis+1);
            dep[x]=max(dep[x],dep[v]);
        }
    }
    void bfsi(int u) {
        que.init();
        ri h=1,t=0,cur=mx2;
        q[p(t)]=u;dep[u]=vis[u]=1;
        while(h<=t) {
            ri x=q[h++];
            while(cur&&cur+dep[x]>=ll) que.push(que.newq(cur,res2[cur])),--cur;
            while(!que.empty()&&que.top().dep+dep[x]>rl) que.pop();
            if (!que.empty()) res=sum[x]+que.top().w-wm[col[u]];
            else res=-INF;
            ans=max(res,ans);
            for (ri i(first[x]),v;i;i=e[i].nxt) {
                if (vis[v=e[i].v]||G[v]) continue;
                q[p(t)]=v;vis[v]=1;dep[v]=dep[x]+1;
                col[v]=e[i].w;
                sum[v]=sum[x]+(col[v]==col[x]?0:wm[col[v]]);
            }
        }
        for (ri i(cur+1);i<=min(rl,dep[q[t]]);p(i)) res2[i]=-INF;
        mx2=max(mx2,min(dep[q[t]],rl));
        for (ri i(1);i<=t&&dep[q[i]]<=rl;p(i)) res2[dep[q[i]]]=max(res2[dep[q[i]]],sum[q[i]]);
        for (ri i(1);i<=t;p(i)) vis[q[i]]=0;
    }
     void bfso(int tt) {
        if (!tt) return;
        que.init();
        ri h=1,t=0,cur=mx1,qh=1,qt=0;
        for (ri i(1),x;i<=tt;p(i)) q[p(t)]=(x=po[i]),vis[x]=dep[x]=1;
        while(h<=t) {
            ri x=q[h++];
            while(cur>=0&&cur+dep[x]>=ll) que.push(que.newq(cur,res1[cur])),--cur;
            while(!que.empty()&&que.top().dep+dep[x]>rl) que.pop();
            if (!que.empty()) res=sum[x]+que.top().w;
            else res=-INF;
            ans=max(ans,res);
            for (ri i(first[x]),v;i;i=e[i].nxt) {
                if (vis[v=e[i].v]||G[v]) continue;
                q[p(t)]=v;vis[v]=1;dep[v]=dep[x]+1;
                col[v]=e[i].w;
                sum[v]=sum[x]+(col[v]==col[x]?0:wm[col[v]]);
            }
        }
        for (ri i(cur+1);i<=min(rl,dep[q[t]]);p(i)) res1[i]=-INF;
        mx1=max(mx1,min(dep[q[t]],rl));
        for (ri i(1);i<=t&&dep[q[i]]<=rl;p(i)) res1[dep[q[i]]]=max(res1[dep[q[i]]],sum[q[i]]);
        for (ri i(1);i<=t;p(i)) vis[q[i]]=0;
    }
    void solve(int S,int x) {
        dfs_find(cnt=S,x,0);
        G[pos]=1;tot=0;
        for (ri i(first[pos]),v;i;i=e[i].nxt) {
            if (G[v=e[i].v]) continue;
            coldep[e[i].w]=1;col[v]=e[i].w;
        }
        for (ri i(first[pos]),v,w;i;i=e[i].nxt) {
            if (G[v=e[i].v]) continue;
            bc[p(tot)]=v;
            dfs_dep(v,x,1);
            coldep[w=e[i].w]=max(coldep[w],dep[v]);
        }
        sort(bc+1,bc+tot+1,cmp);
        mx1=mx2=0;
        ri precol=0,tt=0;res1[0]=0;
        for (ri i(1),v;i<=tot;p(i)) {
            v=bc[i];
            if (col[v]!=precol) precol=col[v],bfso(tt),mx2=tt=0;
            sum[v]=wm[col[v]];
            bfsi(v);po[p(tt)]=v;
        }
        bfso(tt);
        for (ri i(first[pos]),v;i;i=e[i].nxt) {
            if (G[v=e[i].v]) continue;
            solve(siz[v],v);
        }
    }
     int main() {
        //  freopen("1.in","r",stdin);
        n=read(),m=read(),ll=read(),rl=read();
        for (ri i(1);i<=m;p(i)) wm[i]=read();
        for (ri i(1);i<n;p(i)) {
            int u=read(),v=read(),w=read();
            add(u,v,w);add(v,u,w);
        }
        solve(n,1);
        printf("%d\n",ans);
        return 0;
    } 
}
int main() {return nanfeng::main();}

dfs_find 部分开了 O(2)\mathcal O(2)RERE,但不开会,也没找到哪越界了。

2021/5/24 10:53
加载中...