为什么会T啊
查看原帖
为什么会T啊
401215
xieziheng楼主2024/6/22 21:33

loj 上 ac 了,洛谷上 1,7 T了。

好像是单调队列初始化的问题,但是我按大小排序了啊。

#include <bits/stdc++.h>
#define il inline
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
typedef long long ll;
il int read(){
    int x=0,c=getchar(),f=0;
    while(!isdigit(c)) f|=c=='-',c=getchar();
    while(isdigit(c)) x=x*10+c-48,c=getchar();
    return f?-x:x;
}
il void cmax(int &x,int y){x=x>y?x:y;}
const int N=2e5+5;const int inf=1e9;
int n,L,R,mm,c[N],vis[N],siz[N],mx[N],rt,tot,de[N],pre[N],d[N],ans=-inf,f1[N],f2[N];//not same,same
vector<pii> e[N];
il void add(int x,int y,int z){e[x].push_back({y,z});}
void dfs0(int x,int fath){
    ++tot;
    for(auto it:e[x]) if(it.fi!=fath && !vis[it.fi]) dfs0(it.fi,x);
}
void dfs(int x,int fath){
    int y;siz[x]=1,mx[x]=0;
    for(auto it:e[x]){
        y=it.fi;if(y==fath || vis[y]) continue;
        dfs(y,x),siz[x]+=siz[y],mx[x]=max(mx[x],siz[y]);
    }mx[x]=max(mx[x],tot-siz[x]);
    if(!rt || mx[x]<mx[rt]) rt=x;
}
int m,a[N],k,b[N],c1,c2,q[N],hh,tt,q1[N],cc,MX1[N];
il void bfs(int s){
    int x,y,z;m=0,hh=1,tt=0,q[++tt]=s;
    while(hh<=tt){
        x=q[hh++],a[++m]=x;
        for(auto it:e[x]){
            y=it.fi,z=it.se;if(de[y] || vis[y]) continue;
            de[y]=de[x]+1,d[y]=d[x]+1ll*(z!=pre[x])*c[z],pre[y]=z,q[++tt]=y;
        }
    }
}
il void getans(int f[],int cur){
    hh=1,tt=0;//cur=min(cur,1000);
    for(int i=max(1,L-de[a[m]]);i<=min(cur,R-de[a[m]]);++i) {
        while(hh<=tt && f[q[tt]]<=f[i]) --tt;
        q[++tt]=i;
    }
    if(hh<=tt) cmax(ans,d[a[m]]+f[q[hh]]);
    for(int i=m-1;i;--i){
        while(hh<=tt && q[hh]<L-de[a[i]]) ++hh;
        for(int j=max(1,R-de[a[i+1]]+1);j<=min(cur,R-de[a[i]]);++j) {
            while(hh<=tt && f[q[tt]]<=f[j]) --tt;
            q[++tt]=j;
        } 
        if(hh<=tt) cmax(ans,d[a[i]]+f[q[hh]]);
    }
}
il void calc(int x){
    int y,z,u,v,w,p,lst=0,cur=0;m=k=cc=0,de[x]=0,d[x]=0ll;vector<pii> g;g.clear();
    for(auto it:e[x]){
        y=it.fi,z=it.se;if(vis[y]) continue;
        MX1[z]=0;
    }
    for(auto it:e[x]){
        y=it.fi,z=it.se;if(vis[y]) continue;
        MX1[z]=max(MX1[z],siz[y]),g.push_back({y,z});
    }
    sort(g.begin(),g.end(),[](pii u,pii v){return u.se==v.se?siz[u.fi]<siz[v.fi]:MX1[u.se]<MX1[v.se];});
    for(auto it:g){
        y=it.fi,z=it.se,de[y]=1,d[y]=1ll*c[z],pre[y]=z,bfs(y);
        if(z!=lst){
            for(int i=1;i<=k;++i) cmax(f1[de[b[i]]],f2[de[b[i]]]+1ll*c[lst]),f2[de[b[i]]]=-inf;k=0;
        }
        if(lst) getans(f1,cur),getans(f2,cur);
        for(int i=1;i<=m;++i) cmax(f2[de[a[i]]],d[a[i]]-1ll*c[z]);
        lst=z;for(int i=1;i<=m;++i) b[++k]=a[i],q1[++cc]=a[i];
        for(int i=1;i<=m;++i) if(de[a[i]]>=L && de[a[i]]<=R) cmax(ans,d[a[i]]);
        cur=max(cur,de[a[m]]);
    }
    for(int i=1;i<=cc;++i) f1[de[q1[i]]]=f2[de[q1[i]]]=-inf,de[q1[i]]=0;
}
void solve(int x){
    int y;vis[x]=1,calc(x);
    for(auto it:e[x]){
        y=it.fi;if(vis[y]) continue;
        rt=tot=0,dfs0(y,x),dfs(y,x),solve(rt);
    }
}
int x,y,z;
int main(){
    //freopen("journey6.in","r",stdin);
    scanf("%d%d%d%d",&n,&mm,&L,&R);
    for(int i=1;i<=mm;++i) c[i]=read();
    for(int i=1;i<n;++i) x=read(),y=read(),z=read(),add(x,y,z),add(y,x,z);
    for(int i=0;i<=n;++i) f1[i]=f2[i]=-inf;
    rt=0,tot=n,dfs(1,0),solve(rt);
    printf("%d",ans);
    return 0;
}
2024/6/22 21:33
加载中...