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

BZOJ2735 世博会

时间:2015-03-11 00:26:10      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:

首先将(x, y)变换为((x + y) / 2, (x - y) / 2)

然后变成查询区间中位数的问题,把x, y分开做

离散化完直接用主席树维护区间和

 

技术分享
  1 /**************************************************************
  2     Problem: 2735
  3     User: rausen
  4     Language: C++
  5     Result: Accepted
  6     Time:5960 ms
  7     Memory:81280 kb
  8 ****************************************************************/
  9  
 10 #include <cstdio>
 11 #include <algorithm>
 12  
 13 using namespace std;
 14 typedef long long ll;
 15 typedef double lf;
 16 const int N = 1e5 + 5;
 17 const int M = 4e6 + 5;
 18  
 19 int n, Q;
 20 int x[N], y[N], tx[N], ty[N];
 21  
 22 struct chair_node {
 23     chair_node *ls, *rs;
 24     int cnt;
 25     ll sum;
 26 } *chair_root_x[N], *chair_root_y[N], mempool[M], *cnt_chair = mempool, *null;
 27  
 28 inline int read() {
 29     int x = 0, sgn = 1;
 30     char ch = getchar();
 31     while (ch < 0 || 9 < ch) {
 32         if (ch == -) sgn = -1;
 33         ch = getchar();
 34     }
 35     while (0 <= ch && ch <= 9) {
 36         x = x * 10 + ch - 0;
 37         ch = getchar();
 38     }
 39     return sgn * x;
 40 }
 41  
 42 #define Cnt p -> cnt
 43 #define Sum p -> sum
 44 #define Ls p -> ls
 45 #define Rs p -> rs
 46 #define mid (l + r >> 1)
 47 void chair_modify(chair_node *&p, int l, int r, int pos, int d) {
 48     *(++cnt_chair) = *p, p = cnt_chair, ++Cnt, Sum += d;
 49     if (l == r) return;
 50     if (pos <= mid) chair_modify(Ls, l, mid, pos, d);
 51     else chair_modify(Rs, mid + 1, r, pos, d);
 52 }
 53  
 54 ll chair_query(chair_node *p, chair_node *q, int rank) {
 55     int l = 1, r = n, cnt = 0, t;
 56     ll res = 0;
 57     while (l < r) {
 58         t = p -> ls -> cnt - q -> ls -> cnt;
 59         if (rank <= t) {
 60             cnt += p -> rs -> cnt - q -> rs -> cnt, res += p -> rs -> sum - q -> rs -> sum;
 61             p = p -> ls, q = q -> ls, r = mid;
 62         } else {
 63             cnt -= t, res -= p -> ls -> sum - q -> ls -> sum;
 64             rank -= t, p = p -> rs, q = q -> rs, l = mid + 1;
 65         }
 66     }
 67     return res - Sum / Cnt * cnt;
 68 }
 69 #undef mid
 70 #undef Ls
 71 #undef Rs
 72 #undef Sum
 73 #undef Cnt
 74  
 75 int main() {
 76     int i, j, x1, y1, tmp;
 77     n = read(), Q = read();
 78     for (i = 1; i <= n; ++i) x[i] = read();
 79     for (i = 1; i <= n; ++i) {
 80         tmp = read();
 81         y[i] = x[i] - tmp, x[i] += tmp;
 82     }
 83     for (i = 1; i <= n; ++i) tx[i] = x[i];
 84     sort(tx + 1, tx + n + 1);
 85     for (i = 1; i <= n; ++i) x[i] = lower_bound(tx + 1, tx + n + 1, x[i]) - tx;
 86     for (i = 1; i <= n; ++i) ty[i] = y[i];
 87     sort(ty + 1, ty + n + 1);
 88     for (i = 1; i <= n; ++i) y[i] = lower_bound(ty + 1, ty + n + 1, y[i]) - ty;
 89      
 90     null = cnt_chair;
 91     null -> ls = null -> rs = null, null -> cnt = null -> sum = 0;
 92     chair_root_x[0] = chair_root_y[0] = null;
 93     for (i = 1; i <= n; ++i) {
 94         chair_modify(chair_root_x[i] = chair_root_x[i - 1], 1, n, x[i], tx[x[i]]);
 95         chair_modify(chair_root_y[i] = chair_root_y[i - 1], 1, n, y[i], ty[y[i]]);
 96     }
 97     while (Q--) {
 98         x1 = read(), y1 = read(), tmp = (y1 - x1 + 2) / 2;
 99         printf("%.2lf\n", (lf) (chair_query(chair_root_x[y1], chair_root_x[x1 - 1], tmp) +  chair_query(chair_root_y[y1], chair_root_y[x1 - 1], tmp)) / 2.0);
100     }
101     return 0;
102 }
View Code

 

BZOJ2735 世博会

标签:

原文地址:http://www.cnblogs.com/rausen/p/4328689.html

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