【悬关】为什么要开long long
  • 板块学术版
  • 楼主YuYuanPQ
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/12/24 07:56
  • 上次更新2023/12/24 10:58:36
查看原帖
【悬关】为什么要开long long
1029900
YuYuanPQ楼主2023/12/24 07:56

为什么要开 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;
}
2023/12/24 07:56
加载中...