记录编号 |
97671 |
评测结果 |
AAAAAAAAAAA |
题目名称 |
数对的个数 |
最终得分 |
100 |
用户昵称 |
OI永别 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.194 s |
提交时间 |
2014-04-19 21:33:23 |
内存使用 |
4.89 MiB |
显示代码纯文本
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 201000
struct TREAP{
struct arr{
int l,r,dat,num;
int ran;
}t[N];
int size,root;
void clean(){
memset(t,0,sizeof(t));
size = root = 0;
}
void right(int &x){
int tem = t[x].r;
t[x].r = t[tem].l;
t[tem].l = x;
x = tem;
return;
}
void left(int &x){
int tem = t[x].l;
t[x].l = t[tem].r;
t[tem].r = x;
x = tem;
return;
}
void insert(int &x,int y){
if (!x){
x = ++ size;
t[x].l = t[x].r = 0;
t[x].dat = y;
t[x].num = 1;
t[x].ran = rand();
return;
}
else {
if (t[x].dat == y){
t[x].num ++;
return;
}
if (t[x].dat < y){
insert(t[x].r,y);
if (t[x].ran > t[t[x].r].ran) right(x);
}
else{
insert(t[x].l,y);
if (t[x].ran > t[t[x].l].ran) left(x);
}
}
return;
}
int search(int x,int y){
if (!x) return 0;
if (t[x].dat == y) return t[x].num;
if (t[x].dat > y) return search(t[x].l,y);
else return search(t[x].r,y);
}
}T;
int a[N];
int n,c;
int main(){
freopen("dec.in","r",stdin);
freopen("dec.out","w",stdout);
T.clean();
scanf("%d%d",&n,&c);
for (int i = 1; i <= n; i++){
scanf("%d",&a[i]);
T.insert(T.root,a[i]);
}
int ans = 0;
for (int i = 1; i <= n; i++){
ans += T.search(T.root,a[i] + c);
}
printf("%d\n",ans);
return 0;
}