[ 杂题 树状数组 ] VK Cup 2018 - Round 2 Codeforces924D Contact ATC

假设当风力为 w − w 时,点 i i ti 时刻经过 0 0 ,当风力为 w 时在 ti t i ′ 时刻经过 0 0
显然在风力从 w 变化为 w w 的过程中,点 i 经过 0 0 的时刻也会从 ti 变到 ti t i ′ ,而且这个过程是连续的。
对于点 i,j i , j ,考虑什么时候满足条件。若 ti=tj t i = t j ti=tj t i ′ = t j ′ ,显然满足。否则假设 ti<tj t i < t j ,那么只有 ti>tj t i ′ > t j ′ 的时候满足。
t t ′ 离散,按照 ti t i 排序后扫一遍,树状数组统计。

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
typedef pair<double,int> abcd;
const int N=100010;
int k,n,w,x,y,num;
int s[N];
abcd a[N],c[N];
long long Ans;
int Query(int x) {
    int Ans=0;
    for(;x;x-=x&-x) Ans+=s[x];
    return Ans;
}
void Update(int x) {
    for(;x<=num;x+=x&-x) ++s[x];
}
int main() {
    scanf("%d%d",&n,&w);
    for(int i=1;i<=n;i++) {
        scanf("%d%d",&x,&y);
        a[i].fi=(double)-x/(y-w);
        c[i].fi=(double)-x/(y+w);c[i].se=i;
        a[i].se=c[i].fi;
    }
    sort(c+1,c+n+1);
    for(int i=1;i<=n;i++) {
        if(c[i].fi>c[i-1].fi) ++num;
        a[c[i].se].se=num;
    }
    sort(a+1,a+n+1);
    for(int i=n;i;) {
        int j=i;
        while(j&&a[j].fi==a[i].fi) --j;
        for(int k=i;k>j;k--) Ans+=Query(a[k].se)+i-k;
        while(i>j) Update(a[i--].se);
    }
    cout<<Ans<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值