为什么要开 long long?
赛后把 find 函数和 solve 函数 改为如下,能AC。
ll find(ll w,ll l,ll r)
{
ll mid=l+r>>1;
while(l<=r)
{
mid=l+r>>1;
if(b[mid]+a[w]<=p) l=mid+1;
else r=mid-1;
}
return l;
}
void solve()
{
for(ll i=1;i<=n;i++)
{
//cout<<i;putchar(' ');
ll t=find(i,1,m);
//cout<<t<<" ";
t--;
//cout<<t<<" ";
int128 s=0;
//s=s+sum2[t]+(m-t+1)*p;
s=s+sum2[t]+t*a[i];
//qp(s);putchar(' ');
s=s+(m-t)*p;
ans+=s;
//qp(s);putchar(' ');
//qp(ans);putchar(' ');
//cout<<endl;
}
}
```cpp
或者把全部`int` 改为 `long long` 也能AC。
[题目链接](https://www.luogu.com.cn/problem/AT_abc321_d)
文操和 $O(2)$ 请忽略。
赛时代码和 AC 代码如下。
赛时代码:
```cpp
//yqz
#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#define int128 __int128
#define MAXN 200010
#define ll long long
using namespace std;
int n,m,p;
int a[MAXN],b[MAXN];
int128 ans;
int128 sum1[MAXN],sum2[MAXN];
int qread()
{
int sum=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
sum=(sum<<1)+(sum<<3)+ch-48;
ch=getchar();
}
return sum*f;
}
void qprint(int128 x)
{
if(x>9) qprint(x/10);
putchar(x%10+48);
return;
}
void qp(int128 x)
{
if(x<0) putchar('-'),x=-x;
qprint(x);
return;
}
int find(int w,int l,int r)
{
int mid=l+r>>1;
while(l<=r)
{
mid=l+r>>1;
if(b[mid]+a[w]<=p) l=mid+1;
else r=mid-1;
}
return l;
}
void solve()
{
for(int i=1;i<=n;i++)
{
//cout<<i;putchar(' ');
int t=find(i,1,m);
//cout<<t<<" ";
t--;
//cout<<t<<" ";
int128 s=0;
//s=s+sum2[t]+(m-t+1)*p;
s=s+sum2[t]+t*a[i];
//qp(s);putchar(' ');
s=s+(m-t)*p;
ans+=s;
//qp(s);putchar(' ');
//qp(ans);putchar(' ');
//cout<<endl;
}
}
int main()
{
freopen("menu.in","r",stdin);
freopen("menu.out","w",stdout);
n=qread();
m=qread();
p=qread();
for(int i=1;i<=n;i++) a[i]=qread();
for(int i=1;i<=m;i++) b[i]=qread();
stable_sort(a+1,a+1+n);
//sort
stable_sort(b+1,b+1+m);
for(int i=1;i<=n;i++) sum1[i]=sum1[i-1]+a[i];
for(int i=1;i<=m;i++) sum2[i]=sum2[i-1]+b[i];
//for(int i=1;i<=n;i++) cout<<a[i]<<" ";cout<<endl;
//for(int i=1;i<=m;i++) cout<<b[i]<<" ";cout<<endl;
//for(int i=1;i<=n;i++) qp(sum1[i]),putchar(' ');putchar('\n');
//for(int i=1;i<=m;i++) qp(sum2[i]),putchar(' ');putchar('\n');
solve();
qp(ans);
putchar('\n');
return 0;
}
AC代码:
//yqz
#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#define int128 __int128
#define MAXN 200010
#define ll long long
#define int long long
using namespace std;
int n,m,p;
int a[MAXN],b[MAXN];
int128 ans;
int128 sum1[MAXN],sum2[MAXN];
int qread()
{
int sum=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
sum=(sum<<1)+(sum<<3)+ch-48;
ch=getchar();
}
return sum*f;
}
void qprint(int128 x)
{
if(x>9) qprint(x/10);
putchar(x%10+48);
return;
}
void qp(int128 x)
{
if(x<0) putchar('-'),x=-x;
qprint(x);
return;
}
int find(int w,int l,int r)
{
int mid=l+r>>1;
int fd=p-a[w];
while(l<=r)
{
mid=l+r>>1;
if(b[mid]<fd) l=mid+1;
else r=mid-1;
}
return l;
}
void solve()
{
for(int i=1;i<=n;i++)
{
int t=find(i,1,m);
t--;
int128 s=0;
ans=ans+sum2[t]+t*a[i];
ans=ans+(m-t)*p;
}
}
signed main()
{
//freopen("menu.in","r",stdin);
//freopen("menu.out","w",stdout);
n=qread();
m=qread();
p=qread();
for(int i=1;i<=n;i++) a[i]=qread();
for(int i=1;i<=m;i++) b[i]=qread();
stable_sort(a+1,a+1+n);
stable_sort(b+1,b+1+m);
for(int i=1;i<=m;i++) sum2[i]=sum2[i-1]+b[i];
solve();
qp(ans);
putchar('\n');
return 0;
}