Submission #119672

#TimeUsernameProblemLanguageResultExecution timeMemory
119672imyujinWerewolf (IOI18_werewolf)C++14
100 / 100
1596 ms142468 KiB
#include "werewolf.h"
#include<vector>
#include<algorithm>

using namespace std;

#define MAXN 200005
#define fi first
#define se second

typedef pair<int, int> pi;

struct tree{
	int c[2*MAXN], par[20][2*MAXN], ro[2*MAXN], mn[2*MAXN], mx[2*MAXN];
	vector<int> chi[2*MAXN];
	int s[MAXN], sn;
	int tn;
}tr[2];

int N, M;
vector<pi> e;
int seg[MAXN*4], G[MAXN][2];

bool cmp(pi a, pi b){
	return max(a.fi, a.se)<max(b.fi, b.se);
}

int getro(tree* T, int x){
	if(T->ro[x]==x) return x;
	return T->ro[x]=getro(T, T->ro[x]);
}

void dfs(tree* T, int x){
	if(x<N){
		T->mn[x]=T->mx[x]=T->sn;
		T->s[T->sn++]=x;
	}
	else{
		T->mn[x]=N;
		T->mx[x]=0;
		for(auto a:T->chi[x]){
			dfs(T, a);
			T->mn[x]=min(T->mn[x], T->mn[a]);
			T->mx[x]=max(T->mx[x], T->mx[a]);
		}
	}
}

void mktr(tree* T){
	for(int i=0; i<N; i++) T->c[i]=T->ro[i]=T->mn[i]=T->mx[i]=i;
	sort(e.begin(), e.end(), cmp);
	T->tn=N;
	for(auto a:e){
		int r1=getro(T, a.fi), r2=getro(T, a.se);
		if(r1!=r2){
			T->par[0][r1]=T->par[0][r2]=T->par[0][T->tn]=T->ro[r1]=T->ro[r2]=T->ro[T->tn]=T->tn;
			T->chi[T->tn].push_back(r1);
			T->chi[T->tn].push_back(r2);
			T->c[T->tn]=max(a.fi, a.se);
			T->tn++;
		}
	}
	for(int i=1; i<20; i++) for(int j=0; j<T->tn; j++) T->par[i][j]=T->par[i-1][T->par[i-1][j]];
	T->sn=0;
	dfs(T, T->tn-1);
}

int goup(tree* T, int x, int l){
	for(int i=19; i>=0; i--) if(T->c[T->par[i][x]]<=l) x=T->par[i][x];
	return x;
}

void updseg(int idx, int l, int r, int x){
	seg[idx]++;
	if(l<r){
		int m=l+r>>1;
		if(x<=m) updseg(idx*2, l, m, x);
		else updseg(idx*2+1, m+1, r, x);
	}
}

int gseg(int idx, int l, int r, int x, int y){
	if(x<=l&&r<=y) return seg[idx];
	if(r<x||y<l) return 0;
	int m=l+r>>1;
	return gseg(idx*2, l, m, x, y)+gseg(idx*2+1, m+1, r, x, y);
}

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 Q=S.size();
	vector<int> ans(Q);
	vector<int> B[MAXN];

	N=n;
	M=X.size();

	for(int i=0; i<M; i++) e.push_back(make_pair(N-X[i]-1, N-Y[i]-1));
	mktr(&tr[0]);
	for(int i=0; i<M; i++) e[i]=make_pair(X[i], Y[i]);
	mktr(&tr[1]);

	for(int i=0; i<Q; i++) G[i][0]=goup(&tr[0], N-S[i]-1, N-L[i]-1);
	for(int i=0; i<Q; i++) G[i][1]=goup(&tr[1], E[i], R[i]);

	for(int i=0; i<Q; i++){
		if(tr[0].mn[G[i][0]]>0) B[tr[0].mn[G[i][0]]-1].push_back(i);
		B[tr[0].mx[G[i][0]]].push_back(i);
	}

	for(int i=0; i<N; i++){
		updseg(1, 0, N-1, tr[1].mx[N-tr[0].s[i]-1]);
		for(auto a:B[i])
			ans[a]+=(tr[0].mx[G[a][0]]==i?1:-1)*gseg(1, 0, N-1, tr[1].mn[G[a][1]], tr[1].mx[G[a][1]]);
	}
	for(int i=0; i<Q; i++) ans[i]=min(ans[i], 1);

	return ans;
}

Compilation message (stderr)

werewolf.cpp: In function 'void updseg(int, int, int, int)':
werewolf.cpp:76:10: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   int m=l+r>>1;
         ~^~
werewolf.cpp: In function 'int gseg(int, int, int, int, int)':
werewolf.cpp:85:9: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  int m=l+r>>1;
        ~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...