FencedIn

FencedIn_第1张图片
FencedIn_第2张图片

模拟,记录a,b数组的前缀和,如果要求ai~aj的和,就是用a[j]-a[i-1]就可以了

#include
using namespace std;
const int maxn=3e4+5;
long long a[maxn],b[maxn],A[maxn],B[maxn];
long long aa,bb,n,m,ans;
int main()
{
 cin>>aa>>bb>>n>>m;
 n++;m++;
 for(long long i=1;i<n;i++)
  cin>>A[i];
 sort(A+1,A+n);
 A[n]=bb;
 for(long long i=1;i<=n;i++)
  a[i]=A[i]-A[i-1];
 sort(a+1,a+n+1);
 for(long long i=1;i<m;i++)
  cin>>B[i];
 sort(B+1,B+m);
 B[m]=aa;
 for(long long i=1;i<=m;i++)
  b[i]=B[i]-B[i-1];
 sort(b+1,b+m+1);
 long long i=2,j=2;
 ans+=a[1]*(m-1)+b[1]*(n-1);
 while(i<=n&&j<=m)
 {
  if(a[i]<b[j])
   ans+=a[i]*(m-j+1),i++;
  else
   ans+=b[j]*(n-i+1),j++;
 }
 cout<<ans<<endl;
 return 0;
}

你可能感兴趣的:(zr,A)