- 没有做优化,这题用不到二分
- 总时间限制:
- 3000ms
- 内存限制:
- 65536kB
- 描述
- 给出2个正整数集合A = {pi | 1 <= i <= a},B = {qj | 1 <= j <= b}和一个正整数s。问题是:使得pi + qj = s的不同的(i, j)对有多少个。
- 输入
- 第1行是测试数据的组数n,后面跟着n组测试数据。
每组测试数据占5行,第1行是和s (1 <= s <=
10000),第2行是一个正整数a (1 <= a <=
10000),表示A中元素的数目。第3行是a个正整数,每个正整数不超过10000,表示A中的元素。第4行是一个正整数b (1 <= b
<= 10000),表示B中元素的数目。第5行是b个正整数,每个正整数不超过10000,表示B中的元素。
注意:这里的集合和数学书上定义的集合有一点点区别——集合内可能包含相等的正整数。 - 输出
- n行,每行输出对应一个输入。输出应是一个非负整数。
- 样例输入
-
2
99
2
49 49
2
50 50
11
9
1 2 3 4 5 6 7 8 9
10
10 9 8 7 6 5 4 3 2 1
- 样例输出
-
4
9
1 #include <stdio.h>
2 int sum;
3 int s(int x[],int y[])
4 {
5 int i,t,ans=0;
6 for(i=1;i<=10000;i++)
7 {
8 // printf("%d
",i);
9 if(x[i]==0) continue;
10 else if(sum-i>0)
11 {
12 t=sum-i;
13 ans+=x[i]*y[t];
14 }
15 }
16 return ans;
17 }
18 int main()
19 {
20 int n,k,ans;
21 int a[10002],b[10002];
22 int i,j;
23 scanf("%d",&n);
24 while(n--)
25 {
26 ans=0;
27 scanf("%d",&sum);
28 scanf("%d",&a[0]);//a[0]=lena
29 for(i=1;i<=a[0];i++)
30 a[i]=0;
31 for(i=1;i<=a[0];i++)
32 {
33 scanf("%d",&k);
34 a[k]++;
35 }
36 scanf("%d",&b[0]);//b[0]=lenb
37 for(i=1;i<=b[0];i++)
38 b[i]=0;
39 for(i=1;i<=b[0];i++)
40 {
41 scanf("%d",&k);
42 b[k]++;
43 }
44 //input finished
45 //if(a[0]<=b[0])
46 ans=s(a,b);
47 //else ans=s(b,a);
48 printf("%d
",ans);
49 }
50 return 0;
51 }