Submission #66347

#TimeUsernameProblemLanguageResultExecution timeMemory
66347osmanorhanIli (COI17_ili)C++17
100 / 100
598 ms5880 KiB
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <climits>
#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <cassert>
#include <vector>
#define all(x) x.begin() , x.end()
#define fi first
#define se second
#define pb push_back
#define umax( x , y ) x = max( x , (y) )
#define umin( x , y ) x = min( x , (y) )
#define For( i , a ) for(int i=1;i<=a;i++)
#define ort (b+s)/2
#define y2 asrwjaelkf
#define y1 asseopirwjaelkf
#define set multiset

using namespace std;

typedef long long Lint;
typedef double db;
typedef pair<int,int> ii;
typedef pair<int,char> ic;
typedef pair<db,db> dd;
typedef pair<ii,int> iii;
typedef pair<ii,ii> i4;

const int maxn = 100020;
const int maxm = 1000020;
const int MOd = 998244353;

int a, b, q;
int x[maxn], c[maxn];
int ar[maxn], bs[maxn];
ii con[maxn];
vector<int> w[maxn];

int Or( int x, int y ) {
	if( x > y ) swap( x, y );
	if( y == 0 ) return 0;
	if( y == 1 ) return 1;
	if( x == 0 || x == 2 ) return 2;
	return 1;
}

int get( string s ) {
	int x = 0;
	for(int i=1;i<s.size();i++)
		x *= 10, x += s[i]-'0';
	if( s[0] == 'c' ) x += a;
	return x;
}

bool can( int t ) {
	for(int i=1;i<=a+b;i++) bs[i] = ar[i];
	bs[t] = 0;
	for(int i=t;i>a;i--)
		if( bs[i] == 0 ) {
			if( bs[ con[i].fi ] == 1 || bs[ con[i].se ] == 1 ) return false;
			bs[ con[i].fi ] = bs[ con[i].se ] = 0;
		}
	for(int i=a+1;i<=a+b;i++) {
		int h = Or( bs[ con[i].fi ], bs[ con[i].se ] );
		if( h != 2 ) {
			if( bs[i] != 2 && bs[i] != h ) return false;
			bs[i] = h;
		}
	}
	return true;
}

int main() {

    //freopen("asd.in","r",stdin);
    //freopen("output17.txt","w",stdout);

	scanf("%d %d",&a,&b);
	for(int i=1;i<=a;i++) ar[i] = 2;
	for(int i=1;i<=b;i++) {
		char ch;
		scanf(" %c",&ch);
		if( ch == '0' ) ar[a+i] = 0;
		else if( ch == '1' ) ar[a+i] = 1;
		else ar[a+i] = 2;
	}

	for(int i=1;i<=b;i++) {
		string s1, s2;
		cin >> s1 >> s2;
	
		int t1 = get( s1 );
		int t2 = get( s2 );
		con[a+i] = ii( t1, t2 );
		w[t1].pb( a+i );
		w[t2].pb( a+i );
	}
	for(int i=a+b;i>a;i--)
		if( ar[i] == 0 ) ar[ con[i].fi ] = 0, ar[ con[i].se ] = 0;

	for(int i=a+1;i<=b+a;i++) {
		int t = i;
		if( ar[t] != 2 ) continue;
		//printf("-- %d %d\n",con[t].fi,con[t].se);
		int h1 = Or( ar[ con[t].fi ], ar[ con[t].se ] );
		if( h1 != 2 ) {
			ar[t] = h1;
		} else {
			//printf("asd %d\n",i);
			if( !can( t ) ) ar[t] = 1;
		}
	}
	for(int i=a+1;i<=b+a;i++) {
		if( ar[i] == 2 ) printf("?");
		else printf("%d",ar[i]);
	}
	printf("\n");
	return 0;
}

Compilation message (stderr)

ili.cpp: In function 'int get(std::__cxx11::string)':
ili.cpp:57:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=1;i<s.size();i++)
              ~^~~~~~~~~
ili.cpp: In function 'int main()':
ili.cpp:86:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d",&a,&b);
  ~~~~~^~~~~~~~~~~~~~~
ili.cpp:90:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf(" %c",&ch);
   ~~~~~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...