답안 #157939

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
157939 2019-10-14T04:53:38 Z kig9981 늑대인간 (IOI18_werewolf) C++17
100 / 100
828 ms 65272 KB
#include "werewolf.h"
#include <bits/stdc++.h>

using namespace std;

vector<int> adj[200000], V[200000];
pair<int,int> x[200000], y[200000];
int numx[200000], num_rev[200000], numy[200000], color[200000], tree[200001];

int find_(int a)
{
	return color[a]=a==color[a] ? a:find_(color[a]);
}

void union_(int a, int b)
{
	a=find_(a); b=find_(b);
	if(V[a].size()<V[b].size()) swap(a,b);
	color[b]=a;
	for(auto v: V[b]) V[a].push_back(v);
	V[b].clear();
}

void update(int n, int v)
{
	for(++n;n<=200000;n+=n&-n) tree[n]+=v;
}

int get_cnt(int n)
{
	int ret=0;
	for(++n;n;n-=n&-n) ret+=tree[n];
	return ret;
}

int get_cnt(pair<int,int> S)
{
	return get_cnt(S.second)-get_cnt(S.first-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=X.size(), Q=S.size(), j=N-1, k;
	vector<tuple<int,int,int>> temp(Q);
	vector<int> ret(Q);
	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<Q;i++) temp[i]=make_tuple(L[i],S[i],i);
	sort(temp.rbegin(),temp.rend());
	for(int i=0;i<N;i++) {
		V[i].resize(1);
		color[V[i][0]=i]=i;
	}
	for(int i=0;i<Q;i++) {
		int l, s, idx;
		tie(l,s,idx)=temp[i];
		for(;j>=l;j--) for(auto n: adj[j]) if(n>j && find_(j)!=find_(n)) union_(j,n);
		s=find_(s);
		x[idx]={V[s].front(),V[s].back()};
	}
	for(;j>=0;j--) for(auto n: adj[j]) if(n>j && find_(j)!=find_(n)) union_(j,n);
	j=find_(0);
	for(int i=0;i<N;i++) numx[num_rev[i]=V[j][i]]=i;
	for(int i=0;i<Q;i++) temp[i]=make_tuple(R[i],E[i],i);
	sort(temp.begin(),temp.end());
	for(int i=0;i<N;i++) {
		V[i].resize(1);
		color[V[i][0]=i]=i;
	}
	for(int i=j=0;i<Q;i++) {
		int r, e, idx;
		tie(r,e,idx)=temp[i];
		for(;j<=r;j++) for(auto n: adj[j]) if(n<j && find_(j)!=find_(n)) union_(j,n);
		e=find_(e);
		y[idx]={V[e].front(),V[e].back()};
	}
	for(;j<N;j++) for(auto n: adj[j]) if(n<j && find_(j)!=find_(n)) union_(j,n);
	j=find_(0);
	for(int i=0;i<N;i++) numy[V[j][i]]=i;
	for(int i=0;i<Q;i++) {
		L[i]=R[i]=i;
		x[i].first=numx[x[i].first];
		x[i].second=numx[x[i].second];
		y[i].first=numy[y[i].first];
		y[i].second=numy[y[i].second];
	}
	sort(L.begin(),L.end(),[&](int a, int b) {return x[a].first<x[b].first;});
	sort(R.begin(),R.end(),[&](int a, int b) {return x[a].second<x[b].second;});
	for(int i=j=k=0;i<N;i++) {
		for(;j<Q && x[L[j]].first==i;j++) ret[L[j]]-=get_cnt(y[L[j]]);
		update(numy[num_rev[i]],1);
		for(;k<Q && x[R[k]].second==i;k++) ret[R[k]]+=get_cnt(y[R[k]]);
	}
	for(int i=0;i<Q;i++) ret[i]=ret[i]>0;
	return ret;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 9848 KB Output is correct
2 Correct 11 ms 9764 KB Output is correct
3 Correct 11 ms 9720 KB Output is correct
4 Correct 11 ms 9816 KB Output is correct
5 Correct 11 ms 9756 KB Output is correct
6 Correct 10 ms 9848 KB Output is correct
7 Correct 11 ms 9720 KB Output is correct
8 Correct 10 ms 9720 KB Output is correct
9 Correct 11 ms 9848 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 9848 KB Output is correct
2 Correct 11 ms 9764 KB Output is correct
3 Correct 11 ms 9720 KB Output is correct
4 Correct 11 ms 9816 KB Output is correct
5 Correct 11 ms 9756 KB Output is correct
6 Correct 10 ms 9848 KB Output is correct
7 Correct 11 ms 9720 KB Output is correct
8 Correct 10 ms 9720 KB Output is correct
9 Correct 11 ms 9848 KB Output is correct
10 Correct 17 ms 10472 KB Output is correct
11 Correct 16 ms 10488 KB Output is correct
12 Correct 16 ms 10488 KB Output is correct
13 Correct 19 ms 10488 KB Output is correct
14 Correct 15 ms 10488 KB Output is correct
15 Correct 17 ms 10488 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 607 ms 55932 KB Output is correct
2 Correct 496 ms 54516 KB Output is correct
3 Correct 523 ms 56044 KB Output is correct
4 Correct 546 ms 58436 KB Output is correct
5 Correct 553 ms 58988 KB Output is correct
6 Correct 597 ms 60408 KB Output is correct
7 Correct 592 ms 65272 KB Output is correct
8 Correct 484 ms 54260 KB Output is correct
9 Correct 493 ms 55980 KB Output is correct
10 Correct 505 ms 58348 KB Output is correct
11 Correct 520 ms 58764 KB Output is correct
12 Correct 534 ms 60288 KB Output is correct
13 Correct 469 ms 54004 KB Output is correct
14 Correct 478 ms 54220 KB Output is correct
15 Correct 508 ms 52860 KB Output is correct
16 Correct 476 ms 53864 KB Output is correct
17 Correct 584 ms 64684 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 9848 KB Output is correct
2 Correct 11 ms 9764 KB Output is correct
3 Correct 11 ms 9720 KB Output is correct
4 Correct 11 ms 9816 KB Output is correct
5 Correct 11 ms 9756 KB Output is correct
6 Correct 10 ms 9848 KB Output is correct
7 Correct 11 ms 9720 KB Output is correct
8 Correct 10 ms 9720 KB Output is correct
9 Correct 11 ms 9848 KB Output is correct
10 Correct 17 ms 10472 KB Output is correct
11 Correct 16 ms 10488 KB Output is correct
12 Correct 16 ms 10488 KB Output is correct
13 Correct 19 ms 10488 KB Output is correct
14 Correct 15 ms 10488 KB Output is correct
15 Correct 17 ms 10488 KB Output is correct
16 Correct 607 ms 55932 KB Output is correct
17 Correct 496 ms 54516 KB Output is correct
18 Correct 523 ms 56044 KB Output is correct
19 Correct 546 ms 58436 KB Output is correct
20 Correct 553 ms 58988 KB Output is correct
21 Correct 597 ms 60408 KB Output is correct
22 Correct 592 ms 65272 KB Output is correct
23 Correct 484 ms 54260 KB Output is correct
24 Correct 493 ms 55980 KB Output is correct
25 Correct 505 ms 58348 KB Output is correct
26 Correct 520 ms 58764 KB Output is correct
27 Correct 534 ms 60288 KB Output is correct
28 Correct 469 ms 54004 KB Output is correct
29 Correct 478 ms 54220 KB Output is correct
30 Correct 508 ms 52860 KB Output is correct
31 Correct 476 ms 53864 KB Output is correct
32 Correct 584 ms 64684 KB Output is correct
33 Correct 576 ms 56340 KB Output is correct
34 Correct 394 ms 46456 KB Output is correct
35 Correct 550 ms 54920 KB Output is correct
36 Correct 623 ms 57112 KB Output is correct
37 Correct 622 ms 54852 KB Output is correct
38 Correct 611 ms 56516 KB Output is correct
39 Correct 643 ms 55168 KB Output is correct
40 Correct 828 ms 62280 KB Output is correct
41 Correct 580 ms 55104 KB Output is correct
42 Correct 638 ms 57160 KB Output is correct
43 Correct 649 ms 57452 KB Output is correct
44 Correct 574 ms 54904 KB Output is correct
45 Correct 513 ms 54536 KB Output is correct
46 Correct 521 ms 55412 KB Output is correct
47 Correct 482 ms 53992 KB Output is correct
48 Correct 513 ms 53644 KB Output is correct
49 Correct 499 ms 54244 KB Output is correct
50 Correct 601 ms 53868 KB Output is correct
51 Correct 653 ms 62100 KB Output is correct
52 Correct 662 ms 62280 KB Output is correct