Advertisement
Guest User

Untitled

a guest
Aug 14th, 2013
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.30 KB | None | 0 0
  1. /*
  2.  * File:      main.cpp
  3.  * Author:    Hrayr [HarHro94]
  4.  * Problem:
  5.  * IDE:       Visual C++ 2012
  6.  */
  7. #pragma comment(linker, "/STACK:66777216")
  8. #define _CRT_SECURE_NO_WARNINGS
  9. #include <functional>
  10. #include <algorithm>
  11. #include <iostream>
  12. #include <sstream>
  13. #include <fstream>
  14. #include <cassert>
  15. #include <iomanip>
  16. #include <cstring>
  17. #include <cstdio>
  18. #include <string>
  19. #include <vector>
  20. #include <ctime>
  21. #include <queue>
  22. #include <stack>
  23. #include <cmath>
  24. #include <set>
  25. #include <map>
  26. using namespace std;
  27.  
  28. typedef long long LL;
  29. typedef long double LD;
  30. #define pb push_back
  31. #define mp make_pair
  32. #define all(v) (v).begin(), (v).end()
  33. #define sz(v) (int)(v).size()
  34.  
  35. const int N = 100007;
  36.  
  37. LL sx[N], sy[N], rx[N], ry[N], sumx[N], sumy[N];
  38. int n, q, x[N], y[N];
  39.  
  40. struct tree
  41. {
  42.     struct node
  43.     {
  44.         LL *sorted, *sum;
  45.     } node[8 * N];
  46.  
  47.     void build(int v, int tl, int tr, LL x[])
  48.     {
  49.         node[v].sorted = new LL [tr - tl + 1];
  50.         node[v].sum = new LL[tr - tl + 1];
  51.         if (tl == tr)
  52.         {
  53.             node[v].sorted[0] = x[tl];
  54.             node[v].sum[0] = x[tl];
  55.             return;
  56.         }
  57.         int tm = (tl + tr) >> 1;
  58.         build((v << 1), tl, tm, x);
  59.         build((v << 1) + 1, tm + 1, tr, x);
  60.         LL *a = node[(v << 1)].sorted;
  61.         LL *b = node[(v << 1) + 1].sorted;
  62.         LL *c = node[v].sorted;
  63.         int i = 0;
  64.         int j = 0;
  65.         int k = 0;
  66.         int sza = tm - tl + 1;
  67.         int szb = tr - tm;
  68.         while (i != sza || j != szb)
  69.         {
  70.             if (i == sza)
  71.             {
  72.                 c[k++] = b[j++];
  73.             }
  74.             else if (j == szb)
  75.             {
  76.                 c[k++] = a[i++];
  77.             }
  78.             else if (a[i] < b[j])
  79.             {
  80.                 c[k++] = a[i++];
  81.             }
  82.             else
  83.             {
  84.                 c[k++] = b[j++];
  85.             }
  86.         }
  87.         LL *s = node[v].sum;
  88.         s[0] = c[0];
  89.         for (int i = 1; i < tr - tl + 1; ++i)
  90.         {
  91.             s[i] = c[i] + s[i - 1];
  92.         }
  93.     }
  94.  
  95.     int query(int v, int tl, int tr, int l, int r, LL val)
  96.     {
  97.         if (tl == l && tr == r)
  98.         {
  99.             LL *a = node[v].sorted;
  100.             int lo = 0;
  101.             int hi = tr - tl;
  102.             while (lo < hi)
  103.             {
  104.                 int mi = (lo + hi + 1) >> 1;
  105.                 if (a[mi] <= val)
  106.                 {
  107.                     lo = mi;
  108.                 }
  109.                 else
  110.                 {
  111.                     hi = mi - 1;
  112.                 }
  113.             }
  114.             if (a[lo] <= val)
  115.             {
  116.                 return lo + 1;
  117.             }
  118.             return 0;
  119.         }
  120.         int tm = (tl + tr) >> 1;
  121.         if (r <= tm)
  122.         {
  123.             return query((v << 1), tl, tm, l, r, val);
  124.         }
  125.         if (l > tm)
  126.         {
  127.             return query((v << 1) + 1, tm + 1, tr, l, r, val);
  128.         }
  129.         return query((v << 1), tl, tm, l, tm, val) + query((v << 1) + 1, tm + 1, tr, tm + 1, r, val);
  130.     }
  131.  
  132.     LL rsq(int v, int tl, int tr, int l, int r, LL val)
  133.     {
  134.         if (tl == l && tr == r)
  135.         {
  136.             LL *a = node[v].sorted;
  137.             int lo = 0;
  138.             int hi = tr - tl;
  139.             while (lo < hi)
  140.             {
  141.                 int mi = (lo + hi + 1) >> 1;
  142.                 if (a[mi] <= val)
  143.                 {
  144.                     lo = mi;
  145.                 }
  146.                 else
  147.                 {
  148.                     hi = mi - 1;
  149.                 }
  150.             }
  151.             if (a[lo] <= val)
  152.             {
  153.                 return node[v].sum[lo];
  154.             }
  155.             return 0;
  156.         }
  157.         int tm = (tl + tr) >> 1;
  158.         if (r <= tm)
  159.         {
  160.             return rsq((v << 1), tl, tm, l, r, val);
  161.         }
  162.         if (l > tm)
  163.         {
  164.             return rsq((v << 1) + 1, tm + 1, tr, l, r, val);
  165.         }
  166.         return rsq((v << 1), tl, tm, l, tm, val) + rsq((v << 1) + 1, tm + 1, tr, tm + 1, r, val);
  167.     }
  168.  
  169. } X, Y;
  170.  
  171. LL myabs(LL x)
  172. {
  173.     return x < 0LL ? - x : x;
  174. }
  175.  
  176. int main()
  177. {
  178. #ifdef harhro94
  179.     freopen("input.txt", "r", stdin);
  180.     freopen("output.txt", "w", stdout);
  181. #endif
  182.  
  183.     scanf("%d%d", &n, &q);
  184.     for (int i = 0; i < n; ++i)
  185.     {
  186.         scanf("%d", x + i);
  187.     }
  188.     for (int i = 0; i < n; ++i)
  189.     {
  190.         scanf("%d", y + i);
  191.     }
  192.     for (int i = 0; i < n; ++i)
  193.     {
  194.         rx[i] = x[i] + y[i];
  195.         ry[i] = x[i] - y[i];
  196.         sx[i] = rx[i];
  197.         sy[i] = ry[i];
  198.     }
  199.     sort(sx, sx + n);
  200.     sort(sy, sy + n);
  201.     for (int i = 1; i <= n; ++i)
  202.     {
  203.         sumx[i] = sumx[i - 1] + rx[i - 1];
  204.         sumy[i] = sumy[i - 1] + ry[i - 1];
  205.     }
  206.     /*
  207.     for (int i = 0; i < n; ++i)
  208.     {
  209.         cerr << rx[i] << " ";
  210.     }
  211.     cerr << endl;
  212.     for (int i = 0; i < n; ++i)
  213.     {
  214.         cerr << ry[i] << " ";
  215.     }
  216.     cerr << endl;
  217.     */
  218.     X.build(1, 0, n - 1, rx);
  219.     Y.build(1, 0, n - 1, ry);
  220.     cerr << fixed << setprecision(3) << "\nExecution time = " << clock() / 1000.0 << "s\n";
  221.     while (q--)
  222.     {
  223.         int l, r;
  224.         scanf("%d%d", &l, &r);
  225.         --l, --r;
  226.         int cnt = r - l + 1;
  227.         if (cnt < 50)
  228.         {
  229.             vector<int> xx(rx + l, rx + r + 1), yy(ry + l, ry + r + 1);
  230.             sort(all(xx));
  231.             sort(all(yy));
  232.             cnt = r - l + 1;
  233.             LD rcx = xx[cnt >> 1];
  234.             LD rcy = yy[cnt >> 1];
  235.             //cerr << rcx << endl << rcy << endl;
  236.             LD ans = 0.0;
  237.             for (int i = l; i <= r; ++i)
  238.             {
  239.                 ans += fabs(rx[i] - rcx) + fabs(ry[i] - rcy);
  240.             }
  241.             printf("%.7lf\n", (double)ans / 2.0);
  242.         }
  243.         else
  244.         {
  245.             int need = cnt / 2 + 1;
  246.             LL ans = 0LL;
  247.  
  248.             int lo = 0;
  249.             int hi = n - 1;
  250.             while (lo < hi)
  251.             {
  252.                 int mi = (lo + hi) >> 1;
  253.                 if (X.query(1, 0, n - 1, l, r, sx[mi]) >= need)
  254.                 {
  255.                     hi = mi;
  256.                 }
  257.                 else
  258.                 {
  259.                     lo = mi + 1;
  260.                 }
  261.             }
  262.             LL med = sx[lo];
  263.             LL all = sumx[r + 1] - sumx[l];
  264.             LL less = X.rsq(1, 0, n - 1, l, r, med);
  265.             LL greater = all - less;
  266.             int lessCnt = X.query(1, 0, n - 1, l, r, med);
  267.             ans += greater - less + lessCnt * med - (cnt - lessCnt) * med;
  268.  
  269.             lo = 0;
  270.             hi = n - 1;
  271.             while (lo < hi)
  272.             {
  273.                 int mi = (lo + hi) >> 1;
  274.                 if (Y.query(1, 0, n - 1, l, r, sy[mi]) >= need)
  275.                 {
  276.                     hi = mi;
  277.                 }
  278.                 else
  279.                 {
  280.                     lo = mi + 1;
  281.                 }
  282.             }
  283.             med = sy[lo];
  284.             all = sumy[r + 1] - sumy[l];
  285.             less = Y.rsq(1, 0, n - 1, l, r, med);
  286.             greater = all - less;
  287.             lessCnt = Y.query(1, 0, n - 1, l, r, med);
  288.             ans += greater - less + lessCnt * med - (cnt - lessCnt) * med;
  289.             printf("%.7lf\n", (double)ans / 2.0);
  290.         }
  291.     }
  292.  
  293. #ifdef harhro94
  294.     cerr << fixed << setprecision(3) << "\nExecution time = " << clock() / 1000.0 << "s\n";
  295. #endif
  296.     return 0;
  297. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement