Submission #825133

#TimeUsernameProblemLanguageResultExecution timeMemory
825133PixelCatRadio Towers (IOI22_towers)C++17
14 / 100
662 ms2256 KiB
#include "towers.h" #ifdef NYAOWO #include "stub.cpp" #endif #include <bits/stdc++.h> #define For(i, a, b) for(int i = a; i <= b; i++) #define Forr(i, a, b) for(int i = a; i >= b; i--) #define F first #define S second #define all(x) x.begin(), x.end() #define sz(x) ((int)x.size()) #define eb emplace_back // #define int LL using namespace std; using i32 = int32_t; using LL = long long; using pii = pair<int, int>; inline void chmax(int &x, int val) { x = max(x, val); } const int MAXN = 100'000; // #define L(id) ((id) * 2 + 1) // #define R(id) ((id) * 2 + 2) // struct SegTree { // int mx[MAXN * 4 + 10]; // void build() { // memset(mx, 0, sizeof(mx)); // } // void upd(int id, int l, int r, int pos, int val) { // if(l == r) { // chmax(mx[id], val); // return; // } // int m = (l + r) / 2; // if(pos <= m) upd(L(id), l, m, pos, val); // else upd(R(id), m + 1, r, pos, val); // mx[id] = max(mx[L(id)], mx[R(id)]); // } // int range_max(int id, int l, int r, int L, int R) { // if(L > R) return 0; // if(l >= L && r <= R) { // return mx[id]; // } // int m = (l + r) / 2; // int res = 0; // if(L <= m) chmax(res, range_max(L(id), l, m, L, R)); // if(R > m) chmax(res, range_max(R(id), m + 1, r, L, R)); // return res; // } // } dp1, dp2; #define LO(x) ((x) & (-(x))) struct BIT { int n; int a[MAXN + 10]; void init(int _n) { n = _n; memset(a, 0, sizeof(a)); } void add(int i, int x) { while(i <= n) { a[i] += x; i += LO(i); } } int sum(int i) { int res = 0; while(i) { res += a[i]; i -= LO(i); } return res; } } bit; int n; int h[MAXN + 10]; int vals[MAXN + 10]; void init(int N, std::vector<int> H) { n = N; For(i, 0, n - 1) { h[i] = H[i]; vals[i] = h[i]; } sort(vals, vals + n); bit.init(n); For(i, 1, n - 2) { if(h[i] < h[i - 1] && h[i] < h[i + 1]) { bit.add(i, 1); } } } int max_towers(int L, int R, int D) { if(L + 1 >= R) return 1; int ans = bit.sum(R - 1) - bit.sum(L); if(h[L] < h[L + 1]) ans++; if(h[R] < h[R - 1]) ans++; return ans; // int ans = 0; // dp1.build(); // dp2.build(); // For(i, L, R) { // int p = (int)(lower_bound(vals, vals + n, h[i]) - vals); // int l = (int)(upper_bound(vals, vals + n, h[i] - D) - vals) - 1; // int r = (int)(lower_bound(vals, vals + n, h[i] + D) - vals); // int v1 = dp2.range_max(0, 0, n - 1, r, n - 1) + 1; // int v2 = dp1.range_max(0, 0, n - 1, 0, l); // dp1.upd(0, 0, n - 1, p, v1); // dp2.upd(0, 0, n - 1, p, v2); // chmax(ans, v1); // } // return ans; } /* 7 3 10 20 60 40 50 30 70 1 5 10 2 2 100 0 6 17 3 1 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...