$n leq 100000$个飞机在坐标轴上,给坐标给速度,坐标速度异号,还有一个风速在$[-w,w]$区间,$w$比最小的速度绝对值要小。由于风速不知道,所以问有多少对飞机可能在原点相遇。
思维定势:$frac{x_i}{v_i+v}=frac{x_j}{v_j+v}$,$v$是风速,然后推下去,会推到一个三维偏序。。
没有观察题目性质。这个时间是关于风速单调而连续的,所以只要风速最小和风速最大这两个东西求个逆序对就行了。
似乎卡精度,用了分数。
这种题要写题解感觉最近脑子有点锈。。有没有神犇愿意帮忙除个锈啊QAQ
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 //#include<math.h> 5 //#include<queue> 6 //#include<vector> 7 #include<algorithm> 8 //#include<iostream> 9 //#include<assert.h> 10 using namespace std; 11 12 int n,w; 13 #define maxn 200011 14 15 struct frac 16 { 17 int a,b; 18 bool operator < (const frac &x) const {return 1ll*a*x.b<1ll*b*x.a;} 19 bool operator == (const frac &x) const {return 1ll*a*x.b==1ll*b*x.a;} 20 }; 21 22 struct Poi{frac x,y; int z;}p[maxn]; 23 bool cmpx(const Poi &a,const Poi &b) {return b.x<a.x || (a.x==b.x && a.y<b.y);} 24 frac lisa[maxn]; int li=0; 25 26 struct BIT 27 { 28 int a[maxn],n; 29 void clear(int m) {n=m;} 30 void add(int x,int v) {for (;x<=n;x+=x&-x) a[x]+=v;} 31 int query(int x) {int ans=0; for (;x;x-=x&-x) ans+=a[x]; return ans;} 32 }t; 33 34 #define LL long long 35 int main() 36 { 37 scanf("%d%d",&n,&w); 38 for (int i=1,a,b;i<=n;i++) 39 { 40 scanf("%d%d",&a,&b); 41 if (a<0) p[i].x=(frac){-a,b-w},p[i].y=(frac){-a,b+w}; 42 else p[i].x=(frac){a,w-b},p[i].y=(frac){a,-w-b}; 43 lisa[++li]=p[i].y; 44 } 45 sort(lisa+1,lisa+1+li); 46 for (int i=1;i<=n;i++) p[i].z=lower_bound(lisa+1,lisa+1+li,p[i].y)-lisa; 47 48 sort(p+1,p+1+n,cmpx); 49 t.clear(n); 50 LL ans=0; 51 for (int i=1;i<=n;i++) 52 { 53 ans+=t.query(p[i].z); 54 t.add(p[i].z,1); 55 } 56 printf("%lld ",ans); 57 return 0; 58 }