제출 #1347296

#제출 시각아이디문제언어결과실행 시간메모리
1347296penguin133Voltage 2 (JOI26_voltage)C++20
100 / 100
48 ms952 KiB
#include "voltage.h"
#include <bits/stdc++.h>
using namespace std;

int n, m, out[505], vis[505], gone[505];

bool solve(int N, int M) {
    std::vector<int> x(N, 0);
    std::vector<int> y(N, 1);
    n = N, m = M;
    queue <int> q;
    for (int i = 0; i < N; i++) out[i] = vis[i] = 0;
    for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) y[j] = 1;
		y[i] = 0;
		int res = query(x, y);
		if (res == 0) {
			q.push(i);
			gone[i] = 1;
		}
		for (int j = 0; j < N; j++) y[j] = 0;
		y[i] = 1;
		res = query(x, y);
		if (res == 0) {
			out[i] = 1;
		}
	}
	if (q.empty()) return false;
	vector <pair <int, int> > ans;
	while (!q.empty()) {
		int a = q.front(); q.pop();
		if (vis[a]) continue;
		vis[a] = 1;
		vector <int> p;
		for (int i = 0; i < N; i++) if (!vis[i]) p.push_back(i);
		if (p.empty()) break;
		int lst = 0;
		while (1) {
			int lo = lst, hi = (int)p.size() - 1, grr = hi + 1;
			while (lo <= hi) {
				int mid = (lo + hi) >> 1;
				vector <int> t1(n, 0);
				for (int i = 0; i < lst; i++) t1[p[i]] = 1;
				for (int i = mid + 1; i < (int)p.size(); i++) t1[p[i]] = 1;
				vector <int> t2 = t1;
				t2[a] = 1;
				int res = query(t1, t2);
				if (res == 1) {
					grr = mid, hi = mid - 1;
				}
				else lo = mid + 1;
			}
			if (grr != (int)p.size()) {
				ans.push_back({a, p[grr]});
				vector <int> t1(n, 0), t2(n, 0);
				for (int j = 0; j < N; j++) t1[j] = (vis[j] ? 0 : 1);
				t2 = t1;
				t2[p[grr]] = 0;
				int res = query(t1, t2);
				if (res == 0) {
					q.push(p[grr]);
				}
				lst = grr + 1;
			}
			else break;
		}
		
	}
	if ((int)ans.size() < M) return false;
	for (auto [a, b] : ans) answer(a, b);
	return true;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...