Submission #1271115

#TimeUsernameProblemLanguageResultExecution timeMemory
1271115trandangquangBubble Sort 2 (JOI18_bubblesort2)C++20
100 / 100
1573 ms62396 KiB
#include "bubblesort2.h" #include <bits/stdc++.h> using namespace std; #define foru(i,a,b) for(int i=(a); i<=(b); ++i) #define ford(i,a,b) for(int i=(a); i>=(b); --i) #define rep(i,a) for(int i=0; i<(a); ++i) #define sz(a) (int)(a).size() #define all(a) (a).begin(),(a).end() #define bit(s,i) (((s)>>(i))&1) #define ii pair<int,int> #define fi first #define se second #define pb push_back #define eb emplace_back #define ll long long template <class X, class Y> bool maxi(X &x, Y y){return x<y?x=y,true:false;} template <class X, class Y> bool mini(X &x, Y y){return x>y?x=y,true:false;} const int N=5e5+5; const int INF=1e9; int n,q,a[N],x[N],v[N]; ii tmp[N+N]; int prv[N+N],nxt[N+N]; void compress(){ rep(i,n) tmp[i]={a[i],i}; rep(i,q) tmp[i+n]={v[i],i+n}; sort(tmp, tmp+n+q); rep(i,n+q){ if(tmp[i].se<n){ a[tmp[i].se]=i; } else{ v[tmp[i].se-n]=i; } } rep(i,n+q){ int j=i; while(j<n+q && tmp[i].fi==tmp[j].fi) ++j; foru(k,i,j){ prv[k]=i-1; nxt[k]=j; } i=j-1; } } vector<int> Answers; int mx[N<<3],cnt[N<<3]; int lz[N<<3]; void apply(int id, int val){ mx[id]+=val; lz[id]+=val; } void down(int id){ if(lz[id]==0) return; apply(id<<1,lz[id]); apply(id<<1|1,lz[id]); lz[id]=0; } void updP(int x, int val){ int id=1, l=0, r=n+q-1; while(l<r){ down(id); int mid=(l+r)>>1; if(x<=mid){ id=id<<1; r=mid; } else{ id=id<<1|1; l=mid+1; } } if(val==-INF) cnt[id]=0; else cnt[id]=1; mx[id]=val; while(id>1){ id/=2; mx[id]=max(mx[id<<1], mx[id<<1|1]); cnt[id]=cnt[id<<1] + cnt[id<<1|1]; } } void updR(int u, int v, int val, int id=1, int l=0, int r=n+q-1){ if(u>r||v<l) return; if(u<=l && r<=v){ apply(id,val); return; } down(id); int mid=(l+r)>>1; updR(u,v,val,id<<1,l,mid); updR(u,v,val,id<<1|1,mid+1,r); mx[id]=max(mx[id<<1], mx[id<<1|1]); cnt[id]=cnt[id<<1] + cnt[id<<1|1]; } int getCnt(int u, int v, int id=1, int l=0, int r=n+q-1){ if(u>r||v<l) return 0; if(u<=l&&r<=v) return cnt[id]; int mid=(l+r)>>1; return getCnt(u,v,id<<1,l,mid) + getCnt(u,v,id<<1|1,mid+1,r); } void del(int x){ updP(x,-INF); updR(prv[x]+1, n+q-1, 1); } void add(int x, int i){ int cntS=getCnt(0,nxt[x]-1); updR(prv[x]+1, n+q-1, -1); updP(x, i-cntS); } void mainSolve(){ rep(i,n) add(a[i],i); rep(i,q){ del(a[x[i]]); a[x[i]]=v[i]; add(a[x[i]],x[i]); Answers.eb(mx[1]); } } vector<int> countScans(vector<int> A, vector<int> X, vector<int> V){ n=sz(A); q=sz(X); rep(i,sz(A)) a[i]=A[i]; rep(i,sz(X)) x[i]=X[i], v[i]=V[i]; compress(); mainSolve(); return Answers; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...