제출 #114609

#제출 시각아이디문제언어결과실행 시간메모리
114609FutymyCloneMoney (IZhO17_money)C++14
0 / 100
26 ms31616 KiB
#include <bits/stdc++.h> using namespace std; const int N = 1e6 + 5; int n, a[N], nxt[N]; stack <int> st; struct SegmentTree { int node[N << 2], lazy[N << 2]; void init(){ memset(node, 0, sizeof(node)); memset(lazy, 0, sizeof(lazy)); } void dolazy (int i, int l, int r) { if (lazy[i]) { node[i] += lazy[i] * (r - l + 1); node[i] = min(node[i], r - l + 1); if (l != r) { lazy[i << 1] += lazy[i]; lazy[i << 1 | 1] += lazy[i]; } lazy[i] = 0; } } void update (int i, int l, int r, int a, int b) { dolazy(i, l, r); if (l > r || a > r || b < l) return; if (a <= l && r <= b) { node[i] += (r - l + 1); node[i] = min(node[i], r - l + 1); if (l != r) { lazy[i << 1]++; lazy[i << 1 | 1]++; } return; } int mid = (l + r) >> 1; update(i << 1, l, mid, a, b); update(i << 1 | 1, mid + 1, r, a, b); node[i] = node[i << 1] + node[i << 1 | 1]; } int query (int i, int l, int r, int a, int b) { if (l > r || a > r || b < l) return 0; dolazy(i, l, r); if (a <= l && r <= b) return node[i]; int mid = (l + r) >> 1; return query(i << 1, l, mid, a, b) + query(i << 1 | 1, mid + 1, r, a, b); } } it; int main(){ scanf("%d", &n); it.init(); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i <= n; i++) { if (st.empty() || a[st.top()] <= a[i]) st.push(i); else { while (!st.empty()) nxt[st.top()] = i, st.pop(); st.push(i); } } while (!st.empty()) nxt[st.top()] = n + 1, st.pop(); int cur = 1, ans = 0; while (cur <= n) { int l = cur, r = nxt[cur] - 1; while (l <= r) { int mid = (l + r) / 2; int res = it.query(1, 1, N, a[cur], a[mid]); if (res == 0 || res == a[mid] - a[cur] + 1) l = mid + 1; else r = mid - 1; } ans++; it.update(1, 1, N, a[cur], a[r]); cur = l; } printf("%d", ans); return 0; }

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

money.cpp: In function 'int main()':
money.cpp:59:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &n); it.init();
     ~~~~~^~~~~~~~~~
money.cpp:60:39: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for (int i = 1; i <= n; i++) 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...