답안 #543006

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
543006 2022-03-28T19:52:09 Z codr0 Long Mansion (JOI17_long_mansion) C++14
25 / 100
3000 ms 50784 KB
// Code by Parsa Eslami
 
#include <bits/stdc++.h>
#define pii pair<int,int>
#define bit(i,j) ((j>>i)&1)
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FORR(i,a,b) for(int i=a;i>=b;i--)
#define S second
#define F first
#define pb push_back
#define SZ(x) (int)x.size()
#define all(x) x.begin(),x.end()
#define err(x) cout<<#x<<": "<<x<<'\n';
 
using namespace std;
const int N=5e5+4;
vector<int> vc;
int X[N];
int n;
int L[N],R[N];
int l[N],r[N];
int pr[N],nxt[N];
int dsu[N];
int to[N];
 
	int parent(int v){
		if(dsu[v]<0) return v;
		return (dsu[v]=parent(dsu[v]));
	}

	void join(int a,int b){
		int u=a;
		int v=b;
		u=parent(u); v=parent(v);
		//if(u==v) return;
		if(dsu[u]<dsu[v]) swap(u,v);
		dsu[v]+=dsu[u]; dsu[u]=v;
		to[v]=b;
		pr[b]=pr[a];
	}

	void dol(){
		vector<int> vc0;
		for(int i:vc){
			int X=l[i];
			while(1){
				int Y=to[parent(l[i])];
				int z=pr[Y];
				if(z==0) break;
				if(R[z]&&R[z]<=to[parent(r[i])]){
					l[i]=l[z];
				}else break;
			}
			if(l[i]!=X) vc0.pb(i);
		}
		vc=vc0;
	}
 
	void dor(){
		vector<int> vc0;
		FORR(j,SZ(vc)-1,0){
			int i=vc[j];
			int X=r[i];
			while(1){	
				int Y=to[parent(r[i])];
				int z=nxt[Y];
				if(z==n+1) break;
				if(L[z]&&L[z]>=to[parent(l[i])]){
					r[i]=r[z];
				}else break;
			}
			if(r[i]!=X) vc0.pb(i);
		}
		vc=vc0;
		reverse(all(vc));
	}
 
	void Main(){
		cin>>n;
		FOR(i,1,n) dsu[i]=-1,to[i]=i;
		FOR(i,1,n) nxt[i]=i+1,pr[i]=i-1;
		int C[n+1]={};
		FOR(i,1,n-1) cin>>C[i];
		vector<int> B[N];
		FOR(i,1,n){
			int sz; cin>>sz;
			FOR(j,1,sz){
				int x0; cin>>x0;
				B[i].pb(x0);
			}
		}
		FOR(i,1,n){
			if(i!=1&&X[C[i-1]]){
				L[i]=X[C[i-1]];
			}
			FOR(j,0,SZ(B[i])-1){
				X[B[i][j]]=i;
			}
		}
		FOR(i,1,n){
			FOR(j,0,SZ(B[i])-1){
				X[B[i][j]]=0;
			}
		}
		FORR(i,n,1){
			if(i!=n&&X[C[i]]){
				R[i]=X[C[i]];
			}
			FOR(j,0,SZ(B[i])-1){
				X[B[i][j]]=i;
			}	
		}
		FOR(i,1,n) l[i]=r[i]=i;
		FOR(i,1,n) vc.pb(i); dor();
		vc.clear();
		FOR(i,1,n) vc.pb(i); dol();
		while(!vc.empty()){
			bool is[N]={};
			for(int u0:vc) is[u0]=1;
			FOR(i,0,SZ(vc)-2){
				if(to[parent(r[vc[i]])]>=vc[i+1]&&to[parent(l[vc[i+1]])]<=vc[i]){
					is[vc[i]]=0;;
					join(vc[i],vc[i+1]);
				}
				i++;
			}
			vc.clear(); FOR(i,1,n) if(is[i]) vc.pb(i);
			dor();
			if(vc.empty()) break;
			dol();
		}
		int q; cin>>q;
		while(q--){
			int u,v;  cin>>u>>v;
			bool ans;
			if(u<v){
				ans=(r[to[parent(u)]]>=v);
			}else ans=(v>=l[to[parent(u)]]);
			cout<<(ans?"YES\n":"NO\n");
		}
	}
 
	int32_t main(){
	ios_base::sync_with_stdio(0); cin.tie(0);
 
	int T=1;
	while(T--) Main();
 
	return 0;
	}

Compilation message

long_mansion.cpp: In function 'void Main()':
long_mansion.cpp:6:20: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
    6 | #define FOR(i,a,b) for(int i=a;i<=b;i++)
      |                    ^~~
long_mansion.cpp:114:3: note: in expansion of macro 'FOR'
  114 |   FOR(i,1,n) vc.pb(i); dor();
      |   ^~~
long_mansion.cpp:114:24: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  114 |   FOR(i,1,n) vc.pb(i); dor();
      |                        ^~~
long_mansion.cpp:6:20: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
    6 | #define FOR(i,a,b) for(int i=a;i<=b;i++)
      |                    ^~~
long_mansion.cpp:116:3: note: in expansion of macro 'FOR'
  116 |   FOR(i,1,n) vc.pb(i); dol();
      |   ^~~
long_mansion.cpp:116:24: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  116 |   FOR(i,1,n) vc.pb(i); dol();
      |                        ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 12756 KB Output is correct
2 Correct 9 ms 12756 KB Output is correct
3 Correct 10 ms 13012 KB Output is correct
4 Correct 10 ms 12756 KB Output is correct
5 Correct 9 ms 12756 KB Output is correct
6 Correct 10 ms 12756 KB Output is correct
7 Correct 22 ms 12780 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 12756 KB Output is correct
2 Correct 9 ms 12756 KB Output is correct
3 Correct 10 ms 13012 KB Output is correct
4 Correct 10 ms 12756 KB Output is correct
5 Correct 9 ms 12756 KB Output is correct
6 Correct 10 ms 12756 KB Output is correct
7 Correct 22 ms 12780 KB Output is correct
8 Correct 89 ms 14304 KB Output is correct
9 Correct 93 ms 14160 KB Output is correct
10 Correct 93 ms 14412 KB Output is correct
11 Correct 96 ms 14696 KB Output is correct
12 Correct 87 ms 14332 KB Output is correct
13 Correct 119 ms 14412 KB Output is correct
14 Correct 113 ms 14540 KB Output is correct
15 Correct 91 ms 14560 KB Output is correct
16 Correct 95 ms 14656 KB Output is correct
17 Correct 96 ms 14448 KB Output is correct
18 Correct 118 ms 14516 KB Output is correct
19 Correct 96 ms 14480 KB Output is correct
20 Correct 101 ms 14668 KB Output is correct
21 Correct 92 ms 14744 KB Output is correct
22 Correct 89 ms 14556 KB Output is correct
23 Correct 107 ms 14336 KB Output is correct
24 Correct 102 ms 14300 KB Output is correct
25 Correct 114 ms 14304 KB Output is correct
26 Correct 102 ms 14192 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 177 ms 22192 KB Output is correct
2 Correct 167 ms 22068 KB Output is correct
3 Correct 196 ms 22088 KB Output is correct
4 Correct 162 ms 22212 KB Output is correct
5 Correct 170 ms 21972 KB Output is correct
6 Correct 144 ms 21676 KB Output is correct
7 Correct 169 ms 21804 KB Output is correct
8 Correct 148 ms 21772 KB Output is correct
9 Correct 139 ms 21720 KB Output is correct
10 Correct 166 ms 21780 KB Output is correct
11 Correct 178 ms 21772 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 12756 KB Output is correct
2 Correct 9 ms 12756 KB Output is correct
3 Correct 10 ms 13012 KB Output is correct
4 Correct 10 ms 12756 KB Output is correct
5 Correct 9 ms 12756 KB Output is correct
6 Correct 10 ms 12756 KB Output is correct
7 Correct 22 ms 12780 KB Output is correct
8 Correct 89 ms 14304 KB Output is correct
9 Correct 93 ms 14160 KB Output is correct
10 Correct 93 ms 14412 KB Output is correct
11 Correct 96 ms 14696 KB Output is correct
12 Correct 87 ms 14332 KB Output is correct
13 Correct 119 ms 14412 KB Output is correct
14 Correct 113 ms 14540 KB Output is correct
15 Correct 91 ms 14560 KB Output is correct
16 Correct 95 ms 14656 KB Output is correct
17 Correct 96 ms 14448 KB Output is correct
18 Correct 118 ms 14516 KB Output is correct
19 Correct 96 ms 14480 KB Output is correct
20 Correct 101 ms 14668 KB Output is correct
21 Correct 92 ms 14744 KB Output is correct
22 Correct 89 ms 14556 KB Output is correct
23 Correct 107 ms 14336 KB Output is correct
24 Correct 102 ms 14300 KB Output is correct
25 Correct 114 ms 14304 KB Output is correct
26 Correct 102 ms 14192 KB Output is correct
27 Correct 177 ms 22192 KB Output is correct
28 Correct 167 ms 22068 KB Output is correct
29 Correct 196 ms 22088 KB Output is correct
30 Correct 162 ms 22212 KB Output is correct
31 Correct 170 ms 21972 KB Output is correct
32 Correct 144 ms 21676 KB Output is correct
33 Correct 169 ms 21804 KB Output is correct
34 Correct 148 ms 21772 KB Output is correct
35 Correct 139 ms 21720 KB Output is correct
36 Correct 166 ms 21780 KB Output is correct
37 Correct 178 ms 21772 KB Output is correct
38 Correct 281 ms 42604 KB Output is correct
39 Correct 263 ms 49416 KB Output is correct
40 Correct 264 ms 35340 KB Output is correct
41 Correct 319 ms 50784 KB Output is correct
42 Correct 154 ms 21808 KB Output is correct
43 Correct 143 ms 21572 KB Output is correct
44 Correct 212 ms 28876 KB Output is correct
45 Correct 195 ms 29052 KB Output is correct
46 Correct 261 ms 29236 KB Output is correct
47 Correct 141 ms 21804 KB Output is correct
48 Correct 144 ms 21692 KB Output is correct
49 Correct 202 ms 28700 KB Output is correct
50 Correct 201 ms 28852 KB Output is correct
51 Correct 228 ms 29368 KB Output is correct
52 Execution timed out 3076 ms 26984 KB Time limit exceeded
53 Halted 0 ms 0 KB -