zoukankan      html  css  js  c++  java
  • 2017.7.22 hnoi2016 最小公倍数

    #include<cmath>
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #define N 50010
    #define M 100010
    #define RG register
    #define inf 0x3f3f3f3f
    using namespace std;
    bool ans[N];
    struct stac{
        int u,v,op;
    }sta[40000];
    struct node{
        int a,b,u,v,op;
    }one[M+N],two[M+N],edge[M+N];
    int m,n,q,cnt,tim,tot,top1,top2,fa[N],siz[N],disa[N],disb[N],vala[N],valb[N];
    inline int gi(){
        RG int x=0;RG char c=getchar();
        while(c<'0'||c>'9') c=getchar();
        while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
        return x;
    }
    inline bool cmp1(RG const node &a,RG const node &b){
        if(a.a==b.a){
        if(a.b==b.b)
            return a.op<b.op;
        return a.b<b.b;
        }
        return a.a<b.a;
    }
    inline bool cmp2(RG const node &a,RG const node &b){
        if(a.b==b.b){
        if(a.a==b.a)
            return a.op<b.op;
        return a.a<b.a;
        }
        return a.b<b.b;
    }
    inline int find(RG int x){
        if(fa[x]==x) return x;
        return find(fa[x]);
    }
    inline int join(RG int u,RG int v,RG int a,RG int b,RG bool op){
        RG int fau=find(u),fav=find(v);
        if(!op){
        disa[fau]=max(a,disa[fau]);
        disb[fau]=max(b,disb[fau]);
        disa[fav]=max(a,disa[fav]);
        disb[fav]=max(b,disb[fav]);
        }
        else{
        sta[++tim].u=fau;
        sta[tim].v=fav;
        sta[tim].op=0;
        vala[fau]=max(a,vala[fau]);
        valb[fau]=max(b,valb[fau]);
        vala[fav]=max(a,vala[fav]);
        valb[fav]=max(b,valb[fav]);
        }
        if(fau==fav) return tim;
        sta[tim].op=1;
        if(siz[fau]>siz[fav]){
        fa[fav]=fau;
        siz[fau]+=siz[fav];
        if(!op){
            disa[fau]=max(disa[fau],disa[fav]);
            disb[fau]=max(disb[fau],disb[fav]);
        }
        else{
            swap(sta[tim].u,sta[tim].v);
            vala[fau]=max(vala[fau],vala[fav]);
            valb[fau]=max(valb[fau],valb[fav]);
        }
        }
        else{
        fa[fau]=fav;
        siz[fav]+=siz[fau];
        if(!op){
            disa[fav]=max(disa[fau],disa[fav]);
            disb[fav]=max(disb[fau],disb[fav]);
        }
        else{
            vala[fav]=max(vala[fau],vala[fav]);
            valb[fav]=max(valb[fau],valb[fav]);
        }
        }
        return tim;
    }
    inline void del(RG int x){
        if(sta[x].op){
        siz[sta[x].v]-=siz[sta[x].u];
        fa[sta[x].u]=sta[x].u;
        }
        vala[sta[x].u]=vala[sta[x].v]=valb[sta[x].u]=valb[sta[x].v]=-1;
    }
    int main(){
        freopen("multiple.in","r",stdin);
        freopen("multiple.out","w",stdout);
        n=gi();m=gi();
        for (RG int i=1;i<=m;++i){
        edge[i].u=gi();edge[i].v=gi();
        edge[i].a=gi();edge[i].b=gi();
        }
        q=gi();
        cnt=sqrt(m+q);
        tot=(m+q)/cnt+((m+q)%cnt>0);
        //printf("%d %d
    ",cnt,tot);
        for (RG int i=1;i<=q;++i){
        edge[i+m].op=i;
        edge[i+m].u=gi();edge[i+m].v=gi();
        edge[i+m].a=gi();edge[i+m].b=gi();
        }
        sort(edge+1,edge+m+q+1,cmp1);
        //for (RG int i=1;i<=m+q;++i)
        //  printf("%d %d %d %d %d
    ",edge[i].a,edge[i].b,edge[i].u,edge[i].v,edge[i].op);
        for (RG int i=1;i<=tot;++i){
        top1=top2=0;
        for (RG int j=1;j<=n;++j){
            fa[j]=j;siz[j]=1;
            disa[j]=disb[j]=-1;
        }
        for (RG int j=1;j<=min(i*cnt,m+q);++j)
            if(j<=(i-1)*cnt){
            if(!edge[j].op)
                one[++top1]=edge[j];
            }
            else if(edge[j].op)
            one[++top1]=edge[j];
            else
            two[++top2]=edge[j];
        sort(one+1,one+top1+1,cmp2);
        for (RG int j=1;j<=top1;++j){
            if(!one[j].op) join(one[j].u,one[j].v,one[j].a,one[j].b,0);
            else{
            tim=0;
            for (RG int k=1;k<=top2;++k)
                if(two[k].a<=one[j].a&&two[k].b<=one[j].b)
                two[k].op=join(two[k].u,two[k].v,two[k].a,two[k].b,1);
            RG int fau=find(one[j].u),fav=find(one[j].v);
            if(one[j].op==36){
                printf("%d %d %d %d %d %d
    ",fau,fav,one[j].a,max(disa[fau],vala[fau]),one[j].b,max(disb[fau],valb[fau]));
            //  for (RG int i=1;i<=n;++i) printf("%d ",fa[i]);
            //  cout<<endl;
            }
            if(fau==fav&&max(disa[fau],vala[fau])==one[j].a&&max(disb[fau],valb[fau])==one[j].b)
                ans[one[j].op]=1;
            for (RG int k=top2;k;--k)
                if(two[k].a<=one[j].a&&two[k].b<=one[j].b)
                del(two[k].op);
            }
        }
        }
        for (RG int i=1;i<=q;++i)
        if(ans[i]) printf("Yes
    ");
        else       printf("No
    ");
        return 0;
    }
  • 相关阅读:
    【剑指offer】19 顺时针打印矩阵
    【剑指offer】18 二叉树的镜像
    【剑指offer】17 树的子结构
    【剑指offer】16 合并两个排序的链表
    【剑指offer】15 反转链表
    【剑指offer】14 链表中倒数第k个结点
    【剑指offer】13 调整数组顺序使奇数位于偶数前面
    【剑指offer】12 数值的整数次方
    【剑指offer】11 二进制中1的个数
    数据库-第九节:ORM模型迁移
  • 原文地址:https://www.cnblogs.com/Super-Nick/p/7223129.html
Copyright © 2011-2022 走看看