前缀和(数据预处理,降低查找循环复杂度!)
for(int i=1;i<=nums.length;i++){
sum[i]=sum[i-1]+nums[i];
}在这里插入代码片
sum[l,r]=sum[r]-sum[l-1];
源代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+4;
struct mcase{
int y;
int res;
};
vector<mcase>mtest;
set<int>st;
int nsum[maxn]={0};
int n;
void Init(){
cin>>n;
mcase temp;
temp.y=0;temp.res=0;
mtest.push_back(temp);//索引为0不用
for(int i=0;i<n;i++){
cin>>temp.y>>temp.res;
mtest.push_back(temp);
}
}
bool cmp(mcase a,mcase b){//结构体比较函数
if(a.y<b.y){
return true;
}
return false;
}
int main(){
Init();
int maxsum=0;
int ans=0;
sort(mtest.begin(),mtest.end(),cmp);//将测试数据按照y值排序
for(int i=1;i<=n;i++){//前缀和
nsum[i]=nsum[i-1]+mtest[i].res;
}
for(int i=1;i<=n;i++){
int tempy=mtest[i].y;
if(st.count(tempy)){//若数据重复跳过
continue;
}
else{
st.insert(tempy);
int yucez1=nsum[n]-nsum[i-1];
int yucez0=i-1-nsum[i-1];
int sumyuz=yucez1+yucez0;
if(sumyuz>=maxsum){//大于等于是更新
maxsum=sumyuz;
ans=tempy;
}
}
}
cout<<ans;
return 0;
}在这里插入代码片