http://www.elijahqi.win/archives/1387
#include<cstdio>
#include<algorithm>
#define N 110000
using namespace std;
inline char gc(){
static char now[1<<16],*T,*S;
if (T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;}
return *S++;
}
inline int read(){
int x=0;char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x;
}
struct node{
int in,out,real;
}vect[N<<1];
int n,a[N],b[N],q[N<<1],top,E;
int main(){
// freopen("seal.in","r",stdin);
// freopen("seal.out","w",stdout);
n=read();
for (int i=1;i<=n;++i){
a[i]=read();b[i]=read();q[++top]=a[i];q[++top]=b[i];
}sort(q+1,q+2*n+1);
int nn=unique(q+1,q+2*n+1)-q-1;
for (int i=1;i<=n;++i){
int pos=lower_bound(q+1,q+nn+1,a[i])-q;
vect[pos].real=a[i];vect[pos].in++;
pos=lower_bound(q+1,q+nn+1,b[i])-q;
vect[pos].real=b[i];vect[pos].out++;
}long long ans=0;
for (int i=1;i<=n;++i) ans+=a[i];E=0;
long long ans1=ans;long long sum=0;long long sum_a=ans;
for (int i=1;i<=nn;++i){
sum+=vect[i].in;sum_a-=vect[i].in*vect[i].real;
ans1=vect[i].real*sum+sum_a;
if (ans1>ans){
ans=ans1;E=vect[i].real;
}sum-=vect[i].out;
}
printf("%d %lld",E,ans);
return 0;
}
前缀和加模拟 我们可以知道这个E一定选在右端点答案会更优