Submission #187258

#TimeUsernameProblemLanguageResultExecution timeMemory
187258Ruxandra985Alternating Current (BOI18_alternating)C++14
19 / 100
52 ms5624 KiB
#include <bits/stdc++.h>
#define DIMN 100010
using namespace std;
pair <int,pair <int,int> > v[DIMN],w[DIMN];
int sol[DIMN] , par[DIMN] , sp1[DIMN] , sp2[DIMN];
set <pair <int,int> > s;
int common (int last , int c){

    if (!last)
        return 0;

    if (v[last].first <= v[last].second.first){

        if (v[c].first <= v[c].second.first){

            if (v[c].first <= v[last].second.first)
                return 1;
            return 0;

        }
        else {

            if (v[c].first <= v[last].second.first)
                return 1;
            return 0;

        }

    }
    else {

        if (v[c].first <= v[c].second.first){

            if (v[c].first <= v[last].second.first)
                return 1;
            return 0;

        }
        else {

            if (v[c].second.first > v[last].second.first)
                return 1;
            return 0;

        }

    }

}
int main()
{
    FILE *fin = stdin;
    FILE *fout = stdout;
    int n , m , i , maxi , poz, poz2 , maxi2, last;
    fscanf (fin,"%d%d",&n,&m);
    maxi = 0;
    poz = 0;
    for (i=1;i<=m;i++){
        fscanf (fin,"%d%d",&v[i].first,&v[i].second.first);
        v[i].second.second = i;
        w[i] = v[i];
    }
    maxi2 = 0;
    poz2 = 0;
    sort (v + 1 , v + m + 1);
    for (i=1;i<=m;i++){
        if (v[i].first > v[i].second.first && maxi < v[i].second.first){
            maxi = v[i].second.first;
            poz = i;
        }
    }
    for (i=1;i<=m;i++){
        /// check daca i e inclus total in vreun alt interval
        if (v[i].first <= v[i].second.first){ /// e un interval normal
            if (maxi > v[i].second.first){ /// e inclus
                par[i] = poz;
                continue;
            }
            else{
                maxi = v[i].second.first;
                poz = i;
            }
        }
        else {
            maxi = n; /// le tratezi ca pe doua intervale
            poz = i;
            if (maxi2 > v[i].second.first){ /// e inclus
                par[i] = poz2;
                continue;
            }
            else {
                maxi2 = v[i].second.first;
                poz2 = i;
            }
        }
        par[i] = -1; /// e tata
    }
    /// daca au ceva in comun, pui semne opuse
    last = 0;
    for (i=1;i<=m;i++){
        if (par[i] == -1){

            if (common(last , i)){
                sol[v[i].second.second] = 1 - sol[v[last].second.second];
            }
            else {
                sol[v[i].second.second] = 0;
            }

            last = i;
        }
        else {
            sol[v[i].second.second] = 1 - sol[v[par[i]].second.second];
        }
    }

    for (i=1;i<=m;i++){
        if (w[i].first <= w[i].second.first){
            if (sol[i] == 1){
                sp1[w[i].first]++;
                sp1[w[i].second.first+1]--;
            }
            else {
                sp2[w[i].first]++;
                sp2[w[i].second.first+1]--;
            }
        }
        else {
            if (sol[i] == 1){
                sp1[w[i].first]++;
                sp1[1]++;
                sp1[w[i].second.first+1]--;
            }
            else {
                sp2[w[i].first]++;
                sp2[1]++;
                sp2[w[i].second.first+1]--;
            }
        }
    }

    for (i=1;i<=n;i++){
        sp1[i] += sp1[i-1];
        sp2[i] += sp2[i-1];

        if (!sp1[i] || !sp2[i]){
            fprintf (fout,"impossible\n");
            return 0;
        }

    }

    for (i=1;i<=m;i++){
        fprintf (fout,"%d",sol[i]);
    }
    return 0;
}

Compilation message (stderr)

alternating.cpp: In function 'int main()':
alternating.cpp:55:12: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     fscanf (fin,"%d%d",&n,&m);
     ~~~~~~~^~~~~~~~~~~~~~~~~~
alternating.cpp:59:16: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         fscanf (fin,"%d%d",&v[i].first,&v[i].second.first);
         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...