Submission #991608

# Submission time Handle Problem Language Result Execution time Memory
991608 2024-06-02T15:58:57 Z Lalic Werewolf (IOI18_werewolf) C++17
49 / 100
425 ms 69924 KB
#include "werewolf.h"
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second
#define pb push_back
#define all(x) x.begin(), x.end()
#define allr(x) x.rbegin(), x.rend()
#define mp make_pair

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int MAXN = 2e5+10;
const int INF = 0x3f3f3f3f;

int pai[2][MAXN], peso[2][MAXN];

int find(int tipo, int x){ return (pai[tipo][x]==x ? x : pai[tipo][x]=find(tipo, pai[tipo][x])); }
void join(int tipo, int a, int b){
	a=find(tipo, a);
	b=find(tipo, b);
	if(a==b) return;
	
	if(peso[tipo][a]>peso[tipo][b]) swap(a, b);
	pai[tipo][a]=b;
	peso[tipo][b]=max(peso[tipo][b], peso[tipo][a]+1);
}

int conv[MAXN], rev[MAXN];
vector<int> adj[MAXN];

void dfs(int ver, int val){
	conv[val]=ver;
	rev[ver]=val;
	for(auto u : adj[ver]){
		if(rev[u]!=-1) continue;
		dfs(u, val+1);
	}
}

int st[2][20][MAXN], lg[MAXN];

void build(int n){
	lg[0]=lg[1]=0;
	for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;
	
	for(int i=0;i<n;i++)
		st[0][0][i]=st[1][0][i]=conv[i];
	
	for(int i=1;i<=18;i++)
		for(int j=0;j<n;j++)
			st[0][i][j]=min(st[0][i-1][j], st[0][i-1][min(j+(1<<(i-1)), n)]);
	for(int i=1;i<=18;i++)
		for(int j=0;j<n;j++)
			st[1][i][j]=max(st[1][i-1][j], st[1][i-1][min(j+(1<<(i-1)), n)]);
}

int getMx(int l, int r){
	int curr=lg[r-l+1];
	return max(st[1][curr][l], st[1][curr][r-(1<<curr)+1]);
}

int getMn(int l, int r){
	int curr=lg[r-l+1];
	return min(st[0][curr][l], st[0][curr][r-(1<<curr)+1]);
}

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=(int)X.size(), q=(int)L.size();
	vector<int> ans(q);
	
	if(N<=3000 && m<=6000 && q<=3000){
		for(int i=0;i<q;i++){
			for(int j=0;j<N;j++){
				pai[0][j]=pai[1][j]=j;
				peso[0][j]=peso[1][j]=0;
			}
			
			for(int j=0;j<m;j++){
				if(max(X[j], Y[j])<=R[i]) join(1, X[j], Y[j]);
				if(min(X[j], Y[j])>=L[i]) join(0, X[j], Y[j]);
			}
			
			ans[i]=0;
			for(int j=0;j<N;j++){
				if(find(0, S[i])==find(0, j) && find(1, E[i])==find(1, j)){
					ans[i]=1;
					break;
				}
			}
		}
	}
	else{
		memset(rev, -1, sizeof rev);
		for(int i=0;i<m;i++){
			adj[X[i]].pb(Y[i]);
			adj[Y[i]].pb(X[i]);
		}
		
		for(int i=0;i<N;i++){
			if((int)adj[i].size()==1){
				dfs(i, 0);
				break;
			}
		}
		
		build(N);
		
		for(int i=0;i<q;i++){
			int ini=rev[S[i]], fim=rev[E[i]];
			
			if(ini==fim) ans[i]=1;
			else if(ini<fim){
				int lastH=-1;
				if(getMx(ini, fim)>R[i]){
					int low=ini, high=fim;
					while(low<=high){
						int mid=(low+high)>>1;
						if(getMx(mid, fim)>R[i]){
							lastH=mid;
							low=mid+1;
						}
						else high=mid-1;
					}
				}
				
				int lastW=INF;
				if(getMn(ini, fim)<L[i]){
					int low=ini, high=fim;
					while(low<=high){
						int mid=(low+high)>>1;
						if(getMn(ini, mid)<L[i]){
							lastW=mid;
							high=mid-1;
						}
						else low=mid+1;
					}
				}
				
				if(lastH>lastW || lastW==lastH+1) ans[i]=0;
				else ans[i]=1;
			}
			else{
				int lastH=INF;
				if(getMx(fim, ini)>R[i]){
					int low=fim, high=ini;
					while(low<=high){
						int mid=(low+high)>>1;
						if(getMx(fim, mid)>R[i]){
							lastH=mid;
							high=mid-1;
						}
						else low=mid+1;
					}
				}
				
				int lastW=-1;
				if(getMn(fim, ini)<L[i]){
					int low=fim, high=ini;
					while(low<=high){
						int mid=(low+high)>>1;
						if(getMn(mid, ini)<L[i]){
							lastW=mid;
							low=mid+1;
						}
						else high=mid-1;
					}
				}
				
				if(lastH<lastW || lastW==lastH-1) ans[i]=0;
				else ans[i]=1;
			}
		}
	}
	return ans;
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 10584 KB Output is correct
2 Correct 2 ms 10584 KB Output is correct
3 Correct 2 ms 10588 KB Output is correct
4 Correct 1 ms 10588 KB Output is correct
5 Correct 1 ms 10588 KB Output is correct
6 Correct 2 ms 10588 KB Output is correct
7 Correct 1 ms 10588 KB Output is correct
8 Correct 2 ms 10588 KB Output is correct
9 Correct 1 ms 10588 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 10584 KB Output is correct
2 Correct 2 ms 10584 KB Output is correct
3 Correct 2 ms 10588 KB Output is correct
4 Correct 1 ms 10588 KB Output is correct
5 Correct 1 ms 10588 KB Output is correct
6 Correct 2 ms 10588 KB Output is correct
7 Correct 1 ms 10588 KB Output is correct
8 Correct 2 ms 10588 KB Output is correct
9 Correct 1 ms 10588 KB Output is correct
10 Correct 298 ms 10844 KB Output is correct
11 Correct 259 ms 10840 KB Output is correct
12 Correct 314 ms 10840 KB Output is correct
13 Correct 272 ms 10848 KB Output is correct
14 Correct 222 ms 10844 KB Output is correct
15 Correct 425 ms 10872 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 261 ms 65620 KB Output is correct
2 Correct 192 ms 69644 KB Output is correct
3 Correct 195 ms 69712 KB Output is correct
4 Correct 238 ms 69712 KB Output is correct
5 Correct 210 ms 69624 KB Output is correct
6 Correct 221 ms 69712 KB Output is correct
7 Correct 252 ms 69896 KB Output is correct
8 Correct 175 ms 69600 KB Output is correct
9 Correct 167 ms 69652 KB Output is correct
10 Correct 167 ms 69672 KB Output is correct
11 Correct 170 ms 69712 KB Output is correct
12 Correct 179 ms 69924 KB Output is correct
13 Correct 231 ms 69716 KB Output is correct
14 Correct 220 ms 69648 KB Output is correct
15 Correct 214 ms 69716 KB Output is correct
16 Correct 217 ms 69712 KB Output is correct
17 Correct 271 ms 69668 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 10584 KB Output is correct
2 Correct 2 ms 10584 KB Output is correct
3 Correct 2 ms 10588 KB Output is correct
4 Correct 1 ms 10588 KB Output is correct
5 Correct 1 ms 10588 KB Output is correct
6 Correct 2 ms 10588 KB Output is correct
7 Correct 1 ms 10588 KB Output is correct
8 Correct 2 ms 10588 KB Output is correct
9 Correct 1 ms 10588 KB Output is correct
10 Correct 298 ms 10844 KB Output is correct
11 Correct 259 ms 10840 KB Output is correct
12 Correct 314 ms 10840 KB Output is correct
13 Correct 272 ms 10848 KB Output is correct
14 Correct 222 ms 10844 KB Output is correct
15 Correct 425 ms 10872 KB Output is correct
16 Correct 261 ms 65620 KB Output is correct
17 Correct 192 ms 69644 KB Output is correct
18 Correct 195 ms 69712 KB Output is correct
19 Correct 238 ms 69712 KB Output is correct
20 Correct 210 ms 69624 KB Output is correct
21 Correct 221 ms 69712 KB Output is correct
22 Correct 252 ms 69896 KB Output is correct
23 Correct 175 ms 69600 KB Output is correct
24 Correct 167 ms 69652 KB Output is correct
25 Correct 167 ms 69672 KB Output is correct
26 Correct 170 ms 69712 KB Output is correct
27 Correct 179 ms 69924 KB Output is correct
28 Correct 231 ms 69716 KB Output is correct
29 Correct 220 ms 69648 KB Output is correct
30 Correct 214 ms 69716 KB Output is correct
31 Correct 217 ms 69712 KB Output is correct
32 Correct 271 ms 69668 KB Output is correct
33 Incorrect 144 ms 60452 KB Output isn't correct
34 Halted 0 ms 0 KB -