제출 #1170421

#제출 시각아이디문제언어결과실행 시간메모리
1170421Zbyszek99Minerals (JOI19_minerals)C++20
100 / 100
31 ms3624 KiB
#include "minerals.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define ll long long #define ld long double #define ull unsigned long long #define ff first #define ss second #define pii pair<int,int> #define pll pair<long long, long long> #define vi vector<int> #define vl vector<long long> #define pb push_back #define rep(i, b) for(int i = 0; i < (b); ++i) #define rep2(i,a,b) for(int i = a; i <= (b); ++i) #define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c) #define count_bits(x) __builtin_popcountll((x)) #define all(x) (x).begin(),(x).end() #define siz(x) (int)(x).size() #define forall(it,x) for(auto& it:(x)) using namespace __gnu_pbds; using namespace std; typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set; //mt19937 mt;void random_start(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());} //ll los(ll a, ll b) {return a + (mt() % (b-a+1));} const int INF = 1e9+50; const ll INF_L = 1e18+40; const ll MOD = 1e9+7; bool is_on[100'000]; int ans[100'001]; int cur_dif; int ask(int x) { is_on[x] ^= 1; return Query(x); } void solve(vi A, vi B) { if(siz(A) == 1) { ans[A[0]] = B[0]; return; } int c0_A = 0; int c1_A = 0; forall(it,A) { if(is_on[it] == 0) c0_A++; else c1_A++; } int c0_B = 0; int c1_B = 0; forall(it,B) { if(is_on[it] == 0) c0_B++; else c1_B++; } int v1 = abs(c0_A - siz(A)/2); int v2 = abs(c0_A - (siz(A)+1)/2); int v3 = abs(c1_A - siz(A)/2); int v4 = abs(c1_A - (siz(A)+1)/2); int v5 = abs(c0_B - siz(B)/2); int v6 = abs(c0_B - (siz(B)+1)/2); int v7 = abs(c1_B - siz(B)/2); int v8 = abs(c1_B - (siz(B)+1)/2); //cout << v1 << " " << v2 << " " << v3 << " " << v4 << " " << v5 << " " << v6 << " " << v7 << " " << v8 << " v\n"; if(min({v1,v2,v3,v4}) < min({v5,v6,v7,v8})) { if(min({v1,v2}) <= min({v3,v4})) { if(c0_A >= siz(A)/2) { forall(it,A) { if(!is_on[it] && c0_A > (siz(A)+1)/2) { cur_dif = ask(it); c0_A--; } } } else { forall(it,A) { if(is_on[it] && c0_A < (siz(A))/2) { cur_dif = ask(it); c0_A++; } } } } else { if(c1_A >= siz(A)/2) { forall(it,A) { if(is_on[it] && c1_A > (siz(A)+1)/2) { cur_dif = ask(it); c1_A--; } } } else { forall(it,A) { if(!is_on[it] && c1_A < (siz(A))/2) { cur_dif = ask(it); c1_A++; } } } } swap(A,B); } else { if(min({v5,v6}) <= min({v7,v8})) { if(c0_B >= siz(B)/2) { forall(it,B) { if(!is_on[it] && c0_B > (siz(B)+1)/2) { cur_dif = ask(it); c0_B--; } } } else { forall(it,B) { if(is_on[it] && c0_B < (siz(B))/2) { cur_dif = ask(it); c0_B++; } } } } else { if(c1_B >= siz(B)/2) { forall(it,B) { if(is_on[it] && c1_B > (siz(B)+1)/2) { cur_dif = ask(it); c1_B--; } } } else { forall(it,B) { if(!is_on[it] && c1_B < (siz(B))/2) { cur_dif = ask(it); c1_B++; } } } } } vi newA0; vi newA1; vi newB0; vi newB1; forall(it,B) { if(is_on[it]) newB1.pb(it); else newB0.pb(it); } forall(it,A) { if(siz(newA0) == siz(newB0)) { newA1.pb(it); continue; } if(siz(newA1) == siz(newB1)) { newA0.pb(it); continue; } int new_dif = ask(it); if(cur_dif != new_dif) { newA0.pb(it); } else { newA1.pb(it); } cur_dif = new_dif; } solve(newA0,newB0); solve(newA1,newB1); } void Solve(int n) { vi A; vi B; cur_dif = 0; rep2(i,1,n*2) { int new_dif = ask(i); if(cur_dif != new_dif) { A.pb(i); } else { B.pb(i); } cur_dif = new_dif; } solve(A,B); rep2(i,1,n*2) { if(ans[i] != 0) { Answer(i,ans[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...