Advertisement
Guest User

Untitled

a guest
Sep 24th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.72 KB | None | 0 0
  1. #include <vector>
  2. #include <list>
  3. #include <map>
  4. #include <set>
  5. #include <deque>
  6. #include <stack>
  7. #include <bitset>
  8. #include <algorithm>
  9. #include <functional>
  10. #include <numeric>
  11. #include <utility>
  12. #include <sstream>
  13. #include <iostream>
  14. #include <iomanip>
  15. #include <cstdio>
  16. #include <cmath>
  17. #include <cstdlib>
  18. #include <ctime>
  19.  
  20. using namespace std;
  21.  
  22. class BarbarianInvasion2 {
  23. public:
  24.   double minimumTime(vector <int>, vector <int>, vector <int>, vector <int>);
  25. };
  26.  
  27. const int N = 11111;
  28.  
  29. long double e[N], start[N], rs[9][N], rf[9][N];
  30. int pe[N], nr[9];
  31.  
  32. double BarbarianInvasion2::minimumTime(vector <int> bx, vector <int> by, vector <int> xc, vector <int> yc) {
  33.   int nb = bx.size(), nc = xc.size(), i, j, tt, it, ok, t, ke, kb, bal;
  34.   bx.push_back(bx[0]);
  35.   by.push_back(by[0]);
  36.   long double ll = 0, rr = 1e5, mid, len = 0, dist, tmp, u, d, dx, dy, d1, d2, dd, left, right, cent, sum;
  37.   for (i=0;i<nb;i++) {
  38.     start[i] = len;
  39.     len += sqrt(1.0*(bx[i]-bx[i+1])*(bx[i]-bx[i+1])+1.0*(by[i]-by[i+1])*(by[i]-by[i+1]));
  40.   }
  41.   long long a, b, c, aa, bb, cc;
  42.   for (it=0;it<100;it++) {
  43.     mid = 0.5*(ll+rr);
  44.     for (i=0;i<nc;i++) {
  45.       nr[i] = 0;
  46.       for (j=0;j<nb;j++) {
  47.         a = by[j+1]-by[j];
  48.         b = bx[j]-bx[j+1];
  49.         c = -a*bx[j]-b*by[j];
  50.         dist = a*xc[i]+b*yc[i]+c;
  51.         if (dist < 0) dist = -dist;
  52.         dist /= sqrt(1.0*a*a+1.0*b*b);
  53.         u = mid*mid-dist*dist;
  54.         if (< 0) continue;
  55.         u = sqrt(u);
  56.         aa = -b; bb = a;
  57.         cc = -aa*xc[i]-bb*yc[i];
  58.         d = a*bb-b*aa;
  59.         dx = 1.0*(b*cc-c*bb)/d;
  60.         dy = 1.0*(c*aa-a*cc)/d;
  61.         d1 = sqrt((dx-bx[j])*(dx-bx[j])+(dy-by[j])*(dy-by[j]));
  62.         d2 = sqrt((dx-bx[j+1])*(dx-bx[j+1])+(dy-by[j+1])*(dy-by[j+1]));
  63.         dd = sqrt((bx[j]-bx[j+1])*(bx[j]-bx[j+1])+(by[j]-by[j+1])*(by[j]-by[j+1]));
  64.         if (d1+d2 < dd+1e-9 || d2 < d1) cent = start[j]+d1;
  65.         else cent = start[j]-d1;
  66.         left = cent-u;
  67.         right = cent+u;
  68.         if (left < start[j]) left = start[j];
  69.         if (right > start[j]+dd) right = start[j]+dd;
  70.         if (left > right) continue;
  71.         rs[i][nr[i]] = left;
  72.         rf[i][nr[i]] = right;
  73.         nr[i]++;
  74.       }
  75.     }
  76.     ok = 1;
  77.     for (t=1;t<(1<<nc);t++) {
  78.       ke = 0; kb = 0;
  79.       for (i=0;i<nc;i++)
  80.         if (& (1 << i)) {
  81.           kb++;
  82.           for (j=0;j<nr[i];j++) {
  83.             e[ke] = rs[i][j];
  84.             pe[ke] = 1;
  85.             ke++;
  86.             e[ke] = rf[i][j];
  87.             pe[ke] = -1;
  88.             ke++;
  89.           }
  90.         }
  91.       for (i=0;i<ke;i++)
  92.         for (j=i+1;j<ke;j++)
  93.           if (e[i] > e[j]) {
  94.             tmp = e[i]; e[i] = e[j]; e[j] = tmp;
  95.             tt = pe[i]; pe[i] = pe[j]; pe[j] = tt;
  96.           }
  97.       sum = 0; bal = 0;
  98.       for (i=0;i<ke;i++) {
  99.         bal += pe[i];
  100.         if (bal > 0) sum += e[i+1]-e[i];
  101.       }
  102.       if (sum < len*kb/nc-1e-9) {
  103.         ok = 0;
  104.         break;
  105.       }
  106.     }
  107.     if (ok) rr = mid;
  108.     else ll = mid;
  109.   }
  110.   return 0.5*(ll+rr);
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement