您的位置:首页 > 其它

【二分】COGS 140. [USACO Jan08] 化装晚会

2013-10-21 17:45 330 查看
题目链接:http://cojs.tk/cogs/problem/problem.php?pid=140

分析:

比较简单,但一定要细心,注意细节。

首先将每个数减去 s/2,快排。

然后找出0的位置,从这个位置开始,查找第一个绝对值小于它的数,记下位置。

累加两数的位置差。最后用全部情况减去符合的情况。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;int n,s,mx,p,ans=0;
double a[200010]={0};
int main()
{
freopen("costume.in","r",stdin);
freopen("costume.out","w",stdout);
cin>>n>>s;
for (int i=1;i<=n;i++)
{
cin>>a[i];
if (mx<a[i]) mx=a[i];
}
sort(a+1,a+1+n);
for (int i=1;i<=n;i++)a[i]-=s/2.0;
p=lower_bound(a+1,a+1+n,0)-a;
for (int i=p;i<=n;i++)
{
int hi=lower_bound(a+1,a+n+1,-1*a[i])-a;
while (a[hi]==a[i]*-1&&hi<i) hi++;
ans+=(i-hi);
}
long long nn=n*(n-1)/2;
cout<<nn-ans;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oi