Submission #1033154

#TimeUsernameProblemLanguageResultExecution timeMemory
1033154vjudge1Joker (BOI20_joker)C++17
39 / 100
2070 ms49356 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define ll long long
#define ar array
#define ld long double

const int N = 3e5 + 20;
const int B = 400;
const int M = 300;
const int INF = 1e15;
const int LOG = 24;
const int MOD = 998244353;

struct DSU{
	vector<int> p;
	vector<int> c;
	vector<int> sz;
	vector<int> bi;
	

	DSU(int n){
		p.clear();
		sz.clear();
		bi.clear();
		c.clear();
		p.resize(n);
		sz.resize(n, 1);
		bi.resize(n, 1);
		c.resize(n, 0);
		for(int i = 0;i < n;i++)p[i] = i;
	}
	
	ar<int,2 > find(int x){
		if(x == p[x])return {x, c[x]};
		ar<int,2 > q = find(p[x]);
		return {q[0], q[1] ^ c[x]};
	}
	
	vector<pair<int&, int> > rb;
	
	bool join(int a,int b){
		ar<int, 2> pa = find(a);
		ar<int, 2> pb = find(b);
		a = pa[0];
		b = pb[0];
		int ca = pa[1];
		int cb = pb[1];
		
		rb.push_back({p[a], p[a]});
		rb.push_back({sz[a], sz[a]});
		rb.push_back({bi[a], bi[a]});
		rb.push_back({c[a], c[a]});
		
		rb.push_back({p[b], p[b]});
		rb.push_back({sz[b], sz[b]});
		rb.push_back({bi[b], bi[b]});
		rb.push_back({c[b], c[b]});
		
		if(a == b){
			if(ca == cb)bi[a] = 0;
			return 0;
		}
		
		if(sz[a] < sz[b])swap(a, b), swap(ca, cb);
		sz[a] += sz[b];
		p[b] = a;
		c[b] = cb ^ ca ^ 1;
		bi[a] &= bi[b];
		return 1;
	}
	inline bool bip(int x){
		return bi[find(x)[0]];
	}
	
	bool roll(){
		if(rb.empty())return 0;
		for(int i = 0;i < 8;i++){
			rb.back().first = rb.back().second;
			rb.pop_back();
		}
		return 1;
	}
};

vector<ar<int, 2> > que[M];

signed main(){ios_base::sync_with_stdio(false);cin.tie(0);
	int n, m, q;
	cin>>n>>m>>q;
	ar<int, 2> e[m];
	for(int i = 0;i < m;i++){
		int u, v;
		cin>>u>>v;
		--u, --v;
		e[i] = {u, v};
	}
	
	if(n <= 2000 && m <= 2000 && q <= 2000){
		while(q--){
			int l, r;
			cin>>l>>r;
			--l, --r;
			DSU d(n);
			bool ans = 1;
			for(int i = 0;i < m;i++){
				if(l <= i && i <= r)continue;
				d.join(e[i][0], e[i][1]);
				if(!d.bip(e[i][0])){
					ans = 0;
					break;
				}
			}
			cout<< (ans ? "NO\n" : "YES\n");
		}
		return 0;
	}
	for(int i = 0;i < q;i++){
		int l, r;
		cin>>l>>r;
		--l, --r;
		que[l].push_back({r, i});
	}
	bitset<N> res;
	for(int l = 0;l < M;l++){
		if(que[l].empty())continue;
		sort(que[l].rbegin(), que[l].rend());
		
		DSU d(n);
		bool ans = 1;
		for(int i = 0;i < l;i++){
			d.join(e[i][0], e[i][1]);
			if(!d.bip(e[i][0]))ans = 0;
		}
		int p = 0;
		for(int i = m - 1;i >= 0 && ans;i--){
			while(p < que[l].size() && que[l][p][0] == i){
				res[que[l][p][1]] = ans;
				++p;
			}
			d.join(e[i][0], e[i][1]);
			if(!d.bip(e[i][0]))ans = 0;
		}
		
	}
	for(int i = 0;i < q;i++)cout<<(res[i] ? "NO\n" : "YES\n");
}

Compilation message (stderr)

Joker.cpp: In function 'int main()':
Joker.cpp:138:12: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::array<long long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  138 |    while(p < que[l].size() && que[l][p][0] == i){
      |          ~~^~~~~~~~~~~~~~~
#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...