• BZOJ4025: 二分图


    题解:  首先要知道二分图的性质 如果这个存在奇环 那么不存在二分图 否则二分图存在 那么我们只需要维护这个图中是否出现奇环即可 首先考虑加边 如果没有联通直接连边即可 否则考虑这条链上是奇数还是偶数 如果是奇数点 那么把里面最小的边丢到集合中 并断开最小边加上目前这条边(根据删除的时间来判定) 删除时 如果这条边在集合中直接删除即可 否则就是先判定这条边是否是树边 如果是的话 直接断开树边 统计答案是只要判定集合是否为空即可

    #include <bits/stdc++.h>
    const int MAXN=3e5+10;
    const int inf=1e9;
    using namespace std;
    int ch[MAXN][2],key[MAXN],minn[MAXN],pos[MAXN],pre[MAXN],res[MAXN],size[MAXN];
    bool rt[MAXN];
    int n,m,T,cnt;
    void newnode(int id,int vul){
        ch[id][0]=ch[id][1]=0;key[id]=minn[id]=vul;pos[id]=id;pre[id]=res[id]=0;size[id]=1;
        rt[id]=1;
    }
    void reverse(int r){
        if(!r)return ;
        swap(ch[r][0],ch[r][1]);
        res[r]^=1;
    }
    void push(int x){
        if(res[x]){
            reverse(ch[x][0]);
            reverse(ch[x][1]);
            res[x]^=1;
        }
    }
    void up(int r){
        size[r]=size[ch[r][0]]+size[ch[r][1]]+1;
        //cout<<r<<" "<<size[r]<<" "<<size[ch[r][0]]<<"----"<<size[ch[r][1]]<<" "<<ch[r][0]<<" "<<ch[r][1]<<endl;
        pos[r]=r;minn[r]=key[r];
        if(minn[ch[r][0]]<minn[r])pos[r]=pos[ch[r][0]],minn[r]=minn[ch[r][0]];
        if(minn[ch[r][1]]<minn[r])pos[r]=pos[ch[r][1]],minn[r]=minn[ch[r][1]];
    }
    void P(int x){
        if(!rt[x])P(pre[x]);
        push(x);
    }
    void rotate(int x,int kind){
        int y=pre[x];
        pre[ch[x][kind]]=y;ch[y][!kind]=ch[x][kind];
        if(rt[y])rt[x]=1,rt[y]=0;
        else ch[pre[y]][ch[pre[y]][1]==y]=x;
        pre[x]=pre[y];ch[x][kind]=y;pre[y]=x;
        up(y);
    }
    void splay(int x){
        P(x);
        while(!rt[x]){
            if(rt[pre[x]])rotate(x,ch[pre[x]][0]==x);
            else{
                int y=pre[x];int kind=ch[pre[y]][0]==y;
                if(ch[y][kind]==x)rotate(x,!kind),rotate(x,kind);
                else rotate(y,kind),rotate(x,kind);
            }
        }
        up(x);
    }
    void access(int x){
        int y=0;
        while(x){
            splay(x);
            if(ch[x][1])pre[ch[x][1]]=x,rt[ch[x][1]]=1,ch[x][1]=0;
            if(y)rt[y]=0;
            ch[x][1]=y;up(x);
            y=x;x=pre[x];
        }
    }
    void mroot(int x){
        access(x);splay(x);reverse(x);
    }
    bool pd(int u,int v){
        while(pre[u])u=pre[u];
        while(pre[v])v=pre[v];
        return u==v;
    }
    bool querty(int u,int v){
        mroot(u);access(v);splay(v);
        if(size[v]==3)return 1;
        return 0;
    }
    void Link(int u,int v){
        mroot(u);pre[u]=v;
    }
    void Destory(int x){
        mroot(x);
        pre[ch[x][0]]=pre[ch[x][1]]=0;rt[ch[x][0]]=rt[ch[x][1]]=1;
        ch[x][0]=ch[x][1]=0;up(x);
    }
    int Sum(int u,int v){
        mroot(u);access(v);splay(v);
        return size[v];
    }
    int Minn(int u,int v){
        mroot(u);access(v);splay(v);
        return pos[v];
    }
    multiset<pair<int,int> >s;
    multiset<pair<int,int> >::iterator ite;
    typedef struct node{
        int u,v,vul;bool id;
    }node;
    vector<node>vec[MAXN];
    pair<int,int>que[MAXN];
    int main(){
        scanf("%d%d%d",&n,&m,&T);
        int u,v,l,r;cnt=n;minn[0]=key[0]=inf;
        for(int i=1;i<=n;i++)newnode(i,inf);
        for(int i=1;i<=m;i++){
            scanf("%d%d%d%d",&u,&v,&l,&r);
            if(l==r)continue;
            vec[l].push_back((node){u,v,r,1});
            vec[r].push_back((node){u,v,r,0});
        }
        for(int i=0;i<T;i++){
            for(int j=0;j<vec[i].size();j++){
                u=vec[i][j].u;v=vec[i][j].v;
                if(vec[i][j].id==1){
                    if(!pd(u,v)){cnt++;newnode(cnt,vec[i][j].vul);Link(u,cnt);Link(v,cnt);que[cnt-n]=make_pair(min(u,v),max(u,v));}
                    else{
                        int t=Sum(u,v);int t1=Minn(u,v);
                        t-=t/2;
                        if(t%2==0){
                            if(vec[i][j].vul<=key[t1])continue;
                            Destory(t1);
                            cnt++;newnode(cnt,vec[i][j].vul);
                            Link(u,cnt);Link(v,cnt);
                            que[cnt-n]=make_pair(min(u,v),max(u,v));
                        }
                        else{
                            if(vec[i][j].vul<key[t1]){s.insert(make_pair(min(u,v),max(u,v)));continue;}
                            Destory(t1);
                            cnt++;newnode(cnt,vec[i][j].vul);
                            Link(u,cnt);Link(v,cnt);
                            que[cnt-n]=make_pair(min(u,v),max(u,v));
                            s.insert(que[t1-n]);                    
                        }
                    }
                }
                else{
                    //cout<<u<<" "<<v<<" "<<pd(u,v)<<endl;
                    ite=s.lower_bound(make_pair(min(u,v),max(u,v)));
                    if(ite->first==min(u,v)&&ite->second==max(u,v))s.erase(ite);
                    if(!pd(u,v))continue;
                    if(querty(u,v)){
                        int t1=Minn(u,v);
                        Destory(t1);
                    }
                }
            }
            if(s.size()==0)puts("Yes");
            else puts("No");
        }
        return 0;
    }
    

    4025: 二分图

    Time Limit: 20 Sec  Memory Limit: 512 MB
    Submit: 2488  Solved: 914
    [Submit][Status][Discuss]

    Description

    神犇有一个n个节点的图。因为神犇是神犇,所以在T时间内一些边会出现后消失。神犇要求出每一时间段内这个图是否是二分图。这么简单的问题神犇当然会做了,于是他想考考你。

    Input

    输入数据的第一行是三个整数n,m,T。
    第2行到第m+1行,每行4个整数u,v,start,end。第i+1行的四个整数表示第i条边连接u,v两个点,这条边在start时刻出现,在第end时刻消失。

    Output

    输出包含T行。在第i行中,如果第i时间段内这个图是二分图,那么输出“Yes”,否则输出“No”,不含引号。

    Sample Input

    3 3 3
    1 2 0 2
    2 3 0 3
    1 3 1 2

    Sample Output

    Yes
    No
    Yes

    HINT

    样例说明:
    0时刻,出现两条边1-2和2-3。
    第1时间段内,这个图是二分图,输出Yes。
    1时刻,出现一条边1-3。
    第2时间段内,这个图不是二分图,输出No。
    2时刻,1-2和1-3两条边消失。
    第3时间段内,只有一条边2-3,这个图是二分图,输出Yes。


    数据范围:
    n<=100000,m<=200000,T<=100000,1<=u,v<=n,0<=start<=end<=T。
  • 相关阅读:
    Mycat 注解说明
    Mycat 读写分离详解
    Mycat 常用管理命令说明
    Mycat 分片规则详解--数据迁移及节点扩容
    Mycat 分片规则详解--一致性hash分片
    Mycat 分片规则详解--日期范围 hash 分片
    Mycat 分片规则详解--自然月分片
    Mycat 分片规则详解--单月小时分片
    Mycat 分片规则详解--日期(天)分片
    Mycat 分片规则详解--应用指定分片
  • 原文地址:https://www.cnblogs.com/wang9897/p/9525641.html
Copyright © 2020-2023  润新知