比赛 |
20160412 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
非负的部分和 |
最终得分 |
100 |
用户昵称 |
Fmuckss |
运行时间 |
0.608 s |
代码语言 |
C++ |
内存使用 |
15.57 MiB |
提交时间 |
2016-04-12 10:55:46 |
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 1e6+10;
int n;
struct node {
int c;
int la, ne;
bool ex;
}ns[maxn];
int tot;
void read() {
scanf("%d", &n);
tot = n;
for(int i = 1; i <= n; i++) {
scanf("%d", &ns[i].c);
ns[i].la = i-1;
ns[i].ne = i+1;
ns[i].ex = true;
}
ns[1].la = n;
ns[n].ne = 1;
}
void out() {
for(int i = 1; i <= n; i++) {
if(ns[i].ex) {
printf("%d ", ns[i].c);
}
}
printf("\n");
}
void merge(int now) {
for(int i = ns[now].la; i != now; i = ns[i].la) {
if(ns[now].c + ns[i].c < 0) {
ns[i].ex = false;
ns[now].c += ns[i].c;
ns[ns[i].la].ne = now;
ns[now].la = ns[i].la;
tot--;
} else {
ns[i].ex = false;
ns[now].c += ns[i].c;
ns[ns[i].la].ne = now;
ns[now].la = ns[i].la;
tot--;
break;
}
}
}
void solve() {
int now = 1;
while(true) {
bool b = false;
int cnt = 0;
for(;;now = ns[now].ne) {
cnt++;
if(ns[now].c < 0) {
merge(now);
if(tot == 1) b = true;//全是负的了...
// out();
break;
}
if(cnt == tot) {//没有负的了
b = true;
break;
}
}
if(b) break;
}
int cnt = 0;
for(int i = 1; i <= n; i++) {
if(ns[i].ex && ns[i].c >= 0) cnt++;
}
printf("%d", cnt);
}
int main() {
freopen("sumc.in", "r", stdin);
freopen("sumc.out", "w", stdout);
read();
solve();
return 0;
}