Submission #1286493

#TimeUsernameProblemLanguageResultExecution timeMemory
1286493StefanSebezBubble Sort 2 (JOI18_bubblesort2)C++20
100 / 100
2847 ms121816 KiB
#include "bubblesort2.h" #include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define ll long long #define ld long double const int N=1e6+50,inf=1e9; void Unique(vector<int>&a){sort(a.begin(),a.end());a.resize(unique(a.begin(),a.end())-a.begin());} int n,q,a[N]; set<int>st[N]; struct SegTree{ int root,nc,lc[2*N],rc[2*N],maks[2*N],lazy[2*N]; SegTree(){maks[0]=-inf;} void update(int &c,int x){if(!c)c=++nc;maks[c]+=x;lazy[c]+=x;} void push(int &c){if(!c)c=++nc;update(lc[c],lazy[c]);update(rc[c],lazy[c]);lazy[c]=0;} void Update(int &c,int ss,int se,int qs,int qe,int x){ if(!c)c=++nc; if(qs>qe||qe<ss||se<qs)return; if(qs<=ss&&se<=qe){update(c,x);return;} int mid=ss+se>>1;push(c); Update(lc[c],ss,mid,qs,qe,x);Update(rc[c],mid+1,se,qs,qe,x); maks[c]=max(maks[lc[c]],maks[rc[c]]); } int Get(int &c,int ss,int se,int qs,int qe){ if(!c)c=++nc; if(qs>qe||qe<ss||se<qs)return -inf; if(qs<=ss&&se<=qe)return maks[c]; int mid=ss+se>>1;push(c); return max(Get(lc[c],ss,mid,qs,qe),Get(rc[c],mid+1,se,qs,qe)); } }ST; vector<int> countScans(vector<int>A,vector<int> X,vector<int> V){ n=A.size();q=X.size(); for(int i=1;i<=n;i++) a[i]=A[i-1]; for(auto &i:X) i++; vector<int>vals; for(int i=1;i<=n;i++) vals.pb(a[i]); for(auto i:V) vals.pb(i); Unique(vals); for(int i=1;i<=n;i++) a[i]=lower_bound(vals.begin(),vals.end(),a[i])-vals.begin(); for(auto &i:V) i=lower_bound(vals.begin(),vals.end(),i)-vals.begin(); vector<int>res(q,0); for(int i=1;i<=n;i++){ if(!st[a[i]].empty()){ ST.Update(ST.root,0,N,a[i],a[i],-*st[a[i]].rbegin()); } st[a[i]].insert(i); ST.Update(ST.root,0,N,a[i],a[i],*st[a[i]].rbegin()); ST.Update(ST.root,0,N,a[i],N,-1); } for(int I=0;I<q;I++){ int j=X[I]; ST.Update(ST.root,0,N,a[j],N,1); ST.Update(ST.root,0,N,a[j],a[j],-*st[a[j]].rbegin()); st[a[j]].erase(j); if(!st[a[j]].empty())ST.Update(ST.root,0,N,a[j],a[j],*st[a[j]].rbegin()); a[j]=V[I]; if(!st[a[j]].empty())ST.Update(ST.root,0,N,a[j],a[j],-*st[a[j]].rbegin()); st[a[j]].insert(j); ST.Update(ST.root,0,N,a[j],a[j],*st[a[j]].rbegin()); ST.Update(ST.root,0,N,a[j],N,-1); res[I]=ST.maks[ST.root]; } return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...