제출 #1278177

#제출 시각아이디문제언어결과실행 시간메모리
1278177wedonttalkanymoreFinancial Report (JOI21_financial)C++20
48 / 100
22 ms9332 KiB
#include <bits/stdc++.h> /* 10 mins AC -> 40 mins subtasks + code */ using namespace std; using ll = long long; #define int long long #define pii pair<ll, ll> #define fi first #define se second const ll N = 2e5 + 5, inf = 1e18, mod = 1e9 + 7, block = 320, lim = 19; int n, D, a[N]; int Min[N]; int Right[N]; int dp[N]; // xet den i va se dat ki luc tai i pii pos[N]; namespace SPT { int st[N][lim + 1]; int lg[N]; void preprocess() { for (int i = 1; i <= n; i++) st[i][0] = a[i]; for (int i = 2; i <= n; i++) lg[i] = lg[i / 2] + 1; for (int i = 1; i <= lim; i++) { for (int j = 1; j + (1 << i) - 1 <= n; j++) { st[j][i] = min(st[j][i - 1], st[j + (1 << (i - 1))][i - 1]); } } } int get(int l, int r) { if (l > r) return 0; int k = lg[r - l + 1]; return min(st[l][k], st[r - (1 << k) + 1][k]); } }; namespace SPT2 { int st[N][lim + 1]; int lg[N]; void preprocess() { for (int i = 1; i <= n; i++) st[i][0] = Min[i]; for (int i = 2; i <= n; i++) lg[i] = lg[i / 2] + 1; for (int i = 1; i <= lim; i++) { for (int j = 1; j + (1 << i) - 1 <= n; j++) { st[j][i] = max(st[j][i - 1], st[j + (1 << (i - 1))][i - 1]); } } } int get(int l, int r) { if (l > r) return 0; int k = lg[r - l + 1]; return max(st[l][k], st[r - (1 << k) + 1][k]); } }; struct ST { vector <int> st; ST(int _n) { st.assign(4 * (_n + 1), 0); } void update(int i, int l, int r, int pos, int val) { if (l == r) { st[i] = val; return; } int mid = (l + r) / 2; if (pos <= mid) update(2 * i, l, mid, pos, val); else update(2 * i + 1, mid + 1, r, pos, val); st[i] = max(st[2 * i], st[2 * i + 1]); } int get(int i, int l, int r, int u, int v) { if (u > r || v < l) return 0; if (u <= l && r <= v) return st[i]; int mid = (l + r) / 2; return max(get(2 * i, l, mid, u, v), get(2 * i + 1, mid + 1, r, u, v)); } } st(N); signed main() { ios::sync_with_stdio(false); cin.tie(0); if (fopen(".inp", "r")) { freopen(".inp", "r", stdin); freopen(".out", "w", stdout); } cin >> n >> D; for (int i = 1; i <= n; i++) cin >> a[i]; SPT::preprocess(); for (int i = D; i <= n; i++) Min[i] = SPT::get(i - D + 1, i); SPT2::preprocess(); for (int i = 1; i <= n; i++) { int l = i + 1, r = n, ans = n + 1; while(l <= r) { int mid = (l + r) / 2; int wl = i + D; int wr = mid - 1; bool exist = false; if (wl <= wr) { if (SPT2::get(wl, wr) > a[i]) exist = true; } if (exist) { ans = mid; r = mid - 1; } else l = mid + 1; } Right[i] = ans - 1; } for (int i = 1; i <= n; i++) { pos[i] = make_pair(a[i], i); } sort(pos + 1, pos + n + 1); int idx = n; int ans = 0; while (idx >= 1) { int val = pos[idx].first; vector<int> grp; while (idx >= 1 && pos[idx].first == val) { grp.push_back(pos[idx].second); idx--; } for (int v : grp) { int ql = v, qr = Right[v]; int best = st.get(1, 1, n, ql, qr); dp[v] = best + 1; ans = max(ans, dp[v]); } for (int v : grp) st.update(1, 1, n, v, dp[v]); } cout << ans << '\n'; return 0; }

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

Main.cpp: In function 'int main()':
Main.cpp:86:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   86 |         freopen(".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~
Main.cpp:87:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   87 |         freopen(".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~
#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...