Submission #514943

#TimeUsernameProblemLanguageResultExecution timeMemory
514943kostia244Minerals (JOI19_minerals)C++17
80 / 100
43 ms2456 KiB
#include "minerals.h"
#include<bits/stdc++.h>
using namespace std;
bitset<90000> on;
int uwusgi(int x) {
	on.flip(x);
	return Query(x);
}
#define Query uwusgi
void Solve(int N) {
	vector<int> A, B, C(N);
	for(int lst = 0, i = 1; i <= 2*N; i++) {
		int cc = Query(i);
		(cc==lst ? B : A).push_back(i);
		lst = cc;
	}
	// int CC = 0;
	for(int b = 0; b < 16; b++) {
		int lst = 0;
		for(int i = 0; i < N; i++)
			if(((i>>b)&1)^on[A[i]])
				lst = Query(A[i]);
		vector<int> cnt(1<<16), cnto(1<<16);
		for(auto i : C) cnt[i]++;
		for(int i = 0; i < 1<<b; i++) {
			for(int j = 0; j < 1<<(16-b); j++) {
				int c = i | (j<<b);
				if(c<N)
					cnto[i] += j&1;
			}
		}
		for(int i = 0; i < N; i++) {
			if(--cnt[C[i]]) {
				int qq = Query(B[i]);
				if(lst == qq) cnto[C[i]]--;
				C[i] |= (lst == qq)<<b;
				lst = qq;
			} else {
				C[i] |= cnto[C[i]]<<b;
			}
		}
		// for(auto i : C) cout << i << " "; cout << endl;
	}
	for(int i = 0; i < N; i++)
		Answer(A[C[i]], B[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...
#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...