题目描述
给定一个单调不减的数列
p
和一个整数m,求有多少组
a,b
,满足
pa+pb=m
输入
第一行一个整数
T
,表示有
T
组测试数据。
每组数据第一行是
1
个整数
m
。
第二行是整数
n
,表示p中有
n
个数字。
第三行是
n
个数字,表示
p
的所有元素。
T≤3,1≤n,m≤3∗106,0≤pi≤3∗106
输出
每组数据输出一个数
x
,表示满足条件的组数。
样例输入
2
7
4
1 2 3 4
6
5
1 2 3 4 5
样例输出
2
5
题目描述
给定一个单调不减的数列 p 和一个整数m,求有多少组 a,b ,满足 pa+pb=m
输入
第一行一个整数
T
,表示有
T
组测试数据。
每组数据第一行是
1
个整数
m
。
第二行是整数
n
,表示p中有
n
个数字。
第三行是
n
个数字,表示
p
的所有元素。
T≤3,1≤n,m≤3∗106,0≤pi≤3∗106
输出
每组数据输出一个数 x ,表示满足条件的组数。
样例输入
2 7 4 1 2 3 4 6 5 1 2 3 4 5
样例输出
2 5
注意下标:
#include <iostream>
#include <stdio.h>
using namespace std;
#define MAX 3000005
int a[MAX];
int main()
{
int t,n,m;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&m,&n);
for (int i=0;i<n;i++)
scanf("%d",&a[i]);
int l=0,r=n-1;
long long sum=0;
while (l<r)
{
while(l<r&&a[l]+a[r]<m) l++;
while(l<r&&a[l]+a[r]>m) r--;
if (l<r&&a[l]+a[r]==m){
if (a[l]==a[r]) break;
int ml=a[l],mr=a[r];
int nl=0,nr=0;
while(l<r&&a[l]==ml){
l++; nl++;}
while(l<=r&&a[r]==mr) {
r--; nr++;}
sum+=nl*nr;
}
}
sum<<=1;
if (l==r&&a[l]+a[r]==m)
sum++;
else if (l<r&&a[l]==a[r]&&a[l]+a[r]==m)
{
long long len=r-l+1;
sum+=len*len;
}
cout<<sum<<endl;
}
return 0;
}