只是有点问题求解决,只求分析(解决玄关)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,a[2000000],qz[2000000];
ll jo[2000000];//奇数的奇偶性
ll sumo1[2000000];//偶数数量(从下自上)
ll oj[2000000],oo[2000000],oop[2000000],ojj[2000000];//上一个奇数,下一个偶数 ,上一个偶数
bool cmp(ll x,ll y){
return x>y;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
qz[i]+=a[i]+qz[i-1];
if(a[i]%2==1){
jo[i]=jo[i-1]^1;
oj[i]=a[i];
oop[i]=oop[i-1];
}
else{
jo[i]=jo[i-1];
oj[i]=oj[i-1];
oop[i]=a[i];
}
}
for(int i=n;i>=1;i--){
if(a[i]%2==0){
oo[i]=a[i];
sumo1[i-1]=sumo1[i]+1;//就是说,如果sumo[i]<2则不成立
ojj[i-1]=ojj[i];
}
else{
oo[i]=oo[i+1];
ojj[i-1]=a[i];
sumo1[i-1]=sumo1[i];
}
}
ll m,x;
cin>>m;
for(int i=1;i<=m;i++){
cin>>x;
ll ans=qz[x];
if(jo[x]==1){
cout<<ans<<endl;
}
else{
ll s=-1e9,ss=-1e9;
if(sumo1[x]>=2&&oj[x]){
s=0;
s+=oo[x]+oo[oo[x]+1];
s-=oj[x];
}
if(oop[x]&&ojj[x]){//上面有偶数,下面有奇数
ss=0;
ss-=oop[x];
ss+=ojj[x];
}
ll rp=max(s,ss);
if(s<-100&&ss<-100){//here
cout<<-1<<endl;
}
else{
cout<<ans+max(s,ss)<<endl;
}//to here
}
}
}
如果注释掉
if(s<-100&&ss<-100){
cout<<-1<<endl;
}
else{
cout<<ans+max(s,ss)<<endl;
}
就不会RE
求分析为什么