Submission #607493

#TimeUsernameProblemLanguageResultExecution timeMemory
607493PietraGlobal Warming (CEOI18_glo)C++14
0 / 100
2070 ms9608 KiB
#include<bits/stdc++.h> #define int long long #define esq (2*no) #define dir ((2*no)+1) #define meio ((i+j)>>1) using namespace std ; const int maxn = 2e5 + 5 ; int n, x, v[maxn], tree[4*maxn] ; vector<int> vec ; struct SEG{ void build(int no, int i, int j){ if(i == j){ tree[no] = 0 ; return ; } build(esq, i, meio), build(dir, meio + 1, j) ; tree[no] = 0 ; } int query(int no, int i, int j, int l, int r){ if(l > j || r < i) return 0 ; if(r >= j && l <= i) return tree[no] ; return max(query(esq, i, meio, l, r), query(dir, meio + 1, j, l, r)) ; } void upd(int no, int i, int j, int pos, int val){ if(i == j){ tree[no] = max(tree[no], val) ; return ; } if(pos <= meio) upd(esq, i, meio, pos, val) ; else upd(dir, meio + 1, j, pos, val) ; tree[no] = max(tree[esq], tree[dir]) ; } } Seg ; void solve_1(){ int ans = 0 ; for(int i = 1 ; i <= n ; i++){ ans = max(ans, Seg.query(1, 1, n+x+x+2, 1, v[i] - 1)) ; Seg.upd(1, 1, n+x+x+2, v[i], ans + 1) ; } ans = max(ans, Seg.query(1, 1, n+x+x+2, 1, n)) ; cout << ans << "\n" ; } int try_val(int l, int r, int val){ // cout << l << " " << r << " " << val << "\n" ; for(int i = l ; i <= r ; i++) v[i] += val ; Seg.build(1, 1, n+x+x+2) ; int ans = 0 ; for(int i = 1 ; i <= n ; i++){ ans = max(ans, Seg.query(1, 1, n+x+x+2, 1, v[i] - 1)) ; Seg.upd(1, 1, n+x+x+2, v[i], ans + 1) ; } ans = max(ans, Seg.query(1, 1, n+x+x+2, 1, n)) ; for(int i = l ; i <= r ; i++) v[i] -= val ; return ans ; } void solve_2(){ for(int i = 1 ; i <= n ; i++) v[i] += (x+1) ; int ans = try_val(1, n, 0) ; for(int i = 1 ; i <= x ; i++){ // add for(int l = 1 ; l <= n ; l++){ for(int r = l ; r <= n ; r++){ ans = max(ans, try_val(l, r, i)) ; ans = max(ans, try_val(l, r, -i)) ; } } } cout << ans << "\n" ; } int32_t main(){ ios_base::sync_with_stdio(false) ; cin.tie(NULL) ; cin >> n >> x ; for(int i = 1 ; i <= n ; i++){ cin >> v[i] ; vec.push_back(v[i]) ; } sort(vec.begin(), vec.end()) ; vec.erase(unique(vec.begin(), vec.end()), vec.end()) ; for(int i = 1 ; i <= n ; i++) v[i] = lower_bound(vec.begin(), vec.end(), v[i]) - vec.begin() + 1 ; if(x == 0) solve_1() ; else solve_2() ; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...