Submission #907392

#TimeUsernameProblemLanguageResultExecution timeMemory
907392sunwukong123Joker (BOI20_joker)C++14
25 / 100
215 ms30976 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long 
#ifdef LOCAL
void debug_out() {cerr<<endl;}
template <typename Head, typename... Tail>
void debug_out(Head _H, Tail... _T) {cerr<<" "<<to_string(_H);debug_out(_T...);}
#define debug(...) cerr<<"["<<#__VA_ARGS__<<"]:",debug_out(__VA_ARGS__)
#else
#define debug(...)
#endif
const int MAXN = 200005;
const int inf=1000000500ll;
const long long oo =1000000000000000500ll;
const int MOD = (int)1e9 + 7;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef pair<int,int> pi; 
int n,m,q;
pi E[MAXN];
int ans[MAXN];//suppose [1,i] is blocked, what is the minimum r such that the answer is yes?
struct ufds_{
	vector<array<int,4>> rb;
	pi par[MAXN];
	int sz[MAXN];
	ufds_(){
		fill(sz,sz+MAXN,1);
		for(int i=0;i<MAXN;i++){
			par[i]=pi(i,0);
		}
	}
	pi find(int x){ // NO PATH COMPRESSION IN ROLLBACKS!!!
		int OFF=0;
		while(par[x].first != x){
			OFF^=par[x].second;
			x=par[x].first;
		}
		return make_pair(x,OFF);
	}
	int merge(int x, int y){
		pi px=find(x);
		pi py=find(y);
		if(px.first == py.first){//same component
			if((px.second ^ py.second)== 0){ // not bipartite!
				return 1;
			} else{
				return 0;
			}
		}
		if(sz[px.first]<sz[py.first]){ // sz[x]>=sz[y]
			swap(px,py);
			swap(x,y);
		}
		rb.push_back({px.first,par[px.first].first,par[px.first].second,sz[px.first]});
		sz[px.first] += sz[py.first];
		rb.push_back({py.first,par[py.first].first,par[py.first].second,sz[py.first]});
		par[py.first].first = px.first;
		par[py.first].second = 1^px.second^py.second;
		return 0;
	}
	void rollback(int ss){
		while(rb.size() > ss){
			array<int,4>cur=rb.back();
			par[cur[0]].first=cur[1];
			par[cur[0]].second=cur[2];
			sz[cur[0]]=cur[3];
			rb.pop_back();
		}
	}
}ufds;
void dnc(int s, int e, int optl, int optr){
	if(s>e)return;
	int mi=(s+e)/2;
	debug(s,e,optl,optr);
	// block all of [s,mi-1]
	int sz1=ufds.rb.size();
	bool done=0;
	for(int i=s;i<=mi-1;i++){
		int res=ufds.merge(E[i].first,E[i].second);
		if(res){
			done=1;
		}
	}
	if(done){
		for(int i=mi;i<=e;i++){
			ans[i]=m+1;
		}
		ufds.rollback(sz1);
		for(int i=optr;i>=optl;i--){
			ufds.merge(E[i].first,E[i].second);
		}
		dnc(s,mi-1,optl,optr);
		ufds.rollback(sz1);
		return;
	}
	int sz2=ufds.rb.size();
	for(int i=min(optr,m);i>=optl;i--){
		int res=ufds.merge(E[i].first,E[i].second);
		if(res){
			ans[mi]=i;
			break;
		}
	}
	ufds.rollback(sz2);
	dnc(mi+1,e,ans[mi],optr);
	ufds.rollback(sz1);
	for(int i=optr;i>=optl;i--){
		ufds.merge(E[i].first,E[i].second);
	}
	dnc(s,mi-1,optl,ans[mi]);
	ufds.rollback(sz1);
}

int32_t main() 
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	cin >> n >> m >> q;

	for(int i=1;i<=m;i++){
		cin >> E[i].first >> E[i].second;
	}
	dnc(1,m,1,m+1); 
	for(int i=1;i<=m;i++){
		debug(i,ans[i]);
	}
	while(q--){
		int l,r;cin>>l>>r;
		if(r+1<=ans[l]){
			cout<<"YES\n";
		} else{
			cout<<"NO\n";
		}
	}
}	

Compilation message (stderr)

Joker.cpp: In member function 'void ufds_::rollback(long long int)':
Joker.cpp:61:19: warning: comparison of integer expressions of different signedness: 'std::vector<std::array<long long int, 4> >::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
   61 |   while(rb.size() > ss){
      |         ~~~~~~~~~~^~~~
#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...