30%的数据1 ≤ n ≤ 100, 1 ≤ m ≤ 50, k ≤ 2000;
100%的数据 1 ≤ n ≤ 10000, 1 ≤ m ≤ 100, k ≤ 2,000,000,000;
1 /*之前写了个读入优化,怎么都是得30分,改成cin后,直接就过了。
2 做法:二分:先将输入的数字排序,然后从前面向后循环,二分后面的区间,找出si+sj<k的最大值,那么i+1--j的数都满足要求,枚举每一个i,累加即可
3 */
4 #define N 10010
5 #include<iostream>
6 using namespace std;
7 #include<cstdio>
8 #include<algorithm>
9 long long n,m;
10 long long k,con[N];
11 long long find_ans(int x)
12 {
13 int l=x+1,r=n,mid;
14 while(l<=r)
15 {
16 mid=((l+r)>>1);
17 if(con[x]+con[mid]>k)
18 r=mid-1;
19 else l=mid+1;
20 }
21 return l-x-1;
22 }
23 int main()
24 {
25 cin>>n;
26 for(int i=1;i<=n;++i)
27 cin>>con[i];
28 sort(con+1,con+1+n);
29 cin>>m;
30 long long ans;
31 while(m--)
32 {
33 ans=0;
34 cin>>k;
35 for(int i=1;i<=n;++i)
36 ans+=find_ans(i);
37 cout<<ans<<endl;
38 }
39 return 0;
40 }