zoukankan      html  css  js  c++  java
  • 杭电oj初体验之 Code

    PLA算法:

    https://blog.csdn.net/red_stone1/article/details/70866527

     The problem:

    Analysis:

    题目链接可见:https://vjudge.net/contest/313395#problem/M

    Reference codes:

      1 #include <cstdio>
      2 #include <vector>
      3 #include <iostream>
      4 #include <algorithm>
      5 using namespace std;
      6 
      7 const int N = 105;
      8 
      9 int n;
     10 
     11 int sgn(long long x) {
     12     return (x > 0) - (x < 0);
     13 }
     14 
     15 struct P {
     16     long long d[3];
     17     long long& operator[](int x) {
     18         return d[x];
     19     }
     20     P () {}
     21     P (long long a, long long b, long long c) {
     22         d[0] = a; d[1] = b; d[2] = c;
     23     }
     24 };
     25 
     26 struct node {
     27     P x;
     28     int y;
     29 } p[N];
     30 
     31 P operator+(P a, P b) {
     32     P c;
     33     for (int i = 0; i < 3; i++)
     34         c[i] = a[i] + b[i];
     35     return c;
     36 }
     37 
     38 P operator-(P a, P b) {
     39     P c;
     40     for (int i = 0; i < 3; i++)
     41         c[i] = a[i] - b[i];
     42     return c;
     43 }
     44 
     45 P operator*(int a, P b) {
     46     P c;
     47     for (int i = 0; i < 3; i++)
     48         c[i] = a * b[i];
     49     return c;
     50 }
     51 
     52 bool operator<(P a, P b) {
     53     return a[1] < b[1] || (a[1] == b[1] && a[2] < b[2]);
     54 }
     55 
     56 long long operator*(P a, P b) {
     57     return a[1] * b[2] - a[2] * b[1];
     58 }
     59 
     60 long long operator^(P a, P b) {
     61     return a[1] * b[1] + a[2] * b[2];
     62 }
     63 
     64 long long det(P a, P b, P c) {
     65     return (b - a) * (c - a);
     66 }
     67 
     68 struct L {
     69     P a, b;
     70     L () {}
     71     L (P x, P y) {
     72         a = x; b = y;
     73     }
     74 };
     75 
     76 bool onSeg(P p, L s) {
     77     return sgn(det(p, s.a, s.b)) == 0 && sgn((s.a - p) ^ (s.b - p)) <= 0;
     78 }
     79 
     80 vector<P> convex(vector<P> p) {
     81     vector<P> ans, S;
     82     for (int i = 0; i < p.size(); i++) {
     83         while (S.size() >= 2
     84                 && sgn(det(S[S.size() - 2], S.back(), p[i])) <= 0)
     85                     S.pop_back();
     86         S.push_back(p[i]);
     87     }
     88     ans = S;
     89     S.clear();
     90     for (int i = (int)p.size() - 1; i >= 0; i--) {
     91         while (S.size() >= 2
     92                 && sgn(det(S[S.size() - 2], S.back(), p[i])) <= 0)
     93                     S.pop_back();
     94         S.push_back(p[i]);
     95     }
     96     for (int i = 1; i + 1 < S.size(); i++)
     97         ans.push_back(S[i]);
     98     return ans;
     99 }
    100 
    101 bool PointInPolygon(P p, vector<P> poly) {
    102     int cnt = 0;
    103     for (int i = 0; i < poly.size(); i++) {
    104         if (onSeg(p, L(poly[i], poly[(i + 1) % poly.size()]))) return true;
    105         int k = sgn(det(poly[i], poly[(i + 1) % poly.size()], p));
    106         int d1 = sgn(poly[i][2] - p[2]);
    107         int d2 = sgn(poly[(i + 1) % poly.size()][2] - p[2]);
    108         if (k > 0 && d1 <= 0 && d2 > 0) cnt++;
    109         if (k < 0 && d2 <= 0 && d1 > 0) cnt--;
    110     }
    111     if (cnt != 0) return true;
    112     return false;
    113 }
    114 
    115 bool SegmentIntersection(L l1, L l2) {
    116     long long c1 = det(l1.a, l1.b, l2.a), c2 = det(l1.a, l1.b, l2.b);
    117     long long c3 = det(l2.a, l2.b, l1.a), c4 = det(l2.a, l2.b, l1.b);
    118     if (sgn(c1) * sgn(c2) < 0 && sgn(c3) * sgn(c4) < 0) return true;
    119     if (sgn(c1) == 0 && onSeg(l2.a, l1)) return true;
    120     if (sgn(c2) == 0 && onSeg(l2.b, l1)) return true;
    121     if (sgn(c3) == 0 && onSeg(l1.a, l2)) return true;
    122     if (sgn(c4) == 0 && onSeg(l1.b, l2)) return true;
    123     return false;
    124 }
    125 
    126 bool ConvexHullDivide(vector<P> p1, vector<P> p2) {
    127     for (int i = 0; i < p1.size(); i++)
    128         if (PointInPolygon(p1[i], p2))
    129             return false;
    130     for (int i = 0; i < p2.size(); i++)
    131         if (PointInPolygon(p2[i], p1))
    132             return false;
    133     for (int i = 0; i < p1.size(); i++)
    134         for (int j = 0; j < p2.size(); j++)
    135             if (SegmentIntersection(L(p1[i], p1[(i + 1) % p1.size()]), L(p2[j], p2[(j + 1) % p2.size()])))
    136                 return false;
    137     return true;
    138 }
    139 
    140 bool check() {
    141     vector<P> p1, p2;
    142     for (int i = 1; i <= n; i++) {
    143         if (p[i].y == 1)
    144             p1.push_back(p[i].x);
    145         else
    146             p2.push_back(p[i].x);
    147     }
    148     vector<P> c1, c2;
    149     c1 = convex(p1);
    150     c2 = convex(p2);
    151     if (ConvexHullDivide(c1, c2)) return true;
    152     return false;
    153 }
    154 
    155 int f(P w, P x) {
    156     long long sum = 0;
    157     for (int i = 0; i < 3; i++)
    158         sum += w[i] * x[i];
    159     return sgn(sum);
    160 }
    161 
    162 void PLA() {
    163     P w = P(0, 0, 0);
    164     int i = 1, cnt = 0;
    165     long long cc = 0;
    166     while (true) {
    167         cc++;
    168         if (f(w, p[i].x) != p[i].y) {
    169             w = w + p[i].y * p[i].x;
    170             cnt = 0;
    171         }
    172         else {
    173             if (++cnt == n) break;
    174         }
    175         i = i + 1;
    176         if (i > n) i -= n;
    177     }
    178     cout << cc << endl;
    179 }
    180 
    181 int main() {
    182     int testcase;
    183     cin >> testcase;
    184     while (testcase--) {
    185         cin >> n;
    186         for (int i = 1; i <= n; i++) {
    187             cin >> p[i].x[1] >> p[i].x[2] >> p[i].y;
    188             p[i].x[0] = 1;
    189         }
    190         if (!check())
    191             puts("Infinite loop!");
    192         else {
    193             puts("Successful!");
    194         }
    195     }
    196     return 0;
    197 }
  • 相关阅读:
    titanium开发教程0206创建多行的选择器
    titanium开发教程0210创建的文本字段与嵌入的按钮
    titanium开发教程0209配置文本域和文本区键盘类型
    titanium开发教程0301理解tab group
    titanium开发教程0205创建单行的选择器
    linux shell删除文本每行末尾的单个或者多个空格或者制表符
    R语言中scale函数的用法
    R语言中批量提取当前目录中指定类型的文件
    python中提取包含指定字符的行、提取以指定字符开头、指定字符结尾的行
    python中如何统计文件的行数
  • 原文地址:https://www.cnblogs.com/dragondragon/p/11225442.html
Copyright © 2011-2022 走看看