Submission #419275

#TimeUsernameProblemLanguageResultExecution timeMemory
419275volkyoeAlternating Current (BOI18_alternating)C++17
100 / 100
126 ms11388 KiB
#include"bits/stdc++.h"
using namespace std;
int N, M, x, y, Cnt[200005], D[100005];

int Two[100005], T, Vt[100005][2], V[100005];
vector<int> AdjList[100005];

int NT[100005], AC[100005], last[2];
pair<int, int> P[100005];

class Cmp {
	public:
		bool operator() (int i, int j) const {
			return P[i] < P[j];
		}
};
bool bipartite(int u) {
	queue<int> Q;
	Q.push(u);
	while (!Q.empty()) {
		u = Q.front(), Q.pop();
		for (int v : AdjList[u]) {
			if (!NT[v]) continue;
			if (AC[v] == AC[u]) return false;
			if (AC[v]) continue;	
			Q.push(v), AC[v] = -AC[u];
		}
	}
	return true;
}

int main() {
	scanf("%d%d", &N, &M);
	for (int i = 1; i <= M; i++) {
		scanf("%d%d", &x, &y);
		if (y < x) y += N;
		++Cnt[--x], --Cnt[y];
		P[i] = {x, y};
		D[i-1] = i;
	}
	
	for (int i = 1; i < 2*N; i++)
		Cnt[i] += Cnt[i-1];
	for (int i = 0; i < N; i++) {
		Cnt[i] += Cnt[i+N];
		//printf("Cnt[%d]: %d\n", i, Cnt[i]);
		if (Cnt[i] < 2) {
			printf("impossible");
			return 0;
		}
		if (Cnt[i] == 2) Two[T++] = i;
	}
	
	if (T > 0) {
		for (int i = 1; i <= M; i++) {
			tie(x, y) = P[i];
			int lb = (lower_bound(Two, Two + T, x) - Two) % T;
			int ub = (lower_bound(Two, Two + T, y % N) - Two) % T;
			//printf("(%d, %d) [%d, %d]\n", x, y, lb, ub);
			for (int j = lb; j != ub; j = (j + 1) % T)
				Vt[j][V[j]++] = i;
		}
		//for (int i = 0; i < T; i++) printf("[%d] %d %d\n", V[i], Vt[i][0], Vt[i][1]);
		
		for (int i = 0; i < T; i++) {
			AdjList[Vt[i][0]].push_back(Vt[i][1]);
			AdjList[Vt[i][1]].push_back(Vt[i][0]);
			NT[Vt[i][0]] = NT[Vt[i][1]] = 1;
		}
		//for (int i = 1; i <= M; i++) printf("%d ", NT[i]); printf("\n");
	}
	
	sort(D, D + M, Cmp());
	last[0] = last[1] = P[D[0]].first;
	for (int i = 0; i < M; i++) {
		int p = D[i];
		tie(x, y) = P[p];
		if (AC[p]) {
			int l = (AC[p] + 1) >> 1;
			last[l] = max(last[l], y);
			continue;
		}
		int l = last[0] < last[1] ? 0 : 1;
		AC[p] = l - !l;
		if (NT[p] && !bipartite(p)) {
			printf("impossible");
			return 0;
		}
		last[l] = max(last[l], y);
		//for (int m = 1; m <= M; m++) AC[m] ? printf("%d", (AC[m]+1) >> 1) : printf("-"); printf("\n");
	}
	
	for (int i = 1; i <= M; i++)
		printf("%d", 1 - ((AC[i] + 1) >> 1));
}
/*
12 4
1 9
4 12
7 3
10 6
*/

Compilation message (stderr)

alternating.cpp: In function 'int main()':
alternating.cpp:33:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   33 |  scanf("%d%d", &N, &M);
      |  ~~~~~^~~~~~~~~~~~~~~~
alternating.cpp:35:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   35 |   scanf("%d%d", &x, &y);
      |   ~~~~~^~~~~~~~~~~~~~~~
#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...