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;
}