Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "bits/stdc++.h"
- using namespace std;
- using cord = long double;
- const long double PI = acos(-1);
- const long double EPS = 1e-8;
- int signal(cord x) { return (x > EPS) - (x < -EPS); }
- struct point {
- cord x,y;
- // Constructor
- point(cord _x, cord _y): x(_x), y(_y) {}
- point(): x(0), y(0) {}
- // Very basic operations
- void operator= (const point& p){x = p.x; y = p.y; }
- point operator+ (const point& q){ return {x + q.x, y + q.y}; }
- point operator- (const point& q){ return {x - q.x, y - q.y}; }
- point operator* (const cord& s) { return {x*s, y*s}; }
- point operator/ (const cord& s) { return {x/s, y/s}; }
- // Basic operations
- cord cross (const point &p){ return (x*p.y - y*p.x); }
- cord dot (const point& p) { return (x*p.x + y*p.y); }
- /* TRANSFORMA EM DOUBLE
- point proj(const point& p) { return(p*(dot(p)/p.norm()))}
- */
- // Length operations
- cord norm() { return (x*x + y*y); }
- long double len() { return hypot(x, y); }
- // Rotation operations
- point rotate90() { return {-y,x}; }
- // TRANSFORMA PRA DOUBLE point rotate(long double ang) { return {cos(ang)*x - sin(ang)*y, sin(ang)*x + cos(ang)*y}; }
- };
- #define pb push_back
- #define mp make_pair
- #define fst first
- #define snd second
- #define fr(i,n) for(int i=0;i<n;i++)
- #define frr(i,n) for(int i=1;i<=n;i++)
- #define ms(x,i) memset(x,i,sizeof(x))
- #define dbg(x) cout << #x << " = " << x << endl
- #define all(x) x.begin(),x.end()
- #define gnl cout << endl
- #define olar cout << "olar" << endl
- #define fastio ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
- typedef long long int ll;
- typedef pair<int,int> pii;
- typedef vector<int> vi;
- typedef vector<pii> vii;
- typedef pair<ll,ll> pll;
- const int INF = 0x3f3f3f3f;
- const ll llINF = 0x3f3f3f3f3f3f3f;
- const int MOD = 1e9+7;
- long double memo[100100][2][2][2][2];
- point A,B;
- int cc;
- int n;
- vector<point> v;
- /*
- memo[i][j][k][l][h]:
- ponto i;
- projetei o v_0;
- projetei o v_{i-2};
- projetei o v_{i-1};
- area > 0;
- bool 1 = B
- 0 = A
- */
- long double pd(int i,int pri,int pen,int ult, int posi){
- point a,b;
- if(pen == 0) a = v[i-2] + A;
- else a = v[i-2] + B;
- if(ult == 0) b = v[i-1] + A;
- else b = v[i-1] + B;
- a=a/2;b=b/2;
- point v0;
- if(pri == 0) v0 = v[0] + A;
- else v0 = v[0] + B;
- v0=v0/2;
- if(i == n){
- if(signal((b-a).cross(v0 - b))*cc < 0) return (long double)llINF;
- if(posi == 1) return (long double)0;
- else return (long double)llINF;
- }
- long double& pdm = memo[i][pri][pen][ult][posi];
- if(signal(pdm + 1) > 0) return pdm;
- pdm = (long double)llINF;
- point tentA,tentB;
- tentA = v[i] + A;
- tentB = v[i] + B;
- tentA = tentA/2;
- tentB = tentB/2;
- if(signal((b - a).cross(tentA - b))*cc >= 0){
- long double area = abs((b - v0).cross(tentA - v0));
- int p;
- if (posi > 0 || signal(area) > 0) p = 1;
- else p = 0;
- pdm = min(pdm, area + pd(i + 1,pri,ult,0,p));
- dbg(pdm);
- }
- if(signal((b - a).cross(tentB - b))*cc >= 0){
- long double area = abs((b - v0).cross(tentB - v0));
- int p;
- if (posi > 0 || signal(area) > 0) p = 1;
- else p = 0;
- pdm = min(pdm, area + pd(i + 1,pri,ult,1,p));
- dbg(pdm);
- }
- //if(signal(pdm) < 0) pdm = (long double)llINF;
- return pdm;
- }
- int main(){
- fastio;
- cout << setprecision(3) << fixed;
- cin >> n;
- fr(i,n){
- point p;
- cin >> p.x >> p.y;
- v.pb(p);
- }
- fr(i,n){
- if(signal((v[1] - v[0]).cross(v[i] - v[1])) != 0){
- cc = signal((v[1] - v[0]).cross(v[i] - v[1]));
- break;
- }
- }
- cin >> A.x >> A.y >> B.x >> B.y;
- long double ans = (long double)llINF;
- ms(memo,-1);
- ans = min(ans,pd(2,0,0,0,0));
- dbg(ans);
- //return 0;
- ans = min(ans,pd(2,1,1,0,0));
- ans = min(ans,pd(2,0,0,1,0));
- ans = min(ans,pd(2,1,1,1,0));
- reverse(all(v));
- ms(memo,-1);
- ans = min(ans,pd(2,0,0,0,0));
- ans = min(ans,pd(2,1,1,0,0));
- ans = min(ans,pd(2,0,0,1,0));
- ans = min(ans,pd(2,1,1,1,0));
- ans*= 4;
- ans += 0.5;
- ans = (ll)ans;
- cout << ans/8 << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement