Submission #1205448

#TimeUsernameProblemLanguageResultExecution timeMemory
1205448biankToxic Gene (NOI23_toxic)C++20
93.25 / 100
14 ms604 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; 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; } vi find_toxic(int l, int r, bool flag){ if(l>r) return {}; vi vec(r-l+1); forsn(i,l,r+1) vec[i-l]=perm[i]; if(!flag&&query2(vec)) return {}; 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; } vi res=find_toxic(hi+1,r,0); res.pb(perm[hi]); return res; } void determine_type(int n){ memo.clear(),g1.clear(),g2.clear(); v.clear(); perm=vi(n); forn(i,n) perm[i]=i+1; shuffle(all(perm),rng); int j=0; vi t; 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); } } for(vi g:g2){ perm=g; shuffle(all(perm),rng); for(int x:find_toxic(0,sz(g)-1,1)) t.pb(x); v.insert(end(v),all(g)); } 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...