一开始想到这么去做了,但是算了一下会爆时间,就没写,后来发现原来有这么个函数,,lower_bound()。真是长知识了,作用就是查找单调递增的序列中大于等于某一值的元素的下标,网上有大牛介绍的很详细。在此膜拜一下,有了这个时间久妥妥的了,,
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
long long a[110],b[100010],ans1,ans2;
int main()
{
int n,k,t,top,m;
scanf("%d",&t);
while(scanf("%d %d",&n,&k)!=EOF)
{
top=0; ans1=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&m);
for(int j=0;j<m;j++)
{
scanf("%I64d",&a[j]);
b[top++]=a[j];
}
sort(a,a+m);
for(int j=0;j<m-1;j++)
{
ans1+=m-(lower_bound(a+j+1,a+m,k-a[j]+1)-a);
// printf("%I64d\n",ans1);
}
}
sort(b,b+top);
ans2=0;
for(int j=0;j<top-1;j++)
{
ans2+=top-(lower_bound(b+j+1,b+top,k-b[j]+1)-b);
}
printf("%I64d\n",ans2-ans1);
}
return 0;
}
对于又一次爆零我只想说,,,感觉不会再爱了,晚安!!