제출 #210368

#제출 시각아이디문제언어결과실행 시간메모리
210368HNO2Bubble Sort 2 (JOI18_bubblesort2)C++17
100 / 100
2195 ms80092 KiB
#include <bits/stdc++.h> using namespace std; std::vector<int> countScans(std::vector<int> A,std::vector<int> X,std::vector<int> V); typedef long long ll; const int maxn=5e5+7; const int inf=INT_MAX; const ll inff=1e18; const ll mod=1e9+7; #define pii pair<int,int> #define mkp make_pair #define F first #define S second #define pb push_back #define sz(v) ((int)(v).size()) #define all(v) (v).begin(),(v).end() //#define int ll #ifdef HNO2 #define IOS #else #include <bubblesort2.h> #define endl '\n' #define IOS ios::sync_with_stdio(0); cin.tie(0); #endif // HNO2 vector<ll> values; ll a[maxn]; ll x[maxn],v[maxn]; const int C=1e8; struct segtree { int seg[maxn*2*4],tag[maxn*2*4]; void init() { memset(seg,0,sizeof(seg)); memset(tag,0,sizeof(tag)); } void push(int now,int l,int r) { if (l==r||tag[now]==0) { tag[now]=0; return; } seg[now*2]+=tag[now]; tag[now*2]+=tag[now]; seg[now*2+1]+=tag[now]; tag[now*2+1]+=tag[now]; tag[now]=0; } void modify(int now,int l,int r,int ql,int qr,int vv) { if (l>=ql&&r<=qr) { seg[now]+=vv; tag[now]+=vv; return; } int m=(l+r)>>1; push(now,l,r); if (ql<=m) modify(now*2,l,m,ql,qr,vv); if (qr>m) modify(now*2+1,m+1,r,ql,qr,vv); seg[now]=max(seg[now*2],seg[now*2+1]); } int query() { return seg[1]; } }tree; std::vector<int> countScans(std::vector<int> A,std::vector<int> X,std::vector<int> V){ int n=sz(A),q=sz(X); vector<int> ans; for (int i=1;i<=n;i++) a[i]=A[i-1]*1ll*C+i,values.pb(A[i-1]*1ll*C+i); for (int i=1;i<=q;i++) { x[i]=X[i-1]+1; v[i]=V[i-1]*1ll*C+(X[i-1]+1); values.pb(V[i-1]*1ll*C+(X[i-1]+1)); } //values.pb(-1); sort(all(values)); values.resize(unique(all(values))-values.begin()); for (int i=1;i<=n;i++) a[i]=lower_bound(all(values),a[i])-values.begin()+1; for (int i=1;i<=q;i++) v[i]=lower_bound(all(values),v[i])-values.begin()+1; int N=sz(values); tree.init(); for (int i=1;i<=N;i++) tree.modify(1,1,N,i,i,-C+(values[i-1]%C)); for (int i=1;i<=n;i++) { tree.modify(1,1,N,a[i],a[i],C); if (a[i]!=N) tree.modify(1,1,N,a[i]+1,N,-1); } for (int i=1;i<=q;i++) { if (a[x[i]]!=N) tree.modify(1,1,N,a[x[i]]+1,N,1); tree.modify(1,1,N,a[x[i]],a[x[i]],-C); a[x[i]]=v[i]; if (a[x[i]]!=N) tree.modify(1,1,N,a[x[i]]+1,N,-1); tree.modify(1,1,N,a[x[i]],a[x[i]],C); ans.pb(tree.query()-1); } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...