답안 #694132

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
694132 2023-02-03T22:11:12 Z amirhoseinfar1385 늑대인간 (IOI18_werewolf) C++17
100 / 100
1143 ms 133012 KB
#include<bits/stdc++.h>
#include "werewolf.h"
using namespace std;
const int maxn=200000+5;
vector<int>adj[maxn];
struct dsu{
	int par[maxn],sz[maxn],lca[maxn][20],fpar[maxn];
	vector<int>child[maxn];
	pair<int,int>stf[maxn];
	int timea;
	dsu(){
	    for(int i=0;i<maxn;i++){
	        for(int j=0;j<20;j++){
	            lca[i][j]=-1;
	        }
	    }
		timea=0;
		for(int i=0;i<maxn;i++){
			par[i]=i;
			fpar[i]=i;
		}
	}
	int root(int c){
		if(fpar[c]==c){
			return c;
		}
		return fpar[c]=root(fpar[c]);
	}
	void con(int u,int v,int vv){
		int rootu=root(u),rootv=root(v);
		if(rootu!=rootv){
		    if(vv==0){
		        if(rootu<rootv){
		            swap(rootu,rootv);
		        }
		    }
		    else{  
		        if(rootu>rootv){
		            swap(rootu,rootv);
		        }
		    }
			par[rootv]=rootu;
			child[rootu].push_back(rootv);
			fpar[rootv]=rootu;
		}
	}
	void dfs(int u){
		timea++;
		stf[u].first=timea;
		for(auto x:child[u]){
		    lca[x][0]=u;
//		    cout<<u<<" "<<x<<" "<<timea<<endl;
			dfs(x);
		}
		stf[u].second=timea;
	}
	void build(){
		int rishe=root(1);
		dfs(rishe);
		for(int i=1;i<20;i++){
		    for(int j=0;j<maxn;j++){
		        if(lca[j][i-1]==-1){
		            continue;
		        }
		        lca[j][i]=lca[lca[j][i-1]][i-1];
		    }
		}
	}
	int ww(int u,int had,int vv){
		for(int i=19;i>=0;i--){
		    if(lca[u][i]!=-1){
//		        cout<<u<<" "<<vv<<" "<<lca[u][i]<<endl;
		        if(vv==0){
		            if(lca[u][i]<=had){
		                u=lca[u][i];
		            }
		        }
		        else{
		            if(lca[u][i]>=had){
		                u=lca[u][i];
		            }
		        }
		    }
		}
		return u;
	}
};
int kaf=(1<<18);
struct segment{
	struct node{
		vector<int>all;
	};
	node seg[(1<<19)];
	vector<int>merge(vector<int>a,vector<int>b){
		vector<int>ret;
		int i=0,j=0;
		while(i<(int)a.size()&&j<(int)b.size()){
			if(a[i]<b[j]){
				ret.push_back(a[i]);
				i++;
			}
			else{
				ret.push_back(b[j]);
				j++;
			}
		}
		while(i<(int)a.size()){
			ret.push_back(a[i]);
			i++;
		}
		while(j<(int)b.size()){
			ret.push_back(b[j]);
			j++;
		}
		return ret;
	}
	void build(int i){
		if((i<<1)>=(1<<19)){
			return ;
		}
		build((i<<1));
		build((i<<1)^1);
		seg[i].all=merge(seg[(i<<1)].all,seg[(i<<1)^1].all);	
	}
	int pors(int i,int l,int r,int tl,int tr,int hl,int hr){
		if(l>tr||r<tl){
			return 0;
		}
		if(l>=tl&&r<=tr){
			int p=lower_bound(seg[i].all.begin(),seg[i].all.end(),hl)-seg[i].all.begin();
	//		cout<<l<<" dsa "<<r<<" "<<tl<<" "<<tr<<" "<<hl<<" "<<hr<<endl;
	//		for(auto x:seg[i].all){
	//		    cout<<x<<" ";
	//		}
	//		cout<<"by"<<endl;
			if(p==(int)seg[i].all.size()){
				return 0;
			}
			if(seg[i].all[p]<=hr){
				return 1;
			}
			return 0;
		}
		int m=(l+r)>>1;
		int d=pors((i<<1),l,m,tl,tr,hl,hr);
		d|=pors((i<<1)^1,m+1,r,tl,tr,hl,hr);
		return d;
	}
};
dsu a,b;
segment seg;

vector<int> check_validity(int n, vector<int> x, vector<int> y, vector<int> s, vector<int> e, vector<int> l, vector<int> r){
	int m=x.size();
	for(int i=0;i<m;i++){
		adj[x[i]].push_back(y[i]);
		adj[y[i]].push_back(x[i]);
	}
	for(int i=0;i<=n-1;i++){
		for(auto x:adj[i]){
			if(x<=i){
				a.con(x,i,0);
			}
		}
	}
	for(int i=n-1;i>=0;i--){
		for(auto x:adj[i]){
			if(x>=i){
				b.con(x,i,1);
			}
		}
	}
	a.build();
	b.build();
	for(int i=0;i<n;i++){
		seg.seg[kaf+a.stf[i].first].all.push_back(b.stf[i].first);
	//	cout<<i<<" asd "<<a.stf[i].first<<" "<<b.stf[i].first<<endl;
	}
	seg.build(1);
	int q=s.size();
	vector<int>res(q);
	for(int i=0;i<q;i++){
		int u=s[i],v=e[i],tl=l[i],tr=r[i];
		if(u<tl||v>tr){
			res[i]=0;
			continue;
		}
		int bu=b.ww(u,tl,1),bv=a.ww(v,tr,0);
		int d=seg.pors(1,0,kaf-1,a.stf[bv].first,a.stf[bv].second,b.stf[bu].first,b.stf[bu].second);
		res[i]=d;
//		cout<<bu<<" "<<bv<<" "<<u<<" "<<v<<" "<<tl<<" "<<tr<<endl;
	}
	return res;	
}
# 결과 실행 시간 메모리 Grader output
1 Correct 69 ms 64284 KB Output is correct
2 Correct 67 ms 64272 KB Output is correct
3 Correct 57 ms 64212 KB Output is correct
4 Correct 59 ms 64208 KB Output is correct
5 Correct 64 ms 64304 KB Output is correct
6 Correct 64 ms 64356 KB Output is correct
7 Correct 61 ms 64284 KB Output is correct
8 Correct 57 ms 64296 KB Output is correct
9 Correct 58 ms 64288 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 69 ms 64284 KB Output is correct
2 Correct 67 ms 64272 KB Output is correct
3 Correct 57 ms 64212 KB Output is correct
4 Correct 59 ms 64208 KB Output is correct
5 Correct 64 ms 64304 KB Output is correct
6 Correct 64 ms 64356 KB Output is correct
7 Correct 61 ms 64284 KB Output is correct
8 Correct 57 ms 64296 KB Output is correct
9 Correct 58 ms 64288 KB Output is correct
10 Correct 67 ms 65188 KB Output is correct
11 Correct 70 ms 65136 KB Output is correct
12 Correct 65 ms 65112 KB Output is correct
13 Correct 74 ms 65240 KB Output is correct
14 Correct 68 ms 65288 KB Output is correct
15 Correct 74 ms 65252 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 677 ms 122992 KB Output is correct
2 Correct 888 ms 124908 KB Output is correct
3 Correct 855 ms 123364 KB Output is correct
4 Correct 765 ms 122836 KB Output is correct
5 Correct 730 ms 122808 KB Output is correct
6 Correct 699 ms 122680 KB Output is correct
7 Correct 607 ms 122572 KB Output is correct
8 Correct 859 ms 124984 KB Output is correct
9 Correct 704 ms 123448 KB Output is correct
10 Correct 505 ms 122772 KB Output is correct
11 Correct 534 ms 122812 KB Output is correct
12 Correct 613 ms 122760 KB Output is correct
13 Correct 859 ms 129896 KB Output is correct
14 Correct 875 ms 129964 KB Output is correct
15 Correct 857 ms 130024 KB Output is correct
16 Correct 887 ms 129892 KB Output is correct
17 Correct 646 ms 122664 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 69 ms 64284 KB Output is correct
2 Correct 67 ms 64272 KB Output is correct
3 Correct 57 ms 64212 KB Output is correct
4 Correct 59 ms 64208 KB Output is correct
5 Correct 64 ms 64304 KB Output is correct
6 Correct 64 ms 64356 KB Output is correct
7 Correct 61 ms 64284 KB Output is correct
8 Correct 57 ms 64296 KB Output is correct
9 Correct 58 ms 64288 KB Output is correct
10 Correct 67 ms 65188 KB Output is correct
11 Correct 70 ms 65136 KB Output is correct
12 Correct 65 ms 65112 KB Output is correct
13 Correct 74 ms 65240 KB Output is correct
14 Correct 68 ms 65288 KB Output is correct
15 Correct 74 ms 65252 KB Output is correct
16 Correct 677 ms 122992 KB Output is correct
17 Correct 888 ms 124908 KB Output is correct
18 Correct 855 ms 123364 KB Output is correct
19 Correct 765 ms 122836 KB Output is correct
20 Correct 730 ms 122808 KB Output is correct
21 Correct 699 ms 122680 KB Output is correct
22 Correct 607 ms 122572 KB Output is correct
23 Correct 859 ms 124984 KB Output is correct
24 Correct 704 ms 123448 KB Output is correct
25 Correct 505 ms 122772 KB Output is correct
26 Correct 534 ms 122812 KB Output is correct
27 Correct 613 ms 122760 KB Output is correct
28 Correct 859 ms 129896 KB Output is correct
29 Correct 875 ms 129964 KB Output is correct
30 Correct 857 ms 130024 KB Output is correct
31 Correct 887 ms 129892 KB Output is correct
32 Correct 646 ms 122664 KB Output is correct
33 Correct 927 ms 122872 KB Output is correct
34 Correct 386 ms 95644 KB Output is correct
35 Correct 1063 ms 125056 KB Output is correct
36 Correct 787 ms 123272 KB Output is correct
37 Correct 1016 ms 124344 KB Output is correct
38 Correct 863 ms 123812 KB Output is correct
39 Correct 972 ms 130252 KB Output is correct
40 Correct 900 ms 133012 KB Output is correct
41 Correct 793 ms 123728 KB Output is correct
42 Correct 519 ms 123148 KB Output is correct
43 Correct 1143 ms 129732 KB Output is correct
44 Correct 973 ms 124300 KB Output is correct
45 Correct 822 ms 130704 KB Output is correct
46 Correct 844 ms 130408 KB Output is correct
47 Correct 849 ms 130064 KB Output is correct
48 Correct 849 ms 130036 KB Output is correct
49 Correct 867 ms 130132 KB Output is correct
50 Correct 844 ms 130060 KB Output is correct
51 Correct 735 ms 132660 KB Output is correct
52 Correct 763 ms 132812 KB Output is correct