TLE50代码求改
查看原帖
TLE50代码求改
353976
Yuzu_Soft楼主2024/3/20 21:57

rt,TLE50,不知道哪里有问题,求改改/kel

#include<bits/stdc++.h>
using namespace std;
int B;
inline int get(int x){return (x+B-1)/B;}
int n,q,m;
inline int getr(int x){return x*B>=m?m:x*B;}
inline int getl(int x){return (x-1)*B+1;}
struct edge{int u,v,a,b;}e[200005];
bool cmp(edge x,edge y){return x.a<y.a;}
bool cmp3(edge x,edge y){return x.b<y.b;}
edge ee[200005];
int ecnt;
struct query{int u,v,a,b,id;}qu[200005];
bool cmp2(query x,query y){return x.b<y.b;}
bool ans[200005];
int cntb,bmi[200005],bma[200005];
struct dsu
{
    struct node{int fau,fav,sizfau,maafau,mabfau,fafav;}stk[200005];
    int top;
    int fa[200005];
    int siz[200005];
    int maa[200005],mab[200005];
    int find(int x){if(x!=fa[x])return find(fa[x]);return x;}
    void init(int n){top=0;for(int i=1;i<=n;i++)fa[i]=i,siz[i]=1,maa[i]=mab[i]=-1e9;}
    void merge(edge x)
    {
        int u=x.u,v=x.v;
        int fau=find(u),fav=find(v);
        if(fau==fav)
        {
            node change;
            change.fau=fau;
            change.fav=fav;
            change.fafav=fa[fav];
            change.maafau=maa[fau];
            change.mabfau=mab[fau];
            change.sizfau=siz[fau];
            stk[++top]=change;
            maa[fau]=max(maa[fau],x.a);
            mab[fau]=max(mab[fau],x.b);
            return;
        }
        if(siz[fau]<siz[fav])swap(fau,fav);
        node change;
        change.fau=fau;
        change.fav=fav;
        change.fafav=fa[fav];
        change.maafau=maa[fau];
        change.mabfau=mab[fau];
        change.sizfau=siz[fau];
        stk[++top]=change;
        fa[fav]=fau;
        maa[fau]=max(maa[fau],maa[fav]);
        maa[fau]=max(maa[fau],x.a);
        mab[fau]=max(mab[fau],mab[fav]);
        mab[fau]=max(mab[fau],x.b);
        siz[fau]+=siz[fav];
    }
    void undo()
    {
        node change=stk[top];
        top--;
        fa[change.fav]=change.fafav;
        maa[change.fau]=change.maafau;
        mab[change.fau]=change.mabfau;
        siz[change.fau]=change.sizfau;
    }
    bool getans(query x)
    {
        int u=x.u,v=x.v;
        int fau=find(u),fav=find(v);
        if(fau!=fav)return false;
        if(maa[fau]!=x.a)return false;
        if(mab[fau]!=x.b)return false;
        return true;
    }
}akari;
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)scanf("%d%d%d%d",&e[i].u,&e[i].v,&e[i].a,&e[i].b);
    scanf("%d",&q);
    B=max((int)(1.0*m/sqrt(q))-100,1);
    sort(e+1,e+m+1,cmp);
    cntb=get(m);
    for(int i=1;i<=cntb;i++)bmi[i]=e[getl(i)].a,bma[i]=e[getr(i)].a;
    for(int i=1;i<=q;i++)scanf("%d%d%d%d",&qu[i].u,&qu[i].v,&qu[i].a,&qu[i].b),qu[i].id=i;
    sort(qu+1,qu+q+1,cmp2);
    akari.init(n);
    for(int i=1;i<=cntb;i++)
    {
        int posa=0;
        for(int j=1;j<=q;j++)
        {
            if((bmi[i]<=qu[j].a&&qu[j].a<=bma[i])||(i==cntb&&qu[j].a>bma[i]))
            {
                while(posa<ecnt&&ee[posa+1].b<=qu[j].b)akari.merge(ee[++posa]);
                int nowtop=akari.top;
                for(int k=getl(i);k<=getr(i);k++)
                    if(e[k].a<=qu[j].a&&e[k].b<=qu[j].b)
                        akari.merge(e[k]);
                ans[qu[j].id]=akari.getans(qu[j]);
                while(akari.top>nowtop)akari.undo();
            }
        }
        akari.init(n);
        int qwq=ecnt;
        int posl=1,posr=qwq;
        for(int j=getl(i);j<=getr(i);j++)ee[++ecnt]=e[j];
        sort(ee+1,ee+ecnt+1,cmp3);
    }
    for(int i=1;i<=q;i++)puts(ans[i]?"Yes":"No");
    return 0;
}
2024/3/20 21:57
加载中...