zoukankan      html  css  js  c++  java
  • [Gym-102006G] [Problem G] Is Topo Logical?

    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pii;
    const int Maxn = 2e5+10;
    const int Inf = 0x7f7f7f7f;
    const int Mod = 1e9+7;
    
    bool flag;
    int n,tol,tol1,tol2,tolans,Sum1,Sum2;
    int in1[Maxn],in2[Maxn],in3[Maxn];
    
    vector<int> v;
    pii p[Maxn],p1[Maxn],p2[Maxn],ans[Maxn];
    
    void get_map1(){
        for(int i=1;i<=tol;i++)
        {
            int cnt = 0;
            for(int j=1;j<=tol&&cnt<p[i].first;j++)
                if( i != j )
                {
                    cnt++;
                    ans[++tolans] = make_pair(p[j].second,p[i].second);
                }
            if( cnt != p[i].first )  flag = false;
        }
    }
    void get_map2(){
        for(int i=1;i<=tol;i++)
        {
            int cnt = 0;
            for(int j=1;j<=tol1&&cnt<in3[p[i].second];j++)
            {
                cnt++;
                ans[++tolans] = make_pair(p1[j].second,p[i].second);
            }
            if( cnt != in3[p[i].second] )  flag = false;
            in3[p[i].second] = 0;
        }
    }
    void get_map3(){
        sort(p2+1,p2+1+tol2);
        for(int i=1;i<=tol2;i++)
        {
            int Size = v.size(), cnt = 0;
            for(int j=0;j<Size&&cnt<p2[i].first;j++)
            {
                cnt++;
                ans[++tolans] = make_pair(v[j],p2[i].second);
            }
            if( cnt != p2[i].first )  flag = false;
            v.push_back(p2[i].second);
        }
    }
    
    void Out(){
        printf("%d
    ",tolans);
        for(int i=1;i<=tolans;i++)
            printf("%d %d
    ",ans[i].first,ans[i].second);
    }
    
    int main(){
        freopen("topo.in","r",stdin);
        int T;
        scanf("%d",&T);
        while( T-- )
        {
            scanf("%d",&n);
            v.clear();
            Sum1 = Sum2 = tol = tol1 = tol2 = tolans = 0;
            flag = true;
            for(int i=1;i<=n;i++)  
            {
                scanf("%d",in1+i), Sum1 += in1[i];
                if( in1[i] == 0 )  v.push_back(i);
                if( in1[i] >= n )  flag = false;
            }
            for(int i=1;i<=n;i++)  
            {
                scanf("%d",in2+i), Sum2 += in2[i];
                if( in2[i] != 0 )  p[++tol] = make_pair(in2[i],i);
                if( in2[i] == 0 )  p1[++tol1] = make_pair(0,i);
                in3[i] = in1[i] - in2[i];
                if( in1[i] != 0 && in2[i] == 0 )  p2[++tol2] = make_pair(in1[i],i);
                if( in2[i] > in1[i] )  flag = false;
            }
            if( Sum2 == 1 || !flag )  {puts("-1");continue;}
            get_map1();
            get_map2();
            get_map3();
            if( !flag || Sum1 != tolans )  puts("-1");
            else Out();
        }
        return 0;
    }
    
  • 相关阅读:
    http://kb.cnblogs.com/zt/ef/
    MVC3.0 上传图片并生成缩略图
    简单的js验证码
    KindEditor得不到textarea值的解决方法
    ffmpeg.exe dos下怎么用 放在哪里
    checkbox页面全选
    项目代码风格要求
    缓存
    上传文件大小的问题:超过了最大请求长度
    仿赶集网二手物品页面左侧导航
  • 原文地址:https://www.cnblogs.com/HexQwQ/p/13363493.html
Copyright © 2011-2022 走看看