最后一个测试点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 你的程序在处理边界问题时出现了一些错误。你应该注意到数组的下标范围是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]