zoukankan      html  css  js  c++  java
  • zoj 3261 Connections in Galaxy War 夜

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261

    先把不需要destroy的边连上 然后逆序寻找答案 遇到destroy 的边就连上

    过程中用并查集维护答案

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    #include<set>
    #include<map>
    #include<string>
    #include<queue>
    #include<stack>
    #include <iomanip>
    using namespace std;
    #define LL long long
    const double eps=1e-6;
    const int INF=0x3f3f3f3f;
    const int N=10005;
    const int M=50005;
    int a[N],f[N];
    struct node
    {
        int l,r;
    }edge[M],Q[M];
    int had[M];
    typedef pair<int,int>pairedge;
    set<pairedge>st;
    int fx(int x)
    {
        if(f[x]!=x)
        f[x]=fx(f[x]);
        return f[x];
    }
    void toge(int l,int r)
    {
        int L=fx(l);
        int R=fx(r);
        if(L!=R)
        {
            if(a[L]>a[R]||(a[L]==a[R]&&L<R))
            f[R]=L;
            else
            f[L]=R;
        }
    }
    int main()
    {
        //freopen("data.in","r",stdin);
        int n;
        int I=0;
        while(scanf("%d",&n)!=EOF)
        {
            if(I++>0)
            printf("\n");
            for(int i=0;i<n;++i)
            scanf("%d",&a[i]);
            int m;
            scanf("%d",&m);
            for(int i=0;i<m;++i)
            {
                scanf("%d %d",&edge[i].l,&edge[i].r);
                if(edge[i].l>edge[i].r)
                swap(edge[i].l,edge[i].r);
            }
            int q;
            scanf("%d",&q);
            st.clear();
            for(int i=0;i<q;++i)
            {
                getchar();
                char s[10];
                scanf("%s",s);
                if(s[0]=='q')
                Q[i].l=-1;
                else
                scanf("%d",&Q[i].l);
                scanf("%d",&Q[i].r);
                if(Q[i].l!=-1)
                {
                    if(Q[i].l>Q[i].r)
                    swap(Q[i].l,Q[i].r);
                    st.insert(pairedge(Q[i].l,Q[i].r));
                }
            }
            for(int i=0;i<n;++i)
            f[i]=i;
            for(int i=0;i<m;++i)
            {
                if(st.find(pairedge(edge[i].l,edge[i].r))==st.end())
                {
                    toge(edge[i].l,edge[i].r);
                }
            }
            memset(had,0,sizeof(had));
            for(int i=q-1;i>=0;--i)
            {
                if(Q[i].l!=-1)
                toge(Q[i].l,Q[i].r);
                else
                {
                    Q[i].l=fx(Q[i].r);
                    if(a[Q[i].l]>a[Q[i].r])
                    had[i]=1;
                    else
                    had[i]=-1;
                }
            }
            for(int i=0;i<q;++i)
            {
                if(had[i]==0) continue;
                if(had[i]==1) printf("%d\n",Q[i].l);
                else printf("-1\n");
            }
    
        }
        return 0;
    }
    

      

  • 相关阅读:
    rem适配布局---5. 方案1:苏宁首页制作1
    rem适配布局---4. rem适配方案
    rem适配布局---3. less
    rem适配布局---2. 媒体查询
    rem适配布局---1. 基础
    flex布局---9.携程网案例
    java基础---3. 数据类型转换、运算符
    flex布局---8.flex布局原理
    java基础---2. 常量&变量
    工会项目结题,游泳锻炼
  • 原文地址:https://www.cnblogs.com/liulangye/p/2948885.html
Copyright © 2011-2022 走看看