#include <cstdio>
#include <map>
using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n) FOR(i,0,n)
#define VAR(v,w) __typeof(w) v=(w)
#define SD second
#define INT(x) int x; scanf("%d", &x)
#define LLG(x) LL x; scanf("%lld", &x)
typedef long long LL;
int main() {
INT(n);
LL sb = 0;
int cb = 0;
map<LL, int> m;
REP(i,n) {
LLG(a);
if (!i) {
m[a] = 0;
continue;
}
VAR(it,m.lower_bound(-sb));
bool found = it != m.end();
int ic = 0;
if (found) ic = it->SD + cb;
++cb;
sb += a;
if (!found) continue;
LL x = a - sb;
int y = ic - cb;
VAR(jt,m.lower_bound(x));
if (jt == m.end()) continue;
if (jt->SD <= y) continue;
m[x] = y;
for (;;) {
VAR(kt,m.find(x));
if (kt == m.begin()) break;
--kt;
if (kt->SD < y) break;
m.erase(kt);
}
}
VAR(it,m.lower_bound(-sb));
if (it != m.end()) printf("%d\n", it->SD + cb);
else printf("-1\n");
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <cstdio> #include <map> using namespace std; #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define REP(i,n) FOR(i,0,n) #define VAR(v,w) __typeof(w) v=(w) #define SD second #define INT(x) int x; scanf("%d", &x) #define LLG(x) LL x; scanf("%lld", &x) typedef long long LL; int main() { INT(n); LL sb = 0; int cb = 0; map<LL, int> m; REP(i,n) { LLG(a); if (!i) { m[a] = 0; continue; } VAR(it,m.lower_bound(-sb)); bool found = it != m.end(); int ic = 0; if (found) ic = it->SD + cb; ++cb; sb += a; if (!found) continue; LL x = a - sb; int y = ic - cb; VAR(jt,m.lower_bound(x)); if (jt == m.end()) continue; if (jt->SD <= y) continue; m[x] = y; for (;;) { VAR(kt,m.find(x)); if (kt == m.begin()) break; --kt; if (kt->SD < y) break; m.erase(kt); } } VAR(it,m.lower_bound(-sb)); if (it != m.end()) printf("%d\n", it->SD + cb); else printf("-1\n"); } |
English