#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=250000;
ll n,a[N],b[N],vis[N];
struct cmp{
bool operator()(ll x,ll y){
return b[x]<b[y];
}
};
priority_queue<ll,vector<ll>,cmp> pq;
int main(){
scanf("%lld",&n);
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(ll i=1;i<=n;i++){
scanf("%lld",&b[i]);
}
ll sum=0,cnt=0;
for(ll i=1;i<=n;i++){
sum+=a[i];
if(sum>=b[i]){
vis[i]=1;
cnt++;
sum-=b[i];
pq.push(i);
}else if(!pq.empty()&&b[pq.top()]>=b[i]&&sum+b[pq.top()]>=b[i]){
vis[pq.top()]=0;
vis[i]=1;
sum+=b[pq.top()];
sum-=b[i];
pq.pop();
pq.push(i);
}
}
printf("%lld\n",cnt);
for(ll i=1;i<=n;i++){
if(vis[i]) printf("%lld ",i);
}
return 0;
}
这样写会2RE+1WA
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=2500000;
ll n,a[N],b[N],vis[N];
struct cmp{
bool operator()(ll x,ll y){
return b[x]<b[y];
}
};
priority_queue<ll,vector<ll>,cmp> pq;
int main(){
scanf("%lld",&n);
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(ll i=1;i<=n;i++){
scanf("%lld",&b[i]);
}
ll sum=0,cnt=0;
for(ll i=1;i<=n;i++){
sum+=a[i];
if(sum>=b[i]){
vis[i]=1;
cnt++;
sum-=b[i];
pq.push(i);
}else if(!pq.empty()&&b[pq.top()]>=b[i]&&sum+b[pq.top()]>=b[i]){
vis[pq.top()]=0;
vis[i]=1;
sum+=b[pq.top()];
sum-=b[i];
pq.pop();
pq.push(i);
}
}
printf("%lld\n",cnt);
for(ll i=1;i<=n;i++){
if(vis[i]) printf("%lld ",i);
}
return 0;
}
数组开大十倍就AC