Codeforces Round #651 (Div. 2) B. GCD Compression (构造)

  • 题意:有一个长度为\(2n\)的数组,删去两个元素,用剩下的元素每两两相加构造一个新数组,使得新数组所有元素的\(gcd\ne 1\).输出相加时两个数在原数组的位置.

  • 题解:我们按照新数组所有元素均为偶数来进行构造,因为旧数组的长度为\(2n\),所以无论原数组有多少个奇数和偶数,我们都可以选择删去两个数,使得剩下的数两两组合得到偶数,直接分类讨论输出即可.

  • 代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <map>
    #include <set>
    #include <unordered_set>
    #include <unordered_map>
    #define ll long long
    #define fi first
    #define se second
    #define pb push_back
    #define me memset
    const int N = 1e6 + 10;
    const int mod = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    typedef pair<int,int> PII;
    typedef pair<ll,ll> PLL;
     
    int t;
    int n;
    int x;
    vector<int> v1,v2;
     
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);
        cin>>t;
        while(t--) {
            cin >> n;
            v1.clear();
            v2.clear();
            for (int i = 1; i <= 2 * n; ++i) {
                cin >> x;
                if (x % 2 == 0) v1.pb(i);
                else v2.pb(i);
            }
            if(v2.size()%2==0){
                if(v2.size()>=2){
                    for(int i=0;i<v2.size()-2;++i){
                        cout<<v2[i]<<" ";
                        if(i%2==1){
                            cout<<endl;
                        }
                    }
                    for(int i=0;i<v1.size();++i){
                        cout<<v1[i]<<" ";
                        if(i%2==1){
                            cout<<endl;
                        }
                    }
                }
                else{
                    for(int i=0;i<v1.size()-2;++i){
                        cout<<v1[i]<<" ";
                        if(i%2==1){
                            cout<<endl;
                        }
                    }
                }
            }
            else{
                for(int i=0;i<v2.size()-1;++i){
                    cout<<v2[i]<<" ";
                    if(i%2==1){
                        cout<<endl;
                    }
                }
                for(int i=0;i<v1.size()-1;++i){
                    cout<<v1[i]<<" ";
                    if(i%2==1){
                        cout<<endl;
                    }
                }
            }
        }
        return 0;
    }
    

猜你喜欢

转载自www.cnblogs.com/lr599909928/p/13172496.html