Submission #539218

#TimeUsernameProblemLanguageResultExecution timeMemory
539218LoboBubble Sort 2 (JOI18_bubblesort2)C++17
0 / 100
14 ms1532 KiB
#include "bubblesort2.h" #include<bits/stdc++.h> using namespace std; const long long inf = (long long) 1e18 + 10; const int inf1 = (int) 1e9 + 10; // #define int long long #define dbl long double #define endl '\n' #define sc second #define fr first #define mp make_pair #define pb push_back #define all(x) x.begin(), x.end() #define maxn 500050 int n, q, tr[4*maxn], a[maxn]; set<pair<int,int>> lr; void att(int no, int l, int r, int pos, int val) { if(l > pos || r < pos) return; else if(l == r) { tr[no]+= val; return; } int f1 = 2*no; int f2 = 2*no+1; int mid = (l+r)/2; att(f1,l,mid,pos,val); att(f2,mid+1,r,pos,val); tr[no] = tr[f1]+tr[f2]; } //busca na seg para encontrar o k-ésimo menor int find(int no, int l, int r, int val) { if(l == r) { return l; } int f1 = 2*no; int f2 = 2*no+1; int mid = (l+r)/2; if(val-tr[f1] > 0) { return find(f2,mid+1,r,val-tr[f1]); } else { return find(f1,l,mid,val); } } vector<int> countScans(vector<int> A,vector<int> X,vector<int> V){ vector<int> answer; vector<int> cc; n = A.size(); q = V.size(); for(int i = 1; i <= n; i++) { a[i] = A[i-1]; cc.pb(a[i]); } for(int i = 0; i < q; i++) { cc.pb(V[i]); } sort(all(cc)); cc.erase(unique(all(cc)),cc.end()); int mxv = cc.size(); for(int i = 1; i <= n; i++) { a[i] = upper_bound(all(cc),a[i]) - cc.begin(); att(1,1,mxv,a[i],1); } for(int i = 0; i < q; i++) { V[i] = upper_bound(all(cc),V[i]) - cc.begin(); } //mantem os intervalos crescentes int ant = 1; for(int i = 2; i <= n; i++) { if(a[i] < a[i-1]) { lr.insert(mp(ant,i-1)); ant = i; } } lr.insert(mp(ant,n)); for(int i = 0; i < q; i++) { int pos = X[i]+1; int val = V[i]; //muda a seg att(1,1,mxv,a[pos],-1); att(1,1,mxv,val,1); auto it = lr.upper_bound(mp(pos,inf1)); it--; int l1 = it->fr; int r1 = it->sc; if((pos+1 <= r1 && val > a[pos+1]) || (pos-1 >= l1 && val < a[pos-1])) { lr.erase(it); if(pos-1 >= l1) lr.insert(mp(l1,pos-1)); lr.insert(mp(pos,pos)); if(pos+1 <= r1) lr.insert(mp(pos+1,r1)); } else if(l1 == pos && r1 == pos) { vector<pair<int,int>> rem; if(it != lr.begin()) { auto itl = it; itl--; if(val >= itl->sc) { l1 = itl->fr; rem.pb(mp(itl->fr,itl->sc)); } } auto itr = it; itr++; if(itr != lr.end()) { if(val <= itr->fr) { r1 = itr->sc; rem.pb(mp(itr->fr,itr->sc)); } } rem.pb(mp(it->fr,it->sc)); for(auto x : rem) lr.erase(x); lr.insert(mp(l1,r1)); } else if(l1 == pos) { vector<pair<int,int>> rem; if(it != lr.begin()) { auto itl = it; itl--; if(val >= itl->sc) { l1 = itl->fr; rem.pb(mp(itl->fr,itl->sc)); } } rem.pb(mp(it->fr,it->sc)); for(auto x : rem) lr.erase(x); lr.insert(mp(l1,r1)); } else if(r1 == pos) { vector<pair<int,int>> rem; auto itr = it; itr++; if(itr != lr.end()) { if(val <= itr->fr) { r1 = itr->sc; rem.pb(mp(itr->fr,itr->sc)); } } rem.pb(mp(it->fr,it->sc)); for(auto x : rem) lr.erase(x); lr.insert(mp(l1,r1)); } //separar em (l1,pos-1) (pos,pos) e (pos+1,r1) //juntar com o anterior se for o inicio //juntar com o proximo se for o final a[pos] = val; //faz bb para encontrar o ultimo no primeiro intervalo que funciona l1 = 1; r1 = lr.begin()->sc; int ans1 = 0; while(l1 <= r1) { int mid = (l1+r1)>>1; //vê se o mid ésimo menor é igual ao a[mid] if(a[mid] == find(1,1,mxv,mid)) { ans1 = mid; l1 = mid+1; } else { r1 = mid-1; } } it = lr.end(); it--; int l2 = it->fr; int r2 = n; int ans2 = n+1; while(l2 <= r2) { int mid = (l2+r2)>>1; //vê se o mid ésimo menor é igual ao a[mid] if(a[mid] == find(1,1,mxv,mid)) { ans2 = mid; r2 = mid-1; } else { l2 = mid+1; } } answer.pb(max(ans2-ans1-1-1,0)); // cout << ans1 << " " << ans2 << endl; } return answer; } // int32_t main() { // ios::sync_with_stdio(false); cin.tie(0); // freopen("in.in", "r", stdin); // // freopen("out.out", "w", stdout); // int N, Q; // cin >> N >> Q; // vector<int> A,X,V; // for(int i = 0; i < N; i++) { // int x; cin >> x; A.pb(x); // } // for(int i = 0; i < Q; i++) { // int x; cin >> x; X.pb(x); // cin >> x; V.pb(x); // } // auto answer = countScans(A,X,V); // for(auto x : answer) cout << x << endl; // }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...