제출 #539057

#제출 시각아이디문제언어결과실행 시간메모리
539057kianaRZVFinancial Report (JOI21_financial)C++14
100 / 100
725 ms39828 KiB
#include<bits/stdc++.h> #define int long long using namespace std; const int maxn = 3e5 + 10, mod = 1e9 + 7; int n, d; int a[maxn], l[maxn], r[maxn], dp[maxn], seg[maxn << 2]; struct query{ int val, id; }q[maxn]; set <int> st, have; bool cmp(query a, query b) { if (a.val != b.val) return a.val < b.val; return a.id > b.id; } void add(int id, int l, int r, int pos, int x) { if (l > pos || r <= pos) return; if (r - l < 2) { seg[id] = x; return; } int mid = l + r >> 1; add(2 * id + 1, l, mid, pos, x); add(2 * id + 2, mid, r, pos, x); seg[id] = max(seg[2 * id + 1], seg[2 * id + 2]); } int get(int id, int l, int r, int ql, int qr) { if (l >= qr || ql >= r) return 0; if (ql <= l && r <= qr) return seg[id]; int mid = l + r >> 1; return max(get(2 * id + 1, l, mid, ql, qr), get(2 * id + 2, mid, r, ql, qr)); } void L(int id) { if (~l[id]) r[l[id]] = id; } void R(int id) { if (r[id] != n) { l[r[id]] = id; if (r[id] - id <= d) st.erase(r[id]); } } void read_input() { cin >> n >> d; for (int i = 0; i < n; i++) { cin >> a[i]; q[i] = {a[i], i}; } } void solve() { int ans = 0; sort(q, q + n, cmp); have.insert(-1), have.insert(n); for (int i = 0; i < n; i++) { int id = q[i].id; dp[id] = 1; auto it = have.lower_bound(id); r[id] = *it, it--, l[id] = *it; have.insert(id); R(id), L(id); if (id - l[id] > d) st.insert(id); if (id) { it = st.upper_bound(id); if (it == st.begin()) dp[id] = max(dp[id], get(0, 0, n, 0, id) + 1); else { it--; int loc = max(*it, 0ll); if (loc ^ id) dp[id] = max(dp[id], get(0, 0, n, loc, id) + 1); } } add(0, 0, n, id, dp[id]); ans = max(ans, dp[id]); } cout << ans; } int32_t main() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); read_input(), solve(); }

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'void add(long long int, long long int, long long int, long long int, long long int)':
Main.cpp:26:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   26 |     int mid = l + r >> 1;
      |               ~~^~~
Main.cpp: In function 'long long int get(long long int, long long int, long long int, long long int, long long int)':
Main.cpp:37:17: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   37 |     int mid = l + r >> 1;
      |               ~~^~~
#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...