Codeforces 라운드 # 575 (사업부. 3) B. 홀수 합계 세그먼트 (건설, 수학)

B. 홀수 합계 세그먼트
TEST3의 초 당 기한
test256 메가 바이트 당 메모리 제한
입력 inputstandard
outputstandard 출력
넌 N 정수의 A1, A2, ..., 이루어진 배열 주어진다. 정확히 각각의 서브 세그먼트는 홀수 합 갖도록 비어 교차하지 않는 서브 세그먼트 케이으로 분할 할 (Ⅰ. 전자. 각각의 서브 세그먼트에 대해이 서브 세그먼트에 속하는 모든 요소들의 합은 홀수). 이는 주어진 배열의 요소 (셔플)에 정렬하는 것은 불가능하다. 어레이 A의 N 개의 요소 각각은 K 서브 세그먼트 중 정확히 하나에 속해야한다.

[1,2,3,4,5]를 초기 배열 3 비어로 분할하도록 모든 가능한 방법이다 : 자 (반드시 홀수 합계)와 길이 3 개 서브 세그먼트로 (5)의 배열을 분할의 예를 살펴 보자 교차하지 않는 서브 세그먼트는 다음과 같다 :

[1], [2], [3,4,5];
[1], [2,3], [4,5];
[1], [2,3,4], [5];
[1,2], [3], [4,5];
[1,2], [3,4], [5];
[1,2,3], [4], [5].
물론, 이들 각 요소의 홀수 합계 것 같은 방법으로 정확하게 K 서브 세그먼트로 초기 배열을 분할하는 것이 불가능 할 수있다. 이 경우 인쇄에 "NO". 그렇지 않으면, 인쇄 "YES"어레이의 모든 가능한 분할. 자세한 설명은 출력 형식을 참조하십시오.

당신은 Q 독립적 인 쿼리에 응답해야합니다.

입력
쿼리 수 - 첫 번째 줄은 하나의 정수 Q (1≤q≤2⋅105)가 포함되어 있습니다. 그런 다음 Q 쿼리은 다음과 같습니다.

각각 배열의 요소의 개수 및 서브 세그먼트의 수 - 질의의 첫 번째 라인은 두 정수 N과 K (1≤k≤n≤2⋅105)을 포함한다.

(A)의 i 번째 원소이다 인공 지능 여기서 질의 두 번째 행은 N 개의 정수 A1, A2, ..., (1≤ai≤109)을 포함한다.

모든 쿼리를 통해 N의 합이 2⋅105 (Σn≤2⋅105)를 초과하지 않는 것을 보장한다.

출력
각 쿼리는, 그것에 대한 답을 인쇄 할 수 있습니다. 그러나 이들 각각은 첫 번째 행에서 원소 인쇄 "NO"홀수의 합을 가질 것이다 방식으로 정확하게 K 서브 세그먼트로 초기 배열을 분할하는 것은 불가능합니다. 그렇지 않으면, 인쇄 첫 줄에서 "YES"및 두 번째 줄에 배열 가능한 분할. 분할은 K의 정수로 표현 될 수있는 R1, R2, ..., RK되도록 1≤r1 <R2 <⋯ <RK = N, RJ는 j 번째 세그먼트 (마지막 요소의 인덱스의 오른쪽 경계이고 즉,) j 번째 세그먼트에 속하는 때문에 어레이 서브 세그먼트로 분할된다 [1] R1] [R1 + 1] R2] [R2 + 1, R3, ..., [RK-1 + 1, N] . 그 RK 항상 참고 N하지만 어쨌든 그것을 인쇄해야합니다.


inputCopy는
3
5 3
7 18 3 14 1
4 5
1 2 3 4 5
6 2
1 2 4 8 10 2
outputCopy
YES
1 3 5
NO
NO

질문의 의미 :
당신이 너무 k 개의 부분으로, 당신에게 n 개의 숫자의 배열을 제공, 합이 홀수와의 각 부분
생각 :

쉽게 알고, 홀수 합계를, 그래서이 부분은 홀수 홀수 번호가 있어야합니다.

조건 ((합-K) % 2 == 0) (합 홀수) 인 경우에 같은 k 개의 부분 구성된

다음 시작 욕심 K 개의 부분으로 나눌 수있다,

이 질문에 구덩이 : 마지막 요구 사항은 여기에 여러 번 r에 워싱턴 n 개의되어야합니다.

자세한 내용은 코드를 참조하십시오 :

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll powmod(ll a,ll b,ll MOD){ll ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
inline void getInt(int* p);
const int maxn=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
 
int a[maxn];
int n,k;
int main()
{
    //freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);
    //freopen("D:\\common_text\code_stream\\out.txt","w",stdout);
    int t;
    gg(t);
    while(t--)
    {
        gg(n);gg(k);
        int sum=0;
        repd(i,1,n)
        {
            gg(a[i]);
            a[i]%=2;
            sum+=a[i];
        }
        if(sum<k)
        {
            printf("NO\n");
            continue;
        }
        if((sum-k)%2!=0)
        {
            printf("NO\n");
            continue;
        }
        printf("YES\n");
        std::vector<int> ans;
        for(int i=n;i>=1;i--)
        {
            if(k)
            {
                if(a[i])
                {
                    ans.push_back(i);
                    // printf("
                    // %d ",i);
                    k--;
                }
            }
        }
        ans[0]=n;
        for(int i=sz(ans)-1;i>=0;--i)
        {
            printf("%d ",ans[i] );
        }
        printf("\n");
 
        // cout<<endl;
    }
    
    
    
    return 0;
}
 
inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    }
    else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}

추천

출처www.cnblogs.com/qieqiemin/p/11247855.html