제출 #551180

#제출 시각아이디문제언어결과실행 시간메모리
551180tht2005Financial Report (JOI21_financial)C++17
100 / 100
301 ms17328 KiB
#include <bits/stdc++.h> using namespace std; const int N = 300005; struct sgt { int st[N << 2]; sgt() { memset(st, 0, sizeof(st)); } void build(int x, int l, int r, int* a) { if(l == r) { st[x] = a[l]; } else { int m = (l + r) >> 1; build(x << 1, l, m, a); build(x << 1 | 1, m + 1, r, a); st[x] = max(st[x << 1], st[x << 1 | 1]); } } void update(int x, int l, int r, int i, int d) { if(l == r) { if(st[x] < d) { st[x] = d; } } else { int m = (l + r) >> 1; if(i > m) update(x << 1 | 1, m + 1, r, i, d); else update(x << 1, l, m, i, d); st[x] = max(st[x << 1], st[x << 1 | 1]); } } int query(int x, int l, int r, int ql, int qr) { if(r < ql || qr < l) return 0; if(ql <= l && r <= qr) return st[x]; int m = (l + r) >> 1; return max(query(x << 1, l, m, ql, qr), query(x << 1 | 1, m + 1, r, ql, qr)); } int bs(int x, int l, int r, int ql, int qr, int d) { if(r < ql || qr < l || st[x] < d) return 0; if(l == r) return l; int m = (l + r) >> 1; if(ql <= l && r <= qr) { if(st[x << 1 | 1] >= d) return bs(x << 1 | 1, m + 1, r, ql, qr, d); return bs(x << 1, l, m, ql, qr, d); } int _ = bs(x << 1 | 1, m + 1, r, ql, qr, d); return _ ? _ : bs(x << 1, l, m, ql, qr, d); } } f, g; int n, d, a[N], b[N], idx[N]; deque<int> _; int main() { scanf("%d %d", &n, &d); for(int i = 0; i < n; ++i) { scanf("%d", a + i); } for(int i = 0; i < n; ++i) { while(!_.empty() && a[i] < _.back()) _.pop_back(); _.push_back(a[i]); if(i + 1 >= d) { b[i - d + 1] = _.front(); if(_.front() == a[i - d + 1]) _.pop_front(); } } for(int i = n - d + 1; i < n; ++i) { b[i] = 2e9; } g.build(1, 0, n - 1, b); iota(idx, idx + n, 0); sort(idx, idx + n, [&](int i, int j) { if(a[i] != a[j]) return a[i] < a[j]; return i > j; }); for(int x = 0; x < n; ++x) { int i = idx[x], L = (i < d) ? 0 : g.bs(1, 0, n - 1, 0, i - d, a[i]); f.update(1, 0, n - 1, i, (i ? f.query(1, 0, n - 1, L, i - 1) : 0) + 1); } printf("%d", f.st[1]); return 0; }

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

Main.cpp: In function 'int main()':
Main.cpp:59:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   59 |     scanf("%d %d", &n, &d);
      |     ~~~~~^~~~~~~~~~~~~~~~~
Main.cpp:61:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   61 |         scanf("%d", a + i);
      |         ~~~~~^~~~~~~~~~~~~
#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...