Advertisement
Guest User

Untitled

a guest
May 23rd, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.77 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <vector>
  4.  
  5.  
  6.  
  7. #define nmax 810
  8. #define pb push_back
  9. #define f first
  10. #define s second
  11. #define mp make_pair
  12. using namespace std;
  13.  
  14. struct point {int x, y;};
  15. vector <pair <point, point> > seg;
  16. vector <pair <int, int> > BEG;
  17. vector <pair <int, int> > D [nmax];
  18. vector <pair <point, point> > PP [nmax];
  19. point ins [nmax], P1 , P2 ;
  20. int n, m, nrbenzi;
  21. //Beg - cbin1, D - cbin2;
  22. inline bool cmp (const point &a, const point &b) {
  23.     return a.x == b.x ? (a.y < b.y) : (a.x < b.x);
  24. }
  25. inline int det (int x1, int x2, int y1, int y2, int a) {
  26.     return ((y2 - y1) +y1 *( (a - x1) * (x2 - x1)) / ((a - x1) * (x2 - x1)));
  27. }
  28. double ceas_trig (point p0, point p1, point p2) {
  29.     return ((p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y));
  30. }
  31. void preproc ()
  32. {  
  33.     int i;
  34.     int mijx, mijy;
  35.     point bx1, bx2;
  36.     // |
  37.     BEG.pb (mp (0, seg [0].f.x));
  38.     for (nrbenzi = 2; nrbenzi <= n; nrbenzi++)
  39.     {
  40.         // |extract* * * * coordx|
  41.         bx1 = ins [nrbenzi - 1];
  42.         bx2 = ins [nrbenzi];
  43.         while (nrbenzi <= n && ins [nrbenzi].x == ins [nrbenzi + 1].x) ++nrbenzi;
  44.         printf ("BX %d %d %d %d BX\n", bx1.x, bx1.y, bx2.x, bx2.y);
  45.         for (i = 0; i < n; i++) {
  46.             if (seg [i].f.x >= bx2.x || seg [i].s.x <= bx1.x) continue;// | |
  47.             if (seg [i].f.x <= bx2.x && seg [i].s.x >= bx1.x) { // | - |
  48.                
  49.                 if (seg [i].s.x < bx2.x) { // | -|
  50.                     if (seg [i].f.x < bx1.x) {//-|- |
  51.                         mijx = seg [i].s.x + bx1.x >> 1;
  52.                                                 mijy = det (seg [i].f.x, seg [i].f.y, seg [i].s.x, seg [i].s.y, bx1.x);
  53.                         mijy >>= 1;
  54.                         D [BEG.size () + 1].pb (mp (mijx, mijy));
  55.                         PP [BEG.size () + 1].pb (mp (seg [i].f, seg [i].s));
  56.                         //printf ("****%d %d***\n", seg [i].f.x, bx1.x);
  57.                     } else { // |-|
  58.                         mijx = seg [i].s.x + seg [i].f.x >> 1;
  59.                         mijy = seg [i].s.y + seg [i].f.y >> 1;
  60.                         D [BEG.size () + 1].pb (mp (mijx, mijy));
  61.                         PP [BEG.size () + 1].pb (mp (seg [i].f, seg [i].s));
  62.                     }
  63.                 }
  64.                 else if (seg [i].s.x > bx2.x) {
  65.                     mijy = det (seg [i].f.x, seg [i].f.y, seg [i].s.x, seg [i].s.y, bx1.x);
  66.                     mijx = bx2.x + seg [i].f.x >> 1;
  67.                     mijy >>= 1;
  68.                     D [BEG.size () + 1].pb (mp (mijx, mijy));//printf ("?!?@?@#?\n");
  69.                     PP [BEG.size () + 1].pb (mp (seg [i].f, seg [i].s));
  70.                 }
  71.             }
  72.         }
  73.         if (D [nrbenzi].size ()) {
  74.             printf ("Mij beg*******************\n");
  75.             for (i = 0; i < D [nrbenzi].size (); i++) printf ("%d %d, ", D [nrbenzi][i].f, D [nrbenzi][i].s);
  76.             printf ("\nmij end***************************************\n");
  77.         }
  78.         BEG.pb (mp (bx1.x, bx2.x)); // aici cauti binar 1
  79.     }
  80. }
  81. inline int bin1_search (int x, int y)
  82. {  
  83.     int st, dr, mij;
  84.     for (st = 1, dr = m, mij = st + dr >> 1; st <= dr; mij = st + dr >> 1) {
  85.         if (BEG [mij].f <= x && BEG [mij].s >= x) return mij;
  86.         else if (BEG [mij].f > x) dr = mij - 1;
  87.         else if (BEG [mij].s < x) st = mij + 1;
  88.     }
  89.     return 1;
  90. }
  91. inline int funct (point P1, point P2, int x1, int y1)
  92. {  
  93.     point P3;
  94.     P3.x = x1; P3.y = y1;
  95.     return ceas_trig (P1, P2, P3);
  96. }  
  97. inline int bin2_search (int band, int x, int y)
  98. {  
  99.     int sol, soll = 1, st, dr, mij;
  100.     for (st = 0, dr = D [band].size (), mij = st + dr >> 1; st <= dr; mij = st + dr >> 1) {
  101.         sol = funct (PP [band][mij].f, PP [band][mij].s, x, y);
  102.         if (sol > 0) {
  103.             soll = mij;
  104.             dr = mij - 1;
  105.         }
  106.         else if (sol < 0) st = mij + 1;
  107.     }
  108.     return soll;
  109. }
  110. int main () {
  111.     int i, a, b, band, nr = 0;
  112.     freopen ("poligon.in", "r", stdin);
  113.     freopen ("poligon.out", "w", stdout);
  114.    
  115.     scanf ("%d%d\n", &n, &m);
  116.     scanf ("%d%d\n", &ins [1].x, &ins [1].y);
  117.    
  118.     //seg.pb (mp (P1, P2)); //seg.pb (mp (P1, P2));
  119.     for (i = 2; i <= n; i++) {
  120.         scanf ("%d%d\n", &ins [i].x, &ins [i].y);
  121.         P1.x = ins [i - 1].x;
  122.         P1.y = ins [i - 1].y;
  123.         P2.x = ins [i].x;
  124.         P2.y = ins [i].y;
  125.         if (P1.x > P2.x) seg.pb (mp (P2, P1));
  126.         else seg.pb (mp (P1, P2));
  127.     }if (ins [n].x > ins [1].x) seg.pb (mp (ins [1], ins [n]));
  128.     else seg.pb (mp (ins [n], ins [1]));
  129.     for (i = 0; i < n; i++)
  130.         printf ("%d %d %d %d\n", seg [i].f.x, seg [i].f.y, seg [i].s.x, seg [i].s.y);
  131.     //sort (seg.begin (), seg.end (), cmp);
  132.     sort (ins + 1, ins + n + 1, cmp);
  133.     for (i = 1; i <= n; i++)
  134.         printf ("%d %d\n", ins [i].x, ins [i].y);
  135.     printf ("---------------------------------------\n");
  136.     preproc ();
  137.     printf ("********************************************************\n");
  138.     m = BEG.size ();
  139.     for (i = 0; i < BEG.size (); i++)
  140.         for (int j = 0; j < PP [i].size (); j++)
  141.             printf ("%d %d %d %d\n", PP [i][j].f.x,PP [i][j].f.y, PP [i][j].s.x, PP [i][j].s.y);
  142.     /*while (m--) {
  143.         scanf ("%d%d\n", &a, &b);
  144.         band = bin1_search (a, b);
  145.         i = bin2_search (band, a, b);
  146.         if (i & 1) { printf ("ESTE\n");++nr;}
  147.         else printf ("NU ESTE\n");
  148.     }*/
  149.     //for (i = 1; i <= nrbenzi; i++) printf ("%d %d\n", V [i].x, V [i].y);
  150.     return 0;
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement