Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <list>
- #include <map>
- #include <set>
- #include <deque>
- #include <stack>
- #include <bitset>
- #include <algorithm>
- #include <functional>
- #include <numeric>
- #include <utility>
- #include <sstream>
- #include <iostream>
- #include <iomanip>
- #include <cstdio>
- #include <cmath>
- #include <cstdlib>
- #include <ctime>
- using namespace std;
- class BarbarianInvasion2 {
- public:
- double minimumTime(vector <int>, vector <int>, vector <int>, vector <int>);
- };
- const int N = 11111;
- long double e[N], start[N], rs[9][N], rf[9][N];
- int pe[N], nr[9];
- double BarbarianInvasion2::minimumTime(vector <int> bx, vector <int> by, vector <int> xc, vector <int> yc) {
- int nb = bx.size(), nc = xc.size(), i, j, tt, it, ok, t, ke, kb, bal;
- bx.push_back(bx[0]);
- by.push_back(by[0]);
- long double ll = 0, rr = 1e5, mid, len = 0, dist, tmp, u, d, dx, dy, d1, d2, dd, left, right, cent, sum;
- for (i=0;i<nb;i++) {
- start[i] = len;
- 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]));
- }
- long long a, b, c, aa, bb, cc;
- for (it=0;it<100;it++) {
- mid = 0.5*(ll+rr);
- for (i=0;i<nc;i++) {
- nr[i] = 0;
- for (j=0;j<nb;j++) {
- a = by[j+1]-by[j];
- b = bx[j]-bx[j+1];
- c = -a*bx[j]-b*by[j];
- dist = a*xc[i]+b*yc[i]+c;
- if (dist < 0) dist = -dist;
- dist /= sqrt(1.0*a*a+1.0*b*b);
- u = mid*mid-dist*dist;
- if (u < 0) continue;
- u = sqrt(u);
- aa = -b; bb = a;
- cc = -aa*xc[i]-bb*yc[i];
- d = a*bb-b*aa;
- dx = 1.0*(b*cc-c*bb)/d;
- dy = 1.0*(c*aa-a*cc)/d;
- d1 = sqrt((dx-bx[j])*(dx-bx[j])+(dy-by[j])*(dy-by[j]));
- d2 = sqrt((dx-bx[j+1])*(dx-bx[j+1])+(dy-by[j+1])*(dy-by[j+1]));
- dd = sqrt((bx[j]-bx[j+1])*(bx[j]-bx[j+1])+(by[j]-by[j+1])*(by[j]-by[j+1]));
- if (d1+d2 < dd+1e-9 || d2 < d1) cent = start[j]+d1;
- else cent = start[j]-d1;
- left = cent-u;
- right = cent+u;
- if (left < start[j]) left = start[j];
- if (right > start[j]+dd) right = start[j]+dd;
- if (left > right) continue;
- rs[i][nr[i]] = left;
- rf[i][nr[i]] = right;
- nr[i]++;
- }
- }
- ok = 1;
- for (t=1;t<(1<<nc);t++) {
- ke = 0; kb = 0;
- for (i=0;i<nc;i++)
- if (t & (1 << i)) {
- kb++;
- for (j=0;j<nr[i];j++) {
- e[ke] = rs[i][j];
- pe[ke] = 1;
- ke++;
- e[ke] = rf[i][j];
- pe[ke] = -1;
- ke++;
- }
- }
- for (i=0;i<ke;i++)
- for (j=i+1;j<ke;j++)
- if (e[i] > e[j]) {
- tmp = e[i]; e[i] = e[j]; e[j] = tmp;
- tt = pe[i]; pe[i] = pe[j]; pe[j] = tt;
- }
- sum = 0; bal = 0;
- for (i=0;i<ke;i++) {
- bal += pe[i];
- if (bal > 0) sum += e[i+1]-e[i];
- }
- if (sum < len*kb/nc-1e-9) {
- ok = 0;
- break;
- }
- }
- if (ok) rr = mid;
- else ll = mid;
- }
- return 0.5*(ll+rr);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement