lsmCC 发表于 2023-11-16 21:37:16

最后一个测试点wa了,应该是边界问题,没有确定好,怎么修改

#include <bits/stdc++.h>
using namespace std;
const int N=1e5;
typedef long long ll;
int a,b,c,cnt,s,aa,cc;
ll res;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a,a++;//可以取到0,所以要注意边界问题
    for(int i=1;i<=n;i++)cin>>b,b++;
    for(int i=1;i<=n;i++)cin>>c,c++;
    for(int i=1;i<=n;i++)s]++;
    for(int i=1;i<=N;i++)s+=s;
    for(int i=1;i<=n;i++)aa=s-1];
    memset(s,0,sizeof(s));
    for(int i=1;i<=n;i++)s]++;
    for(int i=1;i<=N;i++)s+=s;
    for(int i=1;i<=n;i++)cc=s-s];
    for(int i=1;i<=n;i++) res+=(ll)aa*cc;
    cout<<res<<endl;
   
}

题目链接:https://www.luogu.com.cn/problem/P8667

isdkz 发表于 2023-11-16 21:37:33

你的程序在处理边界问题时出现了一些错误。你应该注意到数组的下标范围是1到n,而不是0到n-1。此外,你在处理a、b、c数组时应该先将其加1,而不是在输入时加1。这是因为题目中提到了可以取到0,所以在处理时需要注意边界问题。

你可以修改你的代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N=1e5;
typedef long long ll;
int a,b,c,cnt,s,aa,cc;
ll res;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) {
      cin>>a[ i];
      a[ i]++;
    }
    for(int i=1;i<=n;i++) {
      cin>>b[ i];
      b[ i]++;
    }
    for(int i=1;i<=n;i++) {
      cin>>c[ i];
      c[ i]++;
    }
    for(int i=1;i<=n;i++) s]++;
    for(int i=1;i<=N;i++) s[ i]+=s;
    for(int i=1;i<=n;i++) aa[ i]=s-1];
    memset(s,0,sizeof(s));
    for(int i=1;i<=n;i++) s]++;
    for(int i=1;i<=N;i++) s[ i]+=s;
    for(int i=1;i<=n;i++) cc[ i]=s-s];
    for(int i=1;i<=n;i++) res+=(ll)aa[ i]*cc[ i];
    cout<<res<<endl;
}


这样修改后,你的程序应该可以通过最后一个测试点了。
页: [1]
查看完整版本: 最后一个测试点wa了,应该是边界问题,没有确定好,怎么修改