CF989 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;
}
原文地址:https://www.cnblogs.com/violetholmes/p/15152143.html