답안 #1054260

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1054260 2024-08-12T08:12:15 Z allin27x Joker (BOI20_joker) C++17
0 / 100
1723 ms 20564 KB
#include <bits/stdc++.h>
using namespace std;
#define int long long 
const int mod = 1e9+7;
#define forn(i,n) for(int i=0; i<n; i++)
#define readv(a,n) vector<int>a(n);forn(i,n)cin>>a[i];
#define readvv(a,n,m) vector<vector<int>> a(n,vector<int>(m));forn(i,n)forn(j,m)cin>>a[i][j];
#define all(a) a.begin(), a.end()
#define _max(x,y) x = max(x,y)
#define _min(x,y) x = min(x,y)
// #define f first
// #define s second

const int N = 2e5+4;
const int SQRT = 460;
int ans[N];

struct qr{
	int l, r, i;
	bool operator<(qr b){
		return make_pair(l/SQRT, -r) < make_pair(b.l/SQRT,-b.r);
	}
};

vector<qr> queries[SQRT];
int edges[N][2];

struct DSU{
	vector<int> par;
	vector<int> size;
	stack<int> rb;
	int cmp;
	DSU(int n){
		par.resize(n); for(int i=0; i<n; ++i) par[i]=i;
		size.resize(n,1); cmp = n;
	}
	int get(int p){
		return par[p]==p? p: get(par[p]);
	}
	void unite(int a, int b){
		a = get(a); b = get(b);
		if (a==b){
			rb.push(-1);
			return;
		}
		cmp--;
		if (size[a] > size[b]) swap(a,b);
		rb.push(a);
		size[b]+=size[a];
		par[a] = b;
	}
	int conn(int a, int b){
		return get(a) == get(b);
	}
	void rollback(){
		int f = rb.top();
		rb.pop();
		if (f==-1) return;
		cmp++;
		size[par[f]] -= size[f];
		par[f] = f;
	}
};


void solve(){
	int n,m,q; cin>>n>>m>>q;
	for (int i=0; i<m; i++){
		int a,b; cin>>a>>b; a--;b--; edges[i][0]=a; edges[i][1] = b;
	}
	for (int i=0; i<q; i++){
		int l,r; cin>>l>>r; l--; r--;
		qr p; p.l=l;p.r=r;p.i=i;
		queries[i/SQRT].push_back(p);
	}
	for (int i=0; i<SQRT; i++) sort(queries[i].begin(), queries[i].end());
	DSU dsu(2*n);
	int fM =0; 
	for (int t=0; t<SQRT; t++){
		int fm = 0;
		int i = m-1; int j = queries[t].size()-1;
		while (i>=0){
			if (j<0){
				dsu.unite(edges[i][0] + n, edges[i][1]);
				dsu.unite(edges[i][0], edges[i][1] + n);
				i--;
				continue;
			}
			qr p = queries[t][j];
			while (p.r == i){
				if (j<0) break;
				int f = 0;
				for (int ll=t*SQRT; ll<=p.l; ll++){
					if (dsu.conn(edges[ll][0],edges[ll][1])) f++;
					dsu.unite(edges[ll][0]+n, edges[ll][1]);
					dsu.unite(edges[ll][0], edges[ll][1]+n);
				}
				for (int ll=t*SQRT; ll<=p.l; ll++){
					dsu.rollback(); dsu.rollback();
				}
				if (f || fm || fM) ans[p.i] = 1;
				j--;
				if (j<0) break;
				p = queries[t][j];
			}
			fm += dsu.conn(edges[i][0], edges[i][1]);
			dsu.unite(edges[i][0] + n, edges[i][1]);
			dsu.unite(edges[i][0], edges[i][1] + n);
			i--;
		}
		for (int ll=0; ll<2*m; ll++) dsu.rollback();
		for (int ll=SQRT*t; ll<min(m, SQRT*t + SQRT); ll++){
			fM += dsu.conn(edges[ll][0], edges[ll][1]);
			dsu.unite(edges[ll][0] + n, edges[ll][1]);
			dsu.unite(edges[ll][0], edges[ll][1] + n);
		}
	}
	for (int i=0;i<q; i++) cout<<(ans[i]?"YES\n":"NO\n");
}


signed main(){ 
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int t=1;
	while(t--){
		solve();
	}	
	return 0;
}

# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 2396 KB Output is correct
2 Correct 0 ms 2396 KB Output is correct
3 Correct 0 ms 2396 KB Output is correct
4 Incorrect 0 ms 2396 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 2396 KB Output is correct
2 Correct 0 ms 2396 KB Output is correct
3 Correct 0 ms 2396 KB Output is correct
4 Incorrect 0 ms 2396 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 2396 KB Output is correct
2 Correct 0 ms 2396 KB Output is correct
3 Incorrect 1723 ms 20564 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 2396 KB Output is correct
2 Correct 0 ms 2396 KB Output is correct
3 Correct 0 ms 2396 KB Output is correct
4 Incorrect 0 ms 2396 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 2396 KB Output is correct
2 Correct 0 ms 2396 KB Output is correct
3 Correct 0 ms 2396 KB Output is correct
4 Incorrect 0 ms 2396 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 2396 KB Output is correct
2 Correct 0 ms 2396 KB Output is correct
3 Correct 0 ms 2396 KB Output is correct
4 Incorrect 0 ms 2396 KB Output isn't correct
5 Halted 0 ms 0 KB -