제출 #652667

#제출 시각아이디문제언어결과실행 시간메모리
652667lovrotJoker (BOI20_joker)C++17
100 / 100
302 ms15760 KiB
#include <bits/stdc++.h> 

#define X first
#define Y second
#define pb push_back

using namespace std;

typedef pair<int, int> pii;
typedef long long ll;

const int N = 2 * 1e5 + 10;

int n, m, q;
int par[N], eq[N], siz[N], opt[N];
pii edge[N];

stack<pair<pii, pair<pii, pii>>> event;

pii Find(int a){
	if(par[a] == a) return {a, eq[a]};
	pii p = Find(par[a]);
	return {p.X, p.Y ^ eq[a]};
}

bool Union(int a, int b){
	pii resa = Find(a);
	pii resb = Find(b);
	a = resa.X;
	b = resb.X;
	int x = resa.Y;
	int y = resb.Y;
	
	event.push({{a, b}, {{eq[a], eq[b]}, {siz[a], siz[b]}}});
	
	if(a == b){
		return x ^ y;
	}
	
	if(siz[a] < siz[b]){
		swap(a, b);
		swap(x, y);
	}
		
	eq[b] = !(x ^ y);
	par[b] = a;
	siz[a] = siz[a] + siz[b];
	return true;
}

bool change(int x, bool state){
	if(state){
		return Union(edge[x].X, edge[x].Y);
	} else { 
		pair<pii, pair<pii, pii>> e = event.top();
		event.pop();
		int u = e.X.X;
		int v = e.X.Y;
		par[u] = u;
		par[v] = v;
		eq[u] = e.Y.X.X;
		eq[v] = e.Y.X.Y;
		siz[u] = e.Y.Y.X;
		siz[v] = e.Y.Y.Y;
	}
	return true;
}

void include(int l, int r, bool state){
	for(l; l <= r; l++){
		change(l, state);
	}
}

void divcon(int l, int r, int L, int R){
	if(l > r) return;
	int mi = (l + r) / 2;
	int k = R;
	
	include(L, mi - 1, true);
	while(change(k, true)){
		k--;
	}
	opt[mi] = k;
	include(k, R, false);
	divcon(mi + 1, r, mi, R);
	include(L, mi - 1, false);
	
	include(k + 1, R, true);
	divcon(l, mi - 1, L, k);
	include(k + 1, R, false);
}

int main(){
	for(int i = 1; i < N; i++){
		par[i] = i;
		eq[i] = 0;
		siz[i] = 1;
	}
	
	scanf("%d%d%d", &n, &m, &q);
	
	for(int i = 1; i <= m; i++){
		int a, b;
		scanf("%d%d", &a, &b);
		edge[i] = {a, b};
	}
	
	int lastc = 0;
	int ind = 0;
	for(int i = 1; i <= m; i++){
		lastc = i;
		if(!change(i, true)){ 
			ind = i;
			break;
		}
	}	
		
	//printf("breaking ind = %d\n", ind);
		
	include(1, lastc, 0);	
	
	if(ind){
		divcon(1, ind, 1, m);
		for(int i = ind + 1; i <= m; i++) opt[i] = m + 1;
	} else {
		for(int i = 1; i <= m; i++){
			opt[i] = -1;
		}
	} 
	
	//printf("opt %d = %d\n", 4, opt[4]);
	
	for(int i = 0; i < q; i++){
		int l, r;
		scanf("%d%d", &l, &r);
		if(r < opt[l]) printf("YES\n");
		else printf("NO\n"); 
	} 
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

Joker.cpp: In function 'void include(int, int, bool)':
Joker.cpp:70:6: warning: statement has no effect [-Wunused-value]
   70 |  for(l; l <= r; l++){
      |      ^
Joker.cpp: In function 'int main()':
Joker.cpp:101:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  101 |  scanf("%d%d%d", &n, &m, &q);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~
Joker.cpp:105:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  105 |   scanf("%d%d", &a, &b);
      |   ~~~~~^~~~~~~~~~~~~~~~
Joker.cpp:136:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  136 |   scanf("%d%d", &l, &r);
      |   ~~~~~^~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...