Submission #420645

#TimeUsernameProblemLanguageResultExecution timeMemory
420645zaneyuMonster Game (JOI21_monster)C++17
98 / 100
157 ms1636 KiB
/*input 2 4 bbcb aada aada 3 abc bbb bbb */ #include "monster.h" #include<bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> indexed_set; #pragma GCC optimize("Ofast") //order_of_key #of elements less than x // find_by_order kth element typedef long long int ll; #define ld double #define pii pair<ll,ll> #define f first #define s second #define pb push_back #define REP(i,n) for(int i=0;i<n;i++) #define REP1(i,n) for(int i=1;i<=n;i++) #define FILL(n,x) memset(n,x,sizeof(n)) #define ALL(_a) _a.begin(),_a.end() #define sz(x) (ll)x.size() const ll maxn=2e5+5; const ll maxlg=__lg(maxn)+2; const ll INF64=4e17; const int INF=0x3f3f3f3f; const ll MOD2=3006703054056749LL; const ll MOD=1e9+7; const ld PI=acos(-1); const ld eps=1e-4; #define lowb(x) x&(-x) #define MNTO(x,y) x=min(x,(__typeof__(x))y) #define MXTO(x,y) x=max(x,(__typeof__(x))y) ll mult(ll a,ll b){ ll res=0; while(b){ if(b&1) res+=a,res%=MOD; a+=a; a%=MOD; b>>=1; } return res; } ll mypow(ll a,ll b){ ll res=1; while(b){ if(b&1) res=mult(res,a); a=mult(a,a); b/=2; } return res; } int tmp[maxn],arr[maxn]; map<pii,bool> mp; bool cmp(int a,int b){ if(mp.count({a,b})) return mp[{a,b}]; mp[{a,b}]=Query(a,b); mp[{b,a}]=1-mp[{a,b}]; return mp[{a,b}]; } void srt(int l,int r){ if(l==r) return; int mid=(l+r)/2; srt(l,mid); srt(mid+1,r); int p1=l,p2=mid+1,p=l; while(p1<=mid and p2<=r){ if(cmp(arr[p1],arr[p2])) tmp[p++]=arr[p1++]; else tmp[p++]=arr[p2++]; } while(p1<=mid) tmp[p++]=arr[p1++]; while(p2<=r) tmp[p++]=arr[p2++]; for(int i=l;i<=r;i++) arr[i]=tmp[i]; } vector<int> Solve(int n) { REP(i,n) arr[i]=i; srt(0,n-1); //REP(i,n) cout<<arr[i]<<' '; vector<int> ans(n); vector<int> v; REP1(i,n-1){ if(!cmp(arr[0],arr[i])){ v.pb(i); } } int mx=0; if(sz(v)==1){ if(cmp(arr[1],arr[v[0]])){ if(v[0]==2){ mx=0; for(int i=3;i<n;i++){ if(!cmp(arr[1],arr[i])) break; if(!cmp(arr[2],arr[i])){ mx=1; break; } } } else mx=1; } else{ mx=0; } } else{ mx=v[sz(v)-2]; } int cur=n-1; for(int i=mx;i>=0;i--){ ans[arr[i]]=(cur--); } int p=0; v.clear(); for(int i=mx+1;i<n;i++){ v.pb(i); if(!cmp(arr[p],arr[i])){ reverse(ALL(v)); p=v.back(); for(auto x:v) ans[arr[x]]=(cur--); v.clear(); } } //for(auto x:ans) cout<<x<<' '; return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...