Submission #1206058

#TimeUsernameProblemLanguageResultExecution timeMemory
1206058biankToxic Gene (NOI23_toxic)C++20
100 / 100
13 ms608 KiB
#include <bits/stdc++.h> #include "toxic.h" using namespace std; #define forn(i,n) for(int i=0;i<int(n);i++) #define forsn(i,s,n) for(int i=int(s);i<int(n);i++) #define dforn(i,n) for(int i=int(n)-1;i>=0;i--) #define dforsn(i,s,n) for(int i=int(n)-1;i>=int(s);i--) #define fst first #define snd second #define pb push_back #define eb emplace_back #define sz(x) (int)x.size() #define all(x) x.begin(), x.end() typedef long long ll; typedef vector<ll> vll; typedef vector<int> vi; typedef pair<int,int> ii; map<vi,int> memo; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int cnt=0; int query(vi v){ if(memo.count(v)) return memo[v]; return memo[v]=query_sample(v); } vector<vi> g1,g2; vi v,t; vi perm; int query2(vi vec){ if(g1.empty()) return query(vec); vi g=g1.back(); int prev=sz(vec); forn(i,sz(g)){ forn(_,1<<i) vec.pb(g[i]); } int x=query(vec); if(x==sz(vec)) return prev; g1.pop_back(); forn(i,sz(g)){ if(x>>i&1) answer_type(g[i],'S'); else v.pb(g[i]); } return 0; } int find_toxic(int l, int r, bool flag){ if(sz(t)==30) return -1; if(l>r) return -1; vi vec(r-l+1); forsn(i,l,r+1) vec[i-l]=perm[i]; if(!flag&&query2(vec)) return -1; int lo=l-1,hi=r; while(hi-lo>1){ int mid=(lo+hi)/2; if(!query2(vi(begin(vec),begin(vec)+mid-l+1))) hi=mid; else lo=mid; } return hi; } void find_all_toxic(int l, int r){ int pos=find_toxic(l,r,0); if(pos==-1) return; t.pb(perm[pos]); find_all_toxic(pos+1,r); } const int k=7; void determine_type(int n){ memo.clear(),g1.clear(),g2.clear(); v.clear(),t.clear(); perm=vi(n); forn(i,n) perm[i]=i+1; shuffle(all(perm),rng); int j=0; while(j<n){ vi type(8,-1); forn(i,8){ if(j>=n) break; type[i]=perm[j++]; } vi sample; forn(i,8) if(type[i]!=-1){ forn(_,1<<i) sample.pb(type[i]); } int x=query(sample); if(x==sz(sample)){ g1.pb(type); while(g1.back().back()==-1) g1.back().pop_back(); continue; } vi lol; forn(i,8) if(type[i]!=-1){ if(x>>i&1) answer_type(type[i],'S'); else lol.pb(type[i]); } if(!lol.empty()){ if(sz(lol)==1) t.pb(lol[0]),v.pb(lol[0]); else g2.pb(lol); } } vi rem; for(vi g:g2){ perm=g; shuffle(all(perm),rng); int hi=find_toxic(0,sz(g)-1,1); assert(hi!=-1); t.pb(perm[hi]); v.insert(end(v),all(g)); rem.insert(end(rem),begin(perm)+hi+1,end(perm)); } perm=rem; shuffle(all(perm),rng); for(int l=0,r=l+k-1;l<sz(perm);l=r+1,r=l+k-1){ find_all_toxic(l,min(r,sz(perm)-1)); } assert(sz(t)>=1); for(vi g:g1){ vi sample={t[0]}; forn(i,sz(g)){ forn(_,1<<i) sample.pb(g[i]); } int x=query(sample); forn(i,sz(g)){ if(x>>i&1) answer_type(g[i],'S'); else v.pb(g[i]); } } sort(all(v)); sort(all(t)); for(int x:t) answer_type(x,'T'); j=0; forn(i,sz(v)){ if(j<sz(t)&&t[j]==v[i]) j++; else answer_type(v[i],'R'); } }
#Verdict Execution timeMemoryGrader output
Fetching results...