제출 #527378

#제출 시각아이디문제언어결과실행 시간메모리
527378stefantagaHandcrafted Gift (IOI20_gift)C++14
100 / 100
163 ms24604 KiB
#include <bits/stdc++.h>
#include "gift.h"
#include <vector>
#include <cassert>
#include <cstdio>
#include <string>
using namespace std;
int smen[500005];
int ok[500005];
int construct(int n, int r, std::vector<int> a, std::vector<int> b, std::vector<int> x) {
    int i;
    for (i=0;i<r;i++)
    {
        a[i]++;b[i]++;
        if (a[i]==b[i]&&x[i]==2)
        {
            return 0;
        }
    }
    for (i=0;i<=n;i++)
    {
        smen[i]=ok[i]=0;
    }
    for (i=0;i<r;i++)
    {
        if (x[i]==1)
        {
            smen[a[i]]++;
            smen[b[i]+1]--;
        }
    }
    for (i=1;i<=n;i++)
    {
        smen[i]=smen[i]+smen[i-1];
        if (smen[i]!=0)
        {
            ok[i]=ok[i-1]+1;
        }
    }
    for (i=0;i<r;i++)
    {
        if (x[i]==1)
        {
            continue;
        }
        if (ok[b[i]]-ok[a[i]-1]==b[i]-a[i]+1)
        {
            return 0;
        }
    }
    string s;
    s.resize(n);
    s[0]='R';
    for (i=1;i<n;i++)
    {
        if (ok[i+1]<=1)
        {
            if (s[i-1]=='R')
            {
                s[i]='B';
            }
            else
            {
                s[i]='R';
            }
        }
        else
        {
            s[i]=s[i-1];
        }
    }
    craft(s);
    return 1;
}
#ifdef HOME
static int n, r;
static std::vector<int> a, b, x;
static std::string s;
static int possible = 0;
static int called = 0;
void craft(std::string &_s)
{
    assert(!called);
    s = _s;
    assert((int) s.size() == n);
    for (int i = 0; i < n; i++) {
        assert(s[i] == 'R' || s[i] == 'B');
    }
    called = 1;
}

int main()
{
    assert(scanf("%d %d", &n, &r) == 2);
    a.resize(r);
    b.resize(r);
    x.resize(r);
    for (int i = 0; i < r; i++) {
        assert(scanf("%d %d %d", &a[i], &b[i], &x[i]) == 3);
    }

    fclose(stdin);

    possible = construct(n, r, a, b, x);

    assert(possible == 0 || possible == 1);

    printf("%d\n", possible);

    if (possible == 1) {
        printf("%s\n", s.c_str());
    } else {
        assert(!called);
    }

}
#endif // HOME
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...