Submission #1370061

#TimeUsernameProblemLanguageResultExecution timeMemory
1370061vlomaczkCircuit 2 (JOI25_circuit2)C++20
100 / 100
58 ms2028 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 "circuit.h"

vector<int> ors, par(100'010, -1), is_or(100'010), where(100'010, 0);

std::string solve(int N, int R, std::vector<int> U, std::vector<int> V) {
	auto Query = [&](string s) {
		vector<int> x(2*N + 1);
		for(int i=0; i<N; ++i) if(is_or[i]) {
			x[i]^=1;
			x[U[i]] ^= 1;
			x[V[i]] ^= 1;
		}
		for(int i=0; i<2*N+1; ++i) {
			if(x[i]) {
				if(s[i]=='1') s[i]='0';
				else s[i]='1';
			}
		}
		return query(s);
	};

	vector<int> S(2*N + 1,1);
	for(int i=N-1; i>=0; --i) {
		int u = U[i];
		int v = V[i];
		S[i] = S[u] + S[v] + 1;
		if(S[v] > S[u]) swap(U[i], V[i]);
	}
	vector<int> D(2*N + 1, 0);
	for(int i=0; i<N; ++i) {
		int u = U[i];
		int v = V[i];
		par[u] = par[v] = i;
		where[v] = 1;
		D[u] = D[i]; 
		D[v] = D[i] + 1;
	}
	vector<vector<int>> paths;
	for(int i=0; i<N; ++i) {
		if(paths.size() <= D[i]) paths.pb({});
		paths[D[i]].pb(i);
	}
	for(auto P : paths) {
		int n = P.size();
		auto check = [&](int mid) {
			mid = min(mid, n-1);
			string Q(2*N + 1, '0');
			for(int i=0; i<=mid; ++i) Q[V[P[i]]] = '1';
			return Query(Q);
		};
		int W = 64;
		for(int i=0; i<n; i+=W) {
			while(1) {
				int lo = i;
				int hi = min(n-1, i+W-1);
				if(!check(hi)) break;
				while(lo < hi) {
					int mid = (lo+hi)/2;
					if(check(mid)) hi = mid;
					else lo = mid + 1;
				}
				ors.pb(P[lo]);
				is_or[P[lo]] = 1;
			}
		}
		for(auto x : P) is_or[x] ^= 1;
	}
	string res = "";
	for(int i=0; i<N; ++i) res.pb('&');
	for(auto x : ors) res[x] = '|';
	// cerr << res << "\n";
	return res;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...