Codeforces956D. Contact ATC

$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\n",ans);
57     return 0;
58 }
View Code

 

posted @ 2018-04-11 19:27  Blue233333  阅读(163)  评论(0编辑  收藏  举报