제출 #1125463

#제출 시각아이디문제언어결과실행 시간메모리
1125463ntdaccodeBubble Sort 2 (JOI18_bubblesort2)C++17
60 / 100
9090 ms13200 KiB
#include<bits/stdc++.h> #define fori(i,a,b) for(int i=a;i<=b;i++) #define pb push_back using namespace std; typedef pair<int,int> ii; typedef tuple<int,int,int> tp; const int M = 5e5 + 10; const int SIZE = 500; int n, q, a[M], uu[M], vv[M]; int f[M]; vector<ii> rrh[SIZE + 10]; int id(int i) { return (i + SIZE - 1)/SIZE; } int get_cnt(int val,int pos) { int ret = 0; int bl = id(pos); int l = (bl - 1) * SIZE + 1; for(int i = 1;i <= bl - 1; i++) { ii tmp = {val,pos}; ret += rrh[i].size() - (upper_bound(rrh[i].begin(), rrh[i].end(), tmp) - rrh[i].begin() ); } for(int i = l;i <= pos - 1; i++) { if(a[i] > val) ret++; } return ret; } int t[SIZE + 10][4 * SIZE + 40],lz[SIZE + 10][4 * SIZE + 40]; void build(int block, int s, int l, int r) { if(l == r) { t[block][s] = f[rrh[block][l].second]; return ; } int mid = (l + r)/2; build(block, s * 2, l, mid); build(block, s * 2 + 1, mid + 1, r); t[block][s] = max(t[block][s * 2], t[block][s * 2 + 1]); } void lazy(int block,int s) { t[block][s * 2] += lz[block][s]; t[block][s * 2 + 1] += lz[block][s]; lz[block][s * 2] += lz[block][s]; lz[block][s * 2 + 1] += lz[block][s]; lz[block][s] = 0; return ; } void upd(int block, int s, int l, int r, int u, int v, int val) { if(l > v || r < u) return ; if(u <= l && r <= v) { t[block][s] += val; lz[block][s] += val; return ; } int mid = (l + r)/2; if(l != r && lz[block][s] != 0) lazy(block,s); upd(block, s * 2, l, mid, u, v, val); upd(block, s * 2 + 1, mid + 1, r, u, v, val); t[block][s] = max(t[block][s * 2], t[block][s * 2 + 1]); } void get(int block, int s, int l, int r) { if(l == r) { f[rrh[block][l].second] = t[block][s]; return ; } int mid = (l + r)/2; if(l != r && lz[block][s] != 0) lazy(block,s); get(block, s * 2, l, mid); get(block, s * 2 + 1, mid + 1, r); } vector<int> countScans(vector<int> A, vector<int> X, vector<int> V) { n = A.size(); q = X.size(); vector<int> ans; cin >> n >> q; for(int i = 1;i <= n; i++) { a[i] = A[i - 1]; } for(int i = 1;i <= q; i++) { uu[i] = X[i - 1]; vv[i] = V[i - 1]; uu[i]++; } for(int i = 1;i <= n; i++) { rrh[id(i)].pb({a[i],i}); } for(int i = 1;i <= id(n); i++) { sort(rrh[i].begin(), rrh[i].end()); } // tim f for(int i = 1;i <= n; i++) f[i] = get_cnt(a[i],i); for(int i = 1;i <= id(n); i++) { build(i,1,0,rrh[i].size() - 1); } for(int i = 1;i <= q; i++) { int bl = id(uu[i]); // upd != block for(int j = bl + 1; j <= id(n); j++) { ii tmp = {a[uu[i]],0}; int u = lower_bound(rrh[j].begin(), rrh[j].end(), tmp) - rrh[j].begin() - 1; int sz = rrh[j].size(); if(u != -1) upd(j, 1, 0, sz - 1, 0, min(u, sz - 1), -1); tmp = {vv[i], 0}; u = lower_bound(rrh[j].begin(), rrh[j].end(), tmp) - rrh[j].begin() - 1; //cout << u << " "; if(u != -1) upd(j, 1, 0, sz - 1, 0, min(u, sz - 1), 1); } // upd == block get(bl,1,0,rrh[bl].size() - 1); int l = (bl - 1) * SIZE + 1; int r = min(n,bl * SIZE); for(int j = uu[i] + 1;j <= r; j++) f[j] = f[j] - (a[j] < a[uu[i]]) + (a[j] < vv[i]); f[uu[i]] = get_cnt(vv[i], uu[i]); a[uu[i]] = vv[i]; for(int j = l; j <= r; j++) rrh[bl][j - l] = {a[j],j}; sort(rrh[bl].begin(), rrh[bl].end()); build(bl,1,0,rrh[bl].size() - 1); // get kq int kq = 0; for(int i = 1;i <= id(n); i++) kq = max(kq, t[i][1]); ans.pb(kq); } 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...