测试数据太水了吧

我这题的样例都没过,我居然AC了

#include <iostream>
#include<algorithm>

using namespace std;

long long a[114514];

int main()
{
	int i,j;
	int n,k;
	long long cnt=0;
	long long p1,p2;
	cin>>n>>k;
	
	i=1,j=n;
	
	
	for (int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+1+n);
	while (j>=i)
	{
		if (a[i]+a[j]>k)
		{
			j--;
		}
		else if (a[i]+a[j]<k)
		{
			i++;
		}
		else
		{
			long long t1=a[i],t2=a[j];
			long long p1=0,p2=0;
			while (a[i]==t1 && j>=i && i<=n)
			{
				i++;
				p1++;
			}
			while(a[j]==t2 && j>=i && j>=1)
			{
				j--;
				p2++;
			}
			cnt+=p1*p2;
		}
		
	}
	cout<<cnt;
	return 0;
 } 



屏幕截图 2023-07-15 085028

能不能加强题目的数据(smiley)

1 个赞
#include <iostream>
#include<algorithm>

using namespace std;

long long a[114514];

int main()
{
	int i,j;
	int n,k;
	long long cnt=0;
	long long p1,p2;
	cin>>n>>k;
	
	i=1,j=n;
	
	
	for (int i=1;i<=n;i++) cin>>a[i];
	sort(a+1,a+1+n);
	while (j>=i)
	{
		if (a[i]+a[j]>k)
		{
			j--;
		}
		else if (a[i]+a[j]<k)
		{
			i++;
		}
		else
		{
			long long t1=a[i],t2=a[j];
			long long p1=0,p2=0;
			while (a[i]==t1 && j>=i && i<=n)
			{
				i++;
				p1++;
			}
			while(a[j]==t2 && j>=i && j>=1)
			{
				j--;
				p2++;
			}
			if (p1==0)
				cnt+=p2;
			else if (p2==0)
				cnt+=p1;
			else
				cnt+=p1*p2;
		}
		
	}
	cout<<cnt;
	return 0;
 } 
1 个赞

说实话你这么写都已经繁琐了/kx

1 个赞

重点不在这儿 :smiley: :frowning:

1 个赞

单纯就是想学习一下,有没有更高效的方法:D

1 个赞

更高效的话就二分卡常数就行。

1 个赞

题目编者表示:
20230116173208_73114

1 个赞

能不能加强测试数据

1 个赞

大抵是可以 \mathcal{O}(n)

用 unordererd_map 或 __gnu_pbds::gp_hash_table

事实上 pbds 居然跑不过 stl 这个假的哈希

pbds 在没有重复是时 O(1) 的,但是重复的就/kx

草 怪不得我动态开点树状数组这么容易假

但是我的编译器是
image

167d6060ddb1f6d605950888cffaca3fecb8e54a.gif@progressive
编者:你知道的太多了