CodeVS 1432-总数统计
1vara:
array[
1..
10000]
of int64;
2var n,m,k,p,ans:int64;
3var i,j:longint;
4functionfind(l,r,x:int64):int64;//
二分
5var mid:int64;
6begin 7whilel+
1do 8begin 9mid:=(l+r)div2;
10ifa[mid]<=xthenl:=midelser:=mid;
11end;
12 exit(l);
13end;
14procedure q(l,r:longint);
15var i,j,m,t:longint;
16begin17i:=l;j:=r;
18m:=a[(l+r)div2];
19repeat20whilea[i]do inc(i);
21whilea[j]>mdo dec(j);
22ifi<=jthen23begin24t:=a[i];a[i]:=a[j];a[j]:=t;
25 inc(i);dec(j);
26end;
27untili>j;
28ifithen q(i,r);
29iflthen q(l,j);
30end;
31begin32 readln(n);
33fori:=1tondoread(a[i]);q(1,n);//读入&排序
34 readln(m);
35fori:=1tomdo36begin37ans:=0;readln(k);
38p:=find(1,n+1,k);//找出最小的枚举区间
39forj:=1topdoans:=ans+find(j,p+1,k-a[j])-j;//关键代码,好好理解
40 writeln(ans);
41end;
42end.
来源: