Submission #1295159

#TimeUsernameProblemLanguageResultExecution timeMemory
1295159tudor_costinBubble Sort 2 (JOI18_bubblesort2)C++20
0 / 100
9092 ms49376 KiB
#include <bits/stdc++.h> #define ll long long using namespace std; const int Nmax=1e6+5; const ll inf=3e9; struct node { int cnt; ll maxval; }; node unite(node st,node dr) { node ans; ans.cnt=st.cnt+dr.cnt; ans.maxval=max(st.maxval+dr.cnt,dr.maxval); return ans; } int repr[Nmax]; node aint[4*Nmax]; set<int> poz[Nmax]; void build(int nod,int l,int r) { if(l==r) { if(repr[l]==0) { aint[nod].cnt=poz[l].size(); aint[nod].maxval=-inf; } else { aint[nod].cnt=poz[l].size(); aint[nod].maxval=repr[l]; } return; } int mid=(l+r)/2; build(2*nod,l,mid); build(2*nod+1,mid+1,r); aint[nod]=unite(aint[2*nod],aint[2*nod+1]); return; } void update(int nod,int l,int r,int x,int val) { if(l==r) { if(val==0) { aint[nod].cnt=poz[l].size(); aint[nod].maxval=-inf; } else { aint[nod].cnt=poz[l].size(); aint[nod].maxval=val; } return; } int mid=(l+r)/2; if(x<=mid) update(2*nod,l,mid,x,val); else update(2*nod+1,mid+1,r,x,val); aint[nod]=unite(aint[2*nod],aint[2*nod+1]); return; } vector<int> countScans(vector<int> a,vector<int> x,vector<int> v) { int n=a.size(),q=x.size(); map<int,vector<pair<int,int>>> nrm; for(int i=0; i<n; i++) nrm[a[i]].push_back({i,0}); for(int i=0; i<q; i++) nrm[v[i]].push_back({i,1}); int nrc=0; for(auto [val,V]:nrm) { nrc++; for(auto [id,tip]:V) { if(tip==0) a[id]=nrc; else v[id]=nrc; } } for(int i=0;i<n;i++) poz[a[i]].insert(i+1); for(int i=1;i<=nrc;i++) { if(!poz[i].empty()) repr[i]=(*poz[i].rbegin()); } build(1,1,nrc); vector<int> ans(q,0); for(int i=0;i<q;i++) { int cur=a[x[i]]; poz[cur].erase(poz[cur].find(x[i]+1)); int nw,prv=repr[cur]; if(poz[cur].empty()) nw=0; else nw=(*poz[cur].rbegin()); update(1,1,nrc,cur,nw); repr[cur]=nw; poz[v[i]].insert(x[i]+1); nw=(*poz[v[i]].rbegin()); prv=repr[v[i]]; update(1,1,nrc,v[i],nw); repr[v[i]]=nw; ans[i]=aint[1].maxval-n; } return ans; } /*int main() { int n,q; cin>>n>>q; vector<int> a(n),x(q),v(q); for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<q;i++) cin>>x[i]>>v[i]; vector<int> ans=countScans(a,x,v); for(int x:ans) cout<<x<<'\n'; return 0; } */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...