我代码内存开 1e6_10 过了,开2e6+5 过不了,是什么原因啊?调了我1小时。
AC代码:
#include <bits/stdc++.h>
#define int long long
#define val first
#define id second
using namespace std;
typedef pair<int,int> PII;
const int N=1e6+10; //就这!
int n,m;
struct node {
int l,r,val;
}a[N];
int tot,cnt,sum;
bool vis[N];
priority_queue<PII,vector<PII>,greater<PII> > q;
signed main() {
scanf("%lld%lld",&n,&m);
int f=-1;
for(int i=1;i<=n;i++) {
int x;
scanf("%lld",&x);
if((x>0)!=f) {
a[++tot].val+=x;
f=(x>0);
}
else a[tot].val+=x;
}
for(int i=1;i<=tot;i++) {
a[i].l=i-1;
a[i].r=i+1;
if(a[i].val>0) sum+=a[i].val,cnt++;
q.push({abs(a[i].val),i});
}
if(cnt<=m) {
printf("%lld",sum);
return 0;
}
a[0].l=-1;a[0].r=1;
a[tot+1].l=tot;a[tot+1].r=tot+2;
while(!q.empty()&&cnt>m) {
auto h=q.top();
q.pop();
if(vis[h.id]) continue;
if(a[h.id].val>0||(a[h.id].l>0&&a[h.id].r<tot+1)) {
sum-=h.val;
a[h.id].val+=a[a[h.id].l].val+a[a[h.id].r].val;
vis[a[h.id].l]=vis[a[h.id].r]=1;
a[h.id].l=a[a[h.id].l].l;
a[h.id].r=a[a[h.id].r].r;
a[a[h.id].r].l=h.id;
a[a[h.id].l].r=h.id;
q.push({abs(a[h.id].val),h.id});
cnt--;
}
}
printf("%lld",sum);
return 0;
}
WA代码:
#include <bits/stdc++.h>
#define int long long
#define val first
#define id second
using namespace std;
typedef pair<int,int> PII;
const int N=2e6+5; //就这!
int n,m;
struct node {
int l,r,val;
}a[N];
int tot,cnt,sum;
bool vis[N];
priority_queue<PII,vector<PII>,greater<PII> > q;
signed main() {
scanf("%lld%lld",&n,&m);
int f=-1;
for(int i=1;i<=n;i++) {
int x;
scanf("%lld",&x);
if((x>0)!=f) {
a[++tot].val+=x;
f=(x>0);
}
else a[tot].val+=x;
}
for(int i=1;i<=tot;i++) {
a[i].l=i-1;
a[i].r=i+1;
if(a[i].val>0) sum+=a[i].val,cnt++;
q.push({abs(a[i].val),i});
}
if(cnt<=m) {
printf("%lld",sum);
return 0;
}
a[0].l=-1;a[0].r=1;
a[tot+1].l=tot;a[tot+1].r=tot+2;
while(!q.empty()&&cnt>m) {
auto h=q.top();
q.pop();
if(vis[h.id]) continue;
if(a[h.id].val>0||(a[h.id].l>0&&a[h.id].r<tot+1)) {
sum-=h.val;
a[h.id].val+=a[a[h.id].l].val+a[a[h.id].r].val;
vis[a[h.id].l]=vis[a[h.id].r]=1;
a[h.id].l=a[a[h.id].l].l;
a[h.id].r=a[a[h.id].r].r;
a[a[h.id].r].l=h.id;
a[a[h.id].l].r=h.id;
q.push({abs(a[h.id].val),h.id});
cnt--;
}
}
printf("%lld",sum);
return 0;
}