제출 #1210311

#제출 시각아이디문제언어결과실행 시간메모리
1210311BoomydayBubble Sort 2 (JOI18_bubblesort2)C++20
0 / 100
19 ms4048 KiB
#include "bubblesort2.h" #include <bits/stdc++.h> using namespace std; using ll = long long; const ll BIG = 1e9; const ll ssz = 1<<3; // 1 << 20 const int INF = 1e9; vector<int> seg_on(2*ssz, 0); vector<int> seg_max(2*ssz, -INF), lz_max(2*ssz, 0); void upd_on(int i, int x){ i += ssz; seg_on[i] = x; i /= 2; while(i >= 1){ seg_on[i] = seg_on[2*i] + seg_on[2*i+1]; i /= 2; } } int quer_on (int l, int r){ l += ssz; r += ssz; int res = 0; while(l <= r){ if(l&1) res += seg_on[l++]; if(!(r&1)) res += seg_on[r--]; l /= 2; r /= 2; } return res; } void pushdown(int rt, int tl, int tr){ seg_max[rt] += lz_max[rt]; if (tl != tr) { lz_max[2*rt] += lz_max[rt]; lz_max[2*rt+1] += lz_max[rt]; } lz_max[rt] = 0; } int query(int l, int r, int rt, int tl, int tr){ pushdown(rt, tl, tr); if (r < tl || l > tr) return -INF; if (l <= tl && tr <= r) return seg_max[rt]; int mid = (tl + tr) / 2; return max(query(l, r, 2*rt, tl, mid), query(l, r, 2*rt+1, mid+1, tr)); } void update(int x, int l, int r, int rt, int tl, int tr){ pushdown(rt, tl, tr); if (r < tl || l > tr) return; if (l <= tl && tr <= r) { lz_max[rt] += x; pushdown(rt, tl, tr); return; } int mid = (tl + tr) / 2; update(x, l, r, 2*rt, tl, mid); update(x, l, r, 2*rt+1, mid+1, tr); seg_max[rt] = max(seg_max[2*rt], seg_max[2*rt+1]); } void point_update(int x, int i){ update(x- query(i, i, 1, 0, ssz-1), i, i, 1, 0, ssz-1); } std::vector<int> countScans(std::vector<int> A,std::vector<int> X,std::vector<int> V){ int Q=X.size(); int N = A.size(); vector<int> S(Q); vector<ll> numvals(N), quervals(Q); for(int i=0;i<N;++i) numvals[i] = A[i]*BIG + i; for(int i=0;i<Q;++i) quervals[i] = V[i]*BIG + X[i]; set<ll> compress; for(int i=0;i<N;++i) compress.insert(numvals[i]); for(int i=0;i<Q;++i) compress.insert(quervals[i]); map<ll, int> compress_map; int idx = 0; for(auto val : compress) { compress_map[val] = idx++; } for(int i=0;i<N;++i) numvals[i] = compress_map[numvals[i]]; for(int i=0;i<Q;++i) quervals[i] = compress_map[quervals[i]]; for(int i=0;i<N;++i) upd_on(numvals[i], 1); // output the full segment tree of segon for(int i=0;i<N;++i){ point_update( i-(quer_on(0, numvals[i])-1), numvals[i]); } /* for(int i=0;i<ssz;++i){ cout << query(i, i, 1, 0, ssz-1) << " "; } cout << endl;*/ // output each value of the segment tree for(int i=0;i<Q;++i){ // newpos = X[i] // turn off the old value upd_on(numvals[X[i]],0); point_update(-INF,numvals[X[i]]); // update values between old and new // old value = numvals[X[i]] // new value = quervals[i] // if it moves from small to big, add one to the elements // else subtract one if (numvals[X[i]] < quervals[i]){ update(1, numvals[X[i]], quervals[i], 1, 0, ssz-1); } else if (numvals[X[i]] > quervals[i]){ update(-1, quervals[i], numvals[X[i]], 1, 0, ssz-1); } // now update numvals numvals[X[i]] = quervals[i]; upd_on(numvals[X[i]], 1); point_update(X[i] - (quer_on(0, numvals[X[i]]) - 1), numvals[X[i]]); // finally, query the value S[i] = query(0, ssz-1, 1, 0, ssz-1); } return S; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...