码迷,mamicode.com
首页 > 其他好文 > 详细

code transportation

时间:2018-03-25 11:55:35      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:lin   class   memset   turn   transport   ons   first   mat   using   

#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std;

typedef double db;
const int N = 1e5 + 5;

int bit[N << 1], Bit[N << 1];
db tab[N << 1];
pair <db, db> p[N], q[N];

inline void Add(int p) {
  for (; p < N + N; p += p & (- p)) Bit[p] ++;
}

inline int Sum(int p) {
  int r = 0;
  for (; p > 0; p -= p & (- p)) r += Bit[p];
  return r;
}

inline void add(int p) {
  for (; p < N + N; p += p & (- p)) bit[p] ++;
}

inline int sum(int p) {
  int r = 0;
  for (; p > 0; p -= p & (- p)) r += bit[p];
  return r;
}

inline bool cmp(pair <db, db> a, pair <db, db> b) {
  return (fabs(a.first - b.first) <= 1e-8) ? a.second > b.second : a.first < b.first;
}

int main() {
  int n, w, c = 0, d = 0;
  scanf("%d%d", &n, &w);
  for (int i = 1, x, v; i <= n; i ++) {
    scanf("%d%d", &x, &v);
    if (x > 0) {
      p[++ c] = make_pair(1.0 * x / (- v - w), 1.0 * x / (- v + w));
      if (p[c].first > p[c].second) swap(p[c].first, p[c].second);
      tab[i + i - 1] = p[c].second;
      tab[i + i] = p[c].first;
    }
    else {
      q[++ d] = make_pair(1.0 * x / (- v - w), 1.0 * x / (- v + w));
      if (q[d].first > q[d].second) swap(q[d].first, q[d].second);
      tab[i + i - 1] = q[d].second;
      tab[i + i] = q[d].first;
    }
  }
  sort(p + 1, p + c + 1, cmp);
  sort(q + 1, q + d + 1, cmp);
  sort(tab + 1, tab + n + n + 1);
  long long ans = 0;
  for (int i = 1, pos; i <= c; i ++) {
    pos = lower_bound(tab + 1, tab + n + n + 1, p[i].second) - tab;
    ans += i - 1 - Sum(pos); Add(pos);
  }
  memset(Bit, 0, sizeof Bit);
  for (int i = 1, pos; i <= d; i ++) {
    pos = lower_bound(tab + 1, tab + n + n + 1, q[i].second) - tab;
    ans += i - 1 - Sum(pos); Add(pos);
  }
  memset(Bit, 0, sizeof Bit);
  for (int i = 1, pos; i <= c; i ++) {
    pos = lower_bound(tab + 1, tab + n + n + 1, p[i].first) - tab;
    add(n + n - pos + 1);
    pos = lower_bound(tab + 1, tab + n + n + 1, p[i].second) - tab;
    Add(pos);
  }
  for (int i = 1, l, r; i <= d; i ++) {
    l = lower_bound(tab + 1, tab + n + n + 1, q[i].first) - tab;
    r = lower_bound(tab + 1, tab + n + n + 1, q[i].second) - tab;
    ans += c - Sum(l - 1) - sum(n + n - (r + 1) + 1);
  }
  printf("%lld\n", ans);
  return 0;
}

code transportation

标签:lin   class   memset   turn   transport   ons   first   mat   using   

原文地址:https://www.cnblogs.com/the-unbeatable/p/8643228.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!