Submission #75793

#TimeUsernameProblemLanguageResultExecution timeMemory
75793tmwilliamlin168Werewolf (IOI18_werewolf)C++14
100 / 100
772 ms65844 KiB
#include "werewolf.h"
#include <bits/stdc++.h>
using namespace std;

const int mxN=2e5;
int n, q, p[mxN], st[2][mxN], en[2][mxN], dt, anc[2][mxN], r[mxN], ta[mxN], ft[mxN+1];
vector<int> adj1[mxN], adj2[mxN];
vector<array<int, 2>> b[mxN+1];
bool d[mxN];

int find(int x) {
	return x==r[x]?x:(r[x]=find(r[x]));
}

void dfs(int u, int st[mxN], int en[mxN]) {
	st[u]=dt++;
	for(int v : adj2[u])
		dfs(v, st, en);
	en[u]=dt;
}

void a(int st[mxN], int en[mxN], int anc[mxN]) {
	for(int i=0; i<n; ++i)
		r[i]=i;
	for(int i=0; i<n; ++i) {
		for(int j : adj1[p[i]]) {
			if(!d[j]||(j=find(j))==p[i])
				continue;
			r[j]=p[i];
			adj2[p[i]].push_back(j);
		}
		for(array<int, 2> c : b[p[i]])
			anc[c[1]]=find(c[0]);
		b[p[i]].clear();
		d[p[i]]=1;
	}
	dfs(p[n-1], st, en);
}

int qry(int i) {
	int r=0;
	for(; i; i-=i&-i)
		r+=ft[i];
	return r;
}

vector<int> check_validity(int n2, vector<int> x, vector<int> y, vector<int> s, vector<int> e, vector<int> l, vector<int> r) {
	n=n2;
	for(int i=0; i<x.size(); ++i) {
		adj1[x[i]].push_back(y[i]);
		adj1[y[i]].push_back(x[i]);
	}
	q=s.size();
	for(int i=0; i<n; ++i)
		p[i]=n-1-i;
	for(int i=0; i<q; ++i)
		b[l[i]].push_back({s[i], i});
	a(st[0], en[0], anc[0]);
	for(int i=0; i<n; ++i) {
		adj2[i].clear();
		p[i]=i;
	}
	memset(d, 0, n);
	dt=0;
	for(int i=0; i<q; ++i)
		b[r[i]].push_back({e[i], i});
	a(st[1], en[1], anc[1]);
	for(int i=0; i<n; ++i)
		ta[st[0][i]]=st[1][i];
	for(int i=0; i<q; ++i) {
		b[st[0][anc[0][i]]].push_back({i, -1});
		b[en[0][anc[0][i]]].push_back({i, 1});
	}
	vector<int> ans=vector<int>(q);
	for(int i=0; i<n; ++i) {
		for(int j=ta[i]+1; j<=n; j+=j&-j)
			++ft[j];
		for(array<int, 2> c : b[i+1])
			ans[c[0]]+=c[1]*(qry(en[1][anc[1][c[0]]])-qry(st[1][anc[1][c[0]]]));
	}
	for(int i=0; i<q; ++i)
		ans[i]=ans[i]>0;
	return ans;
}

Compilation message (stderr)

werewolf.cpp: In function 'std::vector<int> check_validity(int, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
werewolf.cpp:49:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<x.size(); ++i) {
               ~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...