题意:x轴上有n条长度为L的线段 第i条线段初始在[xi,xi+L].其初始速度为1或者-1.
告诉你最大风速W.若风速为w,则线段速度为变为 v[i]+w.
问在风速w不超过W的情况下(可以为负数和小数).有多少对线段(i,j)会在原点相遇?
1<=n<=1e5, 1<=l,W<=1e8 . -1e8<=x[i]<=1e8. v[i]={-1,1}.
若风速为w,根据相对运动 可以把云看做以-w速度移动.不影响两个线段和云的相对位置.
那么以x轴为位置 y轴为时间.可以画出一下图(来自CF题解).
由图得,矩形顶点为:((xu+xv+L)/2,(xv+L-xu)/2)
假如两个线段同向,因为初始是不相交的 所以无论风速无论它们都不会相遇.
所以将线段按初始方向分成两组. 若a[i]>b[j],那么(i,j)显然也不会相遇
告诉你最大风速W.若风速为w,则线段速度为变为 v[i]+w.
问在风速w不超过W的情况下(可以为负数和小数).有多少对线段(i,j)会在原点相遇?
1<=n<=1e5, 1<=l,W<=1e8 . -1e8<=x[i]<=1e8. v[i]={-1,1}.
若风速为w,根据相对运动 可以把云看做以-w速度移动.不影响两个线段和云的相对位置.
那么以x轴为位置 y轴为时间.可以画出一下图(来自CF题解).
由图得,矩形顶点为:((xu+xv+L)/2,(xv+L-xu)/2)
假如两个线段同向,因为初始是不相交的 所以无论风速无论它们都不会相遇.
所以将线段按初始方向分成两组. 若a[i]>b[j],那么(i,j)显然也不会相遇
排序后利用上面的判定条件,单指针维护一下即可.
#include <bits/stdc++.h>
using namespace std;
typedef long double db;
typedef long long ll;
const int N=2e5+5;
db n,L,w;
int p[N],v[N],a[N],b[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>L>>w;
int na=0,nb=0;
for(int i=1;i<=n;i++)
{
cin>>p[i]>>v[i];
if(v[i]==1) a[++na]=p[i];
else b[++nb]=p[i];
}
sort(a+1,a+1+na);
sort(b+1,b+1+nb);
ll res=0;
for(int i=1,j=1;i<=na;i++)
{
for(;j<=nb;j++)
{
if(a[i]>b[j]) continue;
db x=(a[i]+b[j]+L)/2.0;
db y=(b[j]-a[i]+L)/2.0;
db Y=fabs(x/w);
if(y>Y)
break;
}
if(j<=nb) res+=(nb-j+1);
}
cout<<res<<'\n';
return 0;
}