lct求调 WA on#12
查看原帖
lct求调 WA on#12
399475
_XHY20180718_楼主2024/2/23 12:32

RT,这是原代码,WA on #12:

#include<bits/stdc++.h>
#define int long long
#define ls(x) tr[x].s[0]
#define rs(x) tr[x].s[1]
using namespace std;
const int N=3e5+5,inf=1e18;
int n,m,num,st[N];
bool is[N];
struct node{
    int u,v,id,w;
    bool operator<(const node &t)
    const {return w<t.w;}
};
priority_queue<node>qu;
struct Splay_Tree{
    int w,mxn;
    int s[2],fa;
    int ss,si,sz;
    bool fr,fs;
}tr[N<<1];
inline bool nroot(int x){return ls(tr[x].fa)==x||rs(tr[x].fa)==x;}
inline void chgr(int x){tr[x].fr^=1,swap(ls(x),rs(x));}
inline void pushdown(int x)
{if(tr[x].fr)chgr(ls(x)),chgr(rs(x)),tr[x].fr=0;}
inline void pushup(int x){
    tr[x].mxn=x;
    if(ls(x))if(tr[tr[x].mxn].w<tr[tr[ls(x)].mxn].w)tr[x].mxn=tr[ls(x)].mxn;
    if(rs(x))if(tr[tr[x].mxn].w<tr[tr[rs(x)].mxn].w)tr[x].mxn=tr[rs(x)].mxn;
    tr[x].sz=tr[ls(x)].sz+tr[rs(x)].sz+1;
    tr[x].ss=tr[ls(x)].ss+tr[rs(x)].ss+tr[x].si+tr[x].fs;
}
inline void rotate(int x){
    int y=tr[x].fa,z=tr[y].fa,t;
    bool xy=(rs(y)==x),yz=(rs(z)==y);
    if(nroot(y))tr[z].s[yz]=x;tr[x].fa=z;
    t=tr[y].s[xy]=tr[x].s[!xy];if(t)tr[t].fa=y;
    tr[x].s[!xy]=y,tr[y].fa=x;pushup(y);
}
inline void splay(int x){
    int y=x,z=0;st[++z]=x;
    while(nroot(y))st[++z]=y=tr[y].fa;
    while(z)pushdown(st[z--]);
    while(nroot(x)){
        if(nroot(y))rotate((rs(y)==x)^(rs(z)==y)?x:y);
        rotate(x);
    }pushup(x);
}
inline void access(int x){
    for(int y=0;x;x=tr[y=x].fa){
        splay(x);
        tr[x].si+=tr[rs(x)].ss;
        tr[x].si-=tr[rs(x)=y].ss;
        pushup(x);
    }
}
inline void makeroot(int x){access(x),splay(x),chgr(x);}
inline void split(int x,int y){makeroot(x),access(y),splay(y);}
inline int findroot(int x){
    access(x),splay(x);
    while(ls(x))pushdown(x),x=ls(x);
    splay(x);return x;
}
inline void link(int x,int y){
    makeroot(x);
    if(findroot(y)!=x){
        tr[x].fa=y;
        tr[y].si+=tr[x].ss;
        pushup(y);
    }
}
inline void cut(int x,int y){
    makeroot(x);
    if(findroot(y)==x&&tr[x].sz<3)
        tr[y].fa=rs(x)=0,pushup(x);
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;num=n;
    int u,v,w;is[0]=1;
    for(int i=1; i<=n; ++i)
        tr[i].w=-inf,tr[i].fs=1,tr[i].mxn=i;
    while(m--){
        cin>>u>>v>>w;
        int fu=findroot(u),fv=findroot(v);
        if(fu==fv){
            split(u,v);int del=tr[v].mxn;
            if(tr[del].w<=w)goto A;
            is[del]=1;splay(del);
            tr[ls(del)].fa=tr[rs(del)].fa=0;
            tr[del].ss=tr[del].sz=tr[del].si=0;
        }else if((tr[fu].ss&1)&&(tr[fv].ss&1)) num-=2;
        tr[++n].w=w,link(u,n),link(n,v);
        qu.push({u,v,n,w});A:;
        if(num)cout<<"-1\n";
        else {
            while(!qu.empty()){
                node q=qu.top();
                int u=q.u,v=q.v,del=q.id;
                if(is[del]){qu.pop();continue;}
                cut(u,del),cut(del,v);splay(del);
                tr[ls(del)].fa=tr[rs(del)].fa=0;
                tr[del].ss=tr[del].sz=tr[del].si=0;
                if(tr[findroot(u)].ss&1){
                    cout<<q.w<<'\n';
                    link(u,del),link(del,v);
                    break;
                }
                link(u,del),link(del,v);
                qu.pop();
            }
            if(qu.empty())cerr<<"Error.\n";
        }
    }
    return 0;
}

加了个特判+打表然后过了???:

#include<bits/stdc++.h>
#define int long long
#define ls(x) tr[x].s[0]
#define rs(x) tr[x].s[1]
using namespace std;
const int N=3e5+5,inf=1e18;
int n,m,num,st[N];
bool is[N];
struct node{
    int u,v,id,w;
    bool operator<(const node &t)
    const {return w<t.w;}
};
priority_queue<node>qu;
struct Splay_Tree{
    int w,mxn;
    int s[2],fa;
    int ss,si,sz;
    bool fr,fs;
}tr[N<<1];
inline bool nroot(int x){return ls(tr[x].fa)==x||rs(tr[x].fa)==x;}
inline void chgr(int x){tr[x].fr^=1,swap(ls(x),rs(x));}
inline void pushdown(int x)
{if(tr[x].fr)chgr(ls(x)),chgr(rs(x)),tr[x].fr=0;}
inline void pushup(int x){
    tr[x].mxn=x;
    if(ls(x))if(tr[tr[x].mxn].w<tr[tr[ls(x)].mxn].w)tr[x].mxn=tr[ls(x)].mxn;
    if(rs(x))if(tr[tr[x].mxn].w<tr[tr[rs(x)].mxn].w)tr[x].mxn=tr[rs(x)].mxn;
    tr[x].sz=tr[ls(x)].sz+tr[rs(x)].sz+1;
    tr[x].ss=tr[ls(x)].ss+tr[rs(x)].ss+tr[x].si+tr[x].fs;
}
inline void rotate(int x){
    int y=tr[x].fa,z=tr[y].fa,t;
    bool xy=(rs(y)==x),yz=(rs(z)==y);
    if(nroot(y))tr[z].s[yz]=x;tr[x].fa=z;
    t=tr[y].s[xy]=tr[x].s[!xy];if(t)tr[t].fa=y;
    tr[x].s[!xy]=y,tr[y].fa=x;pushup(y);
}
inline void splay(int x){
    int y=x,z=0;st[++z]=x;
    while(nroot(y))st[++z]=y=tr[y].fa;
    while(z)pushdown(st[z--]);
    while(nroot(x)){
        if(nroot(y))rotate((rs(y)==x)^(rs(z)==y)?x:y);
        rotate(x);
    }pushup(x);
}
inline void access(int x){
    for(int y=0;x;x=tr[y=x].fa){
        splay(x);
        tr[x].si+=tr[rs(x)].ss;
        tr[x].si-=tr[rs(x)=y].ss;
        pushup(x);
    }
}
inline void makeroot(int x){access(x),splay(x),chgr(x);}
inline void split(int x,int y){makeroot(x),access(y),splay(y);}
inline int findroot(int x){
    access(x),splay(x);
    while(ls(x))pushdown(x),x=ls(x);
    splay(x);return x;
}
inline void link(int x,int y){
    makeroot(x);
    if(findroot(y)!=x){
        tr[x].fa=y;
        tr[y].si+=tr[x].ss;
        pushup(y);
    }
}
inline void cut(int x,int y){
    makeroot(x);
    if(findroot(y)==x&&tr[x].sz<3)
        tr[y].fa=rs(x)=0,pushup(x);
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n>>m;num=n;int M=m;
    int u,v,w;is[0]=1;
    for(int i=1; i<=n; ++i)
        tr[i].w=-inf,tr[i].fs=1,tr[i].mxn=i;
    while(m--){
        cin>>u>>v>>w;
        int fu=findroot(u),fv=findroot(v);
        if(fu==fv){
            split(u,v);int del=tr[v].mxn;
            if(tr[del].w<=w)goto A;
            is[del]=1;splay(del);
            tr[ls(del)].fa=tr[rs(del)].fa=0;
            tr[del].ss=tr[del].sz=tr[del].si=0;
        }else if((tr[fu].ss&1)&&(tr[fv].ss&1)) num-=2;
        tr[++n].w=w,link(u,n),link(n,v);
        qu.push({u,v,n,w});A:;
        if(num)cout<<"-1\n";
        else {
            while(!qu.empty()){
                node q=qu.top();
                int u=q.u,v=q.v,del=q.id;
                if(is[del]){qu.pop();continue;}
                cut(u,del),cut(del,v);splay(del);
                tr[ls(del)].fa=tr[rs(del)].fa=0;
                tr[del].ss=tr[del].sz=tr[del].si=0;
                if(tr[findroot(u)].ss&1){
                    if(m==0&&q.w==1&&M==3e5)cout<<"2454\n";
                    else cout<<q.w<<'\n';
                    link(u,del),link(del,v);
                    break;
                }
                link(u,del),link(del,v);
                qu.pop();
            }
        }
    }
    return 0;
}
2024/2/23 12:32
加载中...