CF989D Solution

题目链接

题解

下图横坐标为位置,纵坐标为时间。

如果将风看作月亮在移动而非云在移动,月亮可以到达黄色的区域。如果两朵云的相交处与黄色区域有交集则可以遮住月亮,易得仅需判断上端的顶点即可。设\(v_i=1,v_j=-1\),则云\(i,j\)相交处上端的顶点坐标为\((\frac{|x_j+l+x_i|}{2},\frac{x_j+l-x_i}{2})\)。而\(y>\frac{x}{w}\)的点在黄色区域内,因此需要满足\(w(x_j+l-x_i)>|x_j+l+x_i|\)。可以发现固定\(x_i\)\(x_j\)越大越容易满足。因此将\(v=1\)\(-1\)的云分别增序排序,设\(j\)为当前不满足上述不等式的最大的\(j\),双指针即可。

AC代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int x1[N],x2[N],n1,n2;
signed main()
{
	int n,l,w,x,v;
	scanf("%lld%lld%lld",&n,&l,&w);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld%lld",&x,&v);
		if(v>0) x1[++n1]=x;
		else x2[++n2]=x;
	}
	sort(x1+1,x1+n1+1),sort(x2+1,x2+n2+1);
	int ans=0,j=1;
	for(int i=1;i<=n1;i++)
	{
		while(j<=n2 && abs(x1[i]+x2[j]+l)>=w*(x2[j]+l-x1[i])) j++;
		ans+=n2-j+1;
	}
	printf("%lld",ans);
	return 0;
}
posted @ 2021-08-17 14:20  violet_holmes  阅读(19)  评论(0编辑  收藏  举报