Submission #1368001

#TimeUsernameProblemLanguageResultExecution timeMemory
1368001DangerNoodle7591늑대인간 (IOI18_werewolf)C++20
0 / 100
1154 ms90240 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define NN 200005

int mn_seg[NN*4],mx_seg[NN*4];

void mn_up(int x,int l,int r,int hed,int val){
	if(l>r||hed<l||r<hed)return;
	if(l==r){
		mn_seg[x]=val;
		return;
	}
	int mid=(l+r)/2;
	if(hed<=mid)mn_up(x*2,l,mid,hed,val);
	else mn_up(x*2+1,mid+1,r,hed,val);
	mn_seg[x]=min(mn_seg[x*2],mn_seg[x*2+1]);
}
void mx_up(int x,int l,int r,int hed,int val){
	if(l>r||hed<l||r<hed)return;
	if(l==r){
		mx_seg[x]=val;
		return;
	}
	int mid=(l+r)/2;
	if(hed<=mid)mx_up(x*2,l,mid,hed,val);
	else mx_up(x*2+1,mid+1,r,hed,val);
	mx_seg[x]=max(mx_seg[x*2],mx_seg[x*2+1]);
}

int mn_qua(int x,int l,int r,int s,int e){
	if(l>r||e<l||r<s)return NN*100;
	if(s<=l&&r<=e)return mn_seg[x];
	int mid=(l+r)/2;
	return min(mn_qua(x*2,l,mid,s,e),mn_qua(x*2+1,mid+1,r,s,e));
}
int mx_qua(int x,int l,int r,int s,int e){
	if(l>r||e<l||r<s)return -1;
	if(s<=l&&r<=e)return mx_seg[x];
	int mid=(l+r)/2;
	return max(mx_qua(x*2,l,mid,s,e),mx_qua(x*2+1,mid+1,r,s,e));
}


int arr[NN],ters[NN];
int sayac=0;
vector<int> adj[NN];
void dfs(int x,int once){
	sayac++;
	arr[sayac]=x;
	ters[x]=sayac;
	for(auto u:adj[x]){
		if(u!=once)dfs(u,x);
	}
}

vector<int> check_validity(int N, vector<int> X, vector<int> Y, vector<int> S, vector<int> E,vector<int> L, vector<int> R) {

  	for(int i=0;i<X.size();i++){
		adj[X[i]].pb(Y[i]);
		adj[Y[i]].pb(X[i]);
  	}

	for(int i=0;i<N;i++){
		if(adj[i].size()==1){
			dfs(i,-1);
			break;
		}
	}
	for(int i=0;i<N;i++){
		int yer=ters[i];
		mn_up(1,1,N,yer,i);
		mx_up(1,1,N,yer,i);
	}
  	vector<int> ans;

  	for(int q=0;q<S.size();q++){
		int s=ters[S[q]],e=ters[E[q]],l=L[q],r=R[q];
		if(S[q]<l){ans.pb(0);continue;}
		if(E[q]>r){ans.pb(0);continue;}
		if(s<=e){
			int l=s,r=e,son_insan=s;//insan olmamın zounrlu olduğu yer
			while(l<=r){
				int mid=(l+r)/2;
				int x=mn_qua(1,1,N,s,mid);
				if(x>r){
					son_insan=mid;
					l=mid+1;
				}
				else r=mid-1;
			}
			l=s,r=e;
			int ilk_kopek=r;
			while(l<=r){
				int mid=(l+r)/2;
				int x=mx_qua(1,1,N,s,mid);
				if(x<l){
					ilk_kopek=mid;
					r=mid-1;
				}
				else l=mid+1;
			}
			if(ilk_kopek<son_insan){
				ans.pb(0);
				continue;
			}
            //cout<<"a"<<endl;
			ans.pb(1);
		}
		else{
			int l=e,r=s,son_insan=e;//insan olmamın zounrlu olduğu yer
			while(l<=r){
				int mid=(l+r)/2;
				int x=mn_qua(1,1,N,mid,s);
				if(x>r){
					son_insan=mid;
					r=mid-1;
				}
				else l=mid+1;
			}
			l=e,r=s;
			int ilk_kopek=s;
			while(l<r){
				int mid=(l+r)/2;
				int x=mx_qua(1,1,N,mid,s);
				if(x<l){
					ilk_kopek=mid;
					l=mid+1;
				}
				else r=mid-1;
			}
			if(ilk_kopek>son_insan){
				ans.pb(0);
				continue;
			}
            //cout<<"b"<<endl;
			ans.pb(1);
		}
	
  	}

  return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...