제출 #1369037

#제출 시각아이디문제언어결과실행 시간메모리
1369037vlomaczkVoltage 2 (JOI26_voltage)C++20
100 / 100
59 ms984 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
typedef long long ll;
using namespace __gnu_pbds;
using namespace std;
#define ff first
#define ss second
#define pi pair<int, int>
#define pll pair<long long, long long>
#define vi vector<int>
#define vll vector<long long>
#define vpi vector<pair<int,int>>
#define vpll vector<pair<long long, long long>>
#define pb push_back
#define count_bits(x) __builtin_popcountll((x))
#define all(x) (x).begin(),(x).end()
#define sz(x) (ll)(x).size()
#define forall(it,x) for(auto& it:(x))
#define mp make_pair
pi operator+(pi a, pi b) { return mp(a.ff+b.ff, a.ss+b.ss); }
pi operator-(pi a, pi b) { return mp(a.ff-b.ff, a.ss-b.ss); }
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#include "voltage.h"

int am = 0;
int n, m;

void Edge(int a, int b) {
	// cerr << "edge: " << a << " " << b << "\n";
	am++;
	answer(a, b);
}

int root;
vector<int> nei, sinks;

void cdq(vector<int> v) {
	if(v.empty()) return;
	if(v.size() == 1) {
		int V = v[0];
		vector<int> X(n,0);
		for(auto x : sinks) X[x] = 1;
		X[V] = 1;
		auto Y = X;
		X[root] = 0;
		if(query(X,Y) == -1) {
			nei.pb(V);
		}
		return;
	}
	int s = v.size();
	int mid = s/2;
	vector<int> L, R;
	for(int i=0; i<mid; ++i) L.pb(v[i]);
	for(int i=mid; i<s; ++i) R.pb(v[i]);
	
	vector<int> X(n,0);
	for(auto x : sinks) X[x] = 1;
	for(auto x : L) X[x] = 1;
	auto Y = X;
	X[root] = 0;
	if(query(X,Y) == -1) cdq(L);

	X.assign(n, 0);
	for(auto x : sinks) X[x] = 1;
	for(auto x : R) X[x] = 1;
	Y = X;
	X[root] = 0;
	if(query(X,Y) == -1) cdq(R);
}

bool solve(int N, int M) {
	n=N; m=M;
	queue<int> Q;
	for(int i=0; i<n; ++i) {
		vector<int> X(n, 0);
		vector<int> Y(n, 0);
		Y[i] = 1;
		if(query(X,Y) == 0) sinks.pb(i);
	}
	if(sinks.empty()) return false;

	for(auto x : sinks) Q.push(x);
	int cnt = 0;
	vector<int> vis(n);
	while(Q.size()) {
		int v = Q.front(); Q.pop();
		if(vis[v]) continue;
		vis[v] = 1;
		cnt++;
		sinks.pb(v);
		vector<int> V;
		for(int i=0; i<n; ++i) {
			if(i!=v) V.pb(i);
		}
		root = v;
		nei.clear();
		cdq(V);
		for(auto u : nei) {
			Edge(u,v);
			vector<int> X(n, 0);
			for(auto x : sinks) X[x] = 1;
			auto Y = X; Y[u] = 1;
			if(query(X, Y) == 0) {
				Q.push(u);
			}
		}
	}
	return cnt==n;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…