zoukankan      html  css  js  c++  java
  • bupt summer training for 16 #2 ——计算几何

    https://vjudge.net/contest/171368#overview

    A.一个签到题,用叉积来判断一个点在一条线的哪个方向

    可以二分,数据范围允许暴力

     1 #include <cstdio>
     2 
     3 struct point {
     4     int x, y;
     5 }a[5010];
     6 
     7 int n, m, x[2], y[2], c[5010];
     8 
     9 int _cross(const point &A, const point &B) {
    10     return A.x * B.y - A.y * B.x;
    11 }
    12 
    13 int main() {
    14     while(scanf("%d %d %d %d %d %d", &n, &m, &x[0], &y[0], &x[1], &y[1]) != EOF) {
    15         if(n == 0) break;
    16         c[0] = 0;
    17         for(int i = 1;i <= n;i ++)
    18             scanf("%d %d", &a[i].x, &a[i].y), c[i] = 0;
    19         for(int X, Y, l, r, mid, ans, i = 1;i <= m;i ++) {
    20             scanf("%d %d", &X, &Y);
    21             if(_cross((point){a[1].x - a[1].y, y[0] - y[1]}, (point){X - a[1].y, Y - y[1]}) > 0) c[0] ++;
    22             else {
    23                 l = 1, r = n;
    24                 while(l <= r) {
    25                     mid = (l + r) >> 1;
    26                     if(_cross((point){a[mid].x - a[mid].y, y[0] - y[1]}, (point){X - a[mid].y, Y - y[1]}) < 0) ans = mid, l = mid + 1;
    27                     else r = mid - 1;
    28                 }
    29                 c[ans] ++;
    30             }
    31         }
    32         for(int i = 0;i <= n;i ++)
    33             printf("%d: %d
    ", i, c[i]);
    34         puts("");
    35     }
    36 }
    View Code

    B.横边和竖边都与对角线等价,很容易猜到最终的最优路线有等价变形

    我们把所有边都等价为斜边,就会得到一个矩形

    矩形四条边的斜率绝对值都为1

    纵截距可以比较得到

    可以发现我们要求的所谓周长

    其实等价于最左边点和最右边点的横坐标之差

    (或者最上边点与最下面点的纵坐标之差,这俩是相等的)

    两个点的横坐标可以用直线联立得到

    需要向外拓宽,+4即可

    于是就得到了一个很简单又很妙的解法

    1 n = input()
    2 a = b = c = d = -6666666
    3 for i in range(n):
    4     x, y = map(int, raw_input().split())
    5     a = max(a, x + y)
    6     b = max(b, x - y)
    7     c = max(c, y - x)
    8     d = max(d, - x - y)
    9 print a + b + c + d + 4

    还有一个没有发现等价的凸包做法

    凸包做法作重要的就是如何处理向外拓展

    有一个思路就是每个点都拆成上下左右4个点

    对这 4*n 个点做凸包再求周长

    重点就是点的坐标到1e6,叉积的话,要开long long啊朋友!

     1 #include <cstdio>
     2 #include <algorithm>
     3 
     4 using std::max;
     5 
     6 const int maxn = 400010;
     7 
     8 typedef long long ll;
     9 
    10 struct point {
    11     ll x, y;
    12     bool operator < (const point &a) const {
    13         if(x != a.x) return x < a.x;
    14         return y < a.y;
    15     }
    16     point operator - (const point &a) const {
    17         return (point){x - a.x, y - a.y};
    18     }
    19 }p[maxn], q[maxn];
    20 
    21 int abs(int x, int y) {
    22     return x > y ? x - y : y - x;
    23 }
    24 
    25 int dis(const point &a, const point &b) {
    26     return max(abs(a.x - b.x), abs(a.y - b.y));
    27 }
    28 
    29 ll _cross(const point &a, const point &b) {
    30     return a.x * b.y - a.y * b.x;
    31 }
    32 
    33 int n0, n, N;
    34 
    35 long long ans;
    36 
    37 int convexhull() {
    38     int m = 0;
    39     std::sort(p, p + n);
    40     for(int i = 0;i < n;i ++) {
    41         while(m > 1 && _cross(q[m - 1] - q[m - 2], p[i] - q[m - 2]) <= 0) m --;
    42         q[m ++] = p[i];
    43     }
    44     for(int k = m, i = n - 2;i >= 0;i --) {
    45         while(m > k && _cross(q[m - 1] - q[m - 2], p[i] - q[m - 2]) <= 0) m --;
    46         q[m ++] = p[i];
    47     }
    48     return m - 1;
    49 }
    50 
    51 int main() {
    52     scanf("%d", &n0);
    53     for(int x, y, i = 0;i < n0;i ++) {
    54         scanf("%d %d", &x, &y);
    55         p[n ++] = (point){x + 1, y};
    56         p[n ++] = (point){x - 1, y};
    57         p[n ++] = (point){x, y + 1};
    58         p[n ++] = (point){x, y - 1};
    59     }
    60     N = convexhull(), q[N] = q[0];
    61     for(int i = 1;i <= N;i ++) ans += dis(q[i], q[i - 1]);
    62     printf("%lld", ans);
    63     return 0;
    64 }
    View Code

    C.非常没意思的签到题,水了发Java

    发现大多OJ(cf除外)都会要求Java的public类名必须为Main

     1 import java.util.Scanner;
     2 
     3 public class Main {
     4     public static void main(String []args) {
     5         Scanner input = new Scanner(System.in);
     6         double c, a, i;
     7         String s;
     8         while(true) {
     9             c = input.nextDouble();
    10             if(c == 0.0) break;
    11             for(i = 1, a = 0;;i ++) {
    12                 a += 1 / (i + 1);
    13                 if(a >= c) {
    14                     s = String.format("%.0f", i);
    15                     System.out.println(s + " card(s)");
    16                     break;
    17                 }
    18             }
    19         }
    20     }
    21 }
    View Code

    D.反正就是枚举所有球算出能否接触

    需要的时间最短的就是会碰到的那个

    重点在于如何求出反射后的方向向量

    求向量a关于向量b的对称向量a'的话

    可以利用一个性质

    假设c为a在b上的投影向量

    那有a + a' = 2c

    c = ab / b.length / b.length * b

    原题OJ挂了评测结果未知,先把Java代码放上来

     1 import java.util.Scanner;
     2 
     3 public class D {
     4     static double sqr(double x) {
     5         return x * x;
     6     }
     7     static class point {
     8         double x, y, z;
     9         point() {
    10             x = y = z = 0;
    11         }
    12         point(double x_, double y_, double z_) {
    13             x = x_;
    14             y = y_;
    15             z = z_;
    16         }
    17         point(point a) {
    18             x = a.x;
    19             y = a.y;
    20             z = a.z;
    21         }
    22     };
    23     static class circle extends point{
    24         double r;
    25         circle() {
    26             x = y = r = z = 0;
    27         }
    28     };
    29     static double length(point a) {
    30         return Math.sqrt(sqr(a.x) + sqr(a.y) + sqr(a.z));
    31     }
    32     public static void main(String []args) {
    33         Scanner input = new Scanner(System.in);
    34         int t, n = input.nextInt();
    35         point s = new point();
    36         point d = new point();
    37         point tmp = new point(), nex = new point();
    38         circle[] a = new circle[100];
    39         for(int i = 1;i <= n;i ++) {
    40             a[i] = new circle();
    41             a[i].x = input.nextDouble();
    42             a[i].y = input.nextDouble();
    43             a[i].z = input.nextDouble();
    44             a[i].r = input.nextDouble();
    45         }
    46         s.x = input.nextDouble();
    47         s.y = input.nextDouble();
    48         s.z = input.nextDouble();
    49         d.x = input.nextDouble();
    50         d.y = input.nextDouble();
    51         d.z = input.nextDouble();
    52         double A = sqr(d.x) + sqr(d.y) + sqr(d.z), B, C, test;
    53         double x, x1, x2, dis;
    54         int last = -1;
    55         for(int k = 1;;k ++) {
    56             if(k > 10) {
    57                 System.out.println("etc.");
    58                 break;
    59             }
    60             t = -1;
    61             dis = 0.0;
    62             for(int i = 1;i <= n;i ++) {
    63                 if(i == last) continue;
    64                 B = (d.x * (s.x - a[i].x) + d.y * (s.y - a[i].y) + d.z * (s.z - a[i].z)) * 2;
    65                 C = sqr(s.x - a[i].x) + sqr(s.y - a[i].y) + sqr(s.z - a[i].z) - sqr(a[i].r);
    66                 test = sqr(B) - A * C * 4;
    67                 if(test < 0) continue;
    68                 else {
    69                     x1 = (Math.sqrt(test) - B) / (A * 2);
    70                     x2 = (-Math.sqrt(test) - B) / (A * 2);
    71                     if(x1 < 0 && x2 < 0) continue;
    72                     else {
    73                         if(x2 >= 0) x = x2;
    74                         else x = x1;
    75                         if(x < dis || t == -1) {
    76                             t = i;
    77                             dis = x;
    78                             tmp = new point(s.x + d.x * x, s.y + d.y * x, s.z + d.z * x);
    79                             point tmp1 = new point(tmp.x - d.x - a[i].x, tmp.y - d.y - a[i].y, tmp.z - d.z - a[i].z);
    80                             point tmp2 = new point(tmp.x - a[i].x, tmp.y - a[i].y, tmp.z - a[i].z);
    81                             double tmp3 = (tmp1.x * tmp2.x + tmp1.y * tmp2.y + tmp1.z * tmp2.z) / length(tmp2) / length(tmp2);
    82                             nex = new point(tmp3 * tmp2.x * 2 - tmp1.x - tmp2.x, tmp3 * tmp2.y * 2 - tmp1.y - tmp2.y, tmp3 * tmp2.z * 2 - tmp1.z - tmp2.z);
    83                         } 
    84                     }
    85                 }
    86             }
    87             if(t == -1) break;
    88             System.out.printf("%d ", t);
    89             last = t;
    90             s = new point(tmp);
    91             d = new point(nex);
    92         }
    93     }
    94 }
    View Code

    E.这个题...数学方法无从下手

    我们可以考虑二分...考虑二分的重点在于

    先观察是否满足单调性再看能不能写出judge函数

    因为单调性决定了能我们是否应该坚持考虑如何写judge

    先确定其中一个圆的半径

    再根据与两边和第一个圆相切求另外两圆半径

    再判断两圆相切相离相交

    单调性是显而易见的,第一个圆半径太大,另外两圆相离

    太小则相交

    精度正常比要求小数位高2-4位就差不多

    二分左边界为0,右边界我开的是内切圆半径

    (推得式子太长了,所以写的也又臭又长)

      1 import java.util.Scanner;
      2 
      3 public class E {
      4     static class point {
      5         double x, y;
      6         point() { 
      7             x = y = 0;
      8         }
      9         point(double x_, double y_) {
     10             x = x_;
     11             y = y_;
     12         }
     13     };
     14     static final double pi = Math.acos(-1.0);
     15     static final double eps = 1e-10;
     16     static point[] p = new point[3];
     17     static point dec(point a, point b) {
     18         return new point(a.x - b.x, a.y - b.y);
     19     }
     20     static point inc(point a, point b) {
     21         return new point(a.x + b.x, a.y + b.y);
     22     }
     23     static double dot(point a, point b) {
     24         return a.x * b.x + a.y * b.y;
     25     } 
     26     static double sqr(double x) {
     27         return  x * x;
     28     }
     29     static double length(point a) {
     30         return Math.sqrt(dot(a, a));
     31     }
     32     static point unitp(point a) {
     33         double len = length(a);
     34         return new point(a.x / len, a.y / len);
     35     }
     36     static double cross(point a, point b) {
     37         return a.x * b.y - a.y * b.x;
     38     }
     39     static double calc(double A, double B, double C) {
     40         double test = sqr(B) - A * C * 4;
     41         if(test < 0) return -1;
     42         test = Math.sqrt(test);
     43         double x1 = (- B + test) / (A * 2);
     44         double x2 = (- B - test) / (A * 2);
     45         if(x1 > 0) return x1;
     46         if(x2 > 0) return x2;
     47         return -1;
     48     }
     49     static void Solve(double l, double r) {
     50         double t1, t2, t3, r1, r2, r3, A, B, C, D, flag;
     51         point c1, c2, c3, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
     52         r1 = r2 = r3 = 0;
     53         c1 = new point();
     54         for(int tt = 1;tt <= 66;tt ++) {
     55             r1 = (l + r) / 2;
     56             flag = 0;
     57             tmp1 = unitp(dec(p[1], p[0]));
     58             tmp2 = unitp(dec(p[2], p[0]));
     59             tmp3 = inc(tmp1, tmp2);
     60             t3 = Math.acos(dot(tmp1, tmp2) / length(tmp1) / length(tmp2));
     61             t1 = r1 / (Math.sin(t3 / 2));
     62             t2 = length(tmp3);
     63             c1 = inc(p[0], new point(t1 / t2 * tmp3.x, t1 / t2 * tmp3.y));
     64             
     65             tmp1 = unitp(dec(p[0], p[1]));
     66             tmp2 = unitp(dec(p[2], p[1]));
     67             tmp3 = inc(tmp1, tmp2);
     68             tmp4 = dec(c1, p[1]);
     69             t3 = Math.acos(dot(tmp1, tmp2) / length(tmp1) / length(tmp2));
     70             t1 = Math.sin(t3 / 2);
     71             t2 = length(tmp3);
     72             A = sqr(t1 * t2) - sqr(t2);
     73             B = (t1 * t2 * r1 + dot(tmp3, tmp4)) * 2;
     74             C = sqr(r1) - dot(tmp4, tmp4); 
     75             D = calc(A, B, C);
     76             if(D == -1) flag = 1;
     77             c2 = inc(p[1], new point(D * tmp3.x, D * tmp3.y));
     78             r2 = t1 * length(new point(D * tmp3.x, D * tmp3.y));
     79             
     80             tmp1 = unitp(dec(p[0], p[2]));
     81             tmp2 = unitp(dec(p[1], p[2]));
     82             tmp3 = inc(tmp1, tmp2);
     83             tmp4 = dec(c1, p[2]);
     84             t3 = Math.acos(dot(tmp1, tmp2) / length(tmp1) / length(tmp2));
     85             t1 = Math.sin(t3 / 2);
     86             t2 = length(tmp3);
     87             A = sqr(t1 * t2) - sqr(t2);
     88             B = (t1 * t2 * r1 + dot(tmp3, tmp4)) * 2;
     89             C = sqr(r1) - dot(tmp4, tmp4); 
     90             D = calc(A, B, C);
     91             if(D == -1) flag = 1;
     92             c3 = inc(p[2], new point(D * tmp3.x, D * tmp3.y));
     93             r3 = t1 * length(new point(D * tmp3.x, D * tmp3.y));
     94             if(flag == 1 || sqr(c2.x - c3.x) + sqr(c2.y - c3.y) > sqr(r2 + r3)) r = r1 - eps;
     95             else l = r1 + eps;
     96         }
     97         System.out.printf("%.6f %.6f %.6f
    ", r1, r2, r3);
     98     }
     99     public static void main(String []args) {
    100         Scanner input = new Scanner(System.in);
    101         for(int i = 0;i < 3;i ++) p[i] = new point();
    102         while(true) {
    103             for(int i = 0;i < 3;i ++) {
    104                 p[i].x = input.nextDouble();
    105                 p[i].y = input.nextDouble();
    106             }
    107             if(length(p[0]) == 0 && length(p[1]) == 0 && length(p[2]) == 0) break;
    108             Solve(0, Math.abs(cross(dec(p[1], p[0]), dec(p[2], p[0]))) / (length(dec(p[1], p[0])) + length(dec(p[2], p[0])) + length(dec(p[1], p[2]))));
    109         }    
    110     }
    111 }
    View Code

    维基上有公式,戳这里 

    l里面是关于这个问题的历史...仍然没有给出推导或者证明...

    所以代码去看别人的题解就好了,反正也记不住公式hhh

    F.一个很裸的矩形周长并,现场只带了矩形面积并的板子

    魔改了好久才改对成周长并的板子...所以重写了一发

    重点是数据范围居然支持暴力啊淦!暴力艹正解啦,夭寿啦!

    (理解的一个关键在与线段树的叶子节点也都是一个线段!)

     1 #include <cstdio>
     2 #include <algorithm>
     3 
     4 #define rep(i, j, k) for(int i = j;i <= k;i ++)
     5 
     6 using namespace std;
     7 
     8 const int maxn = 20010;
     9 
    10 int n, k1, k2, tot1, tot2;
    11 
    12 int ans, a1[maxn], a2[maxn], sum[maxn], cnt[maxn];
    13 
    14 struct node {
    15     int x, y, c, d;
    16     bool operator < (const node &a) const {
    17         return c < a.c;
    18     }
    19 }line1[maxn], line2[maxn];
    20 
    21 void modify1(int o, int l, int r, int s, int t, int k, int p) {
    22     if(s <= l && r <= t) {
    23         cnt[o] += k;
    24         if(cnt[o]) ans += p * (a1[r + 1] - a1[l] - sum[o]), sum[o] = a1[r + 1] - a1[l];
    25         else if(l == r) ans += p * (a1[r + 1] - a1[l]), sum[o] = 0;
    26         else ans += p * (sum[o] - (sum[o << 1] + sum[o << 1 | 1])), sum[o] = sum[o << 1] + sum[o << 1 | 1];
    27      }
    28      else {
    29          int mid = (l + r) >> 1;
    30          if(cnt[o]) p = 0;
    31          if(s <= mid) modify1(o << 1, l, mid, s, t, k, p);
    32          if(t > mid) modify1(o << 1 | 1, mid + 1, r, s, t, k, p);
    33          if(!cnt[o]) sum[o] = sum[o << 1] + sum[o << 1 | 1];
    34      }
    35 }
    36 
    37 void modify2(int o, int l, int r, int s, int t, int k, int p) {
    38     if(s <= l && r <= t) {
    39         cnt[o] += k;
    40         if(cnt[o]) ans += p * (a2[r + 1] - a2[l] - sum[o]), sum[o] = a2[r + 1] - a2[l];
    41         else if(l == r) ans += p * (a2[r + 1] - a2[l]), sum[o] = 0;
    42         else ans += p * (sum[o] - (sum[o << 1] + sum[o << 1 | 1])), sum[o] = sum[o << 1] + sum[o << 1 | 1];
    43      }
    44      else {
    45          int mid = (l + r) >> 1;
    46          if(cnt[o]) p = 0;
    47          if(s <= mid) modify2(o << 1, l, mid, s, t, k, p);
    48          if(t > mid) modify2(o << 1 | 1, mid + 1, r, s, t, k, p);
    49          if(!cnt[o]) sum[o] = sum[o << 1] + sum[o << 1 | 1];
    50      }
    51 }
    52 
    53 int main() {
    54     k1 = k2 = 1;
    55     int l, r, x[2], y[2];
    56     scanf("%d", &n);
    57     rep(i, 1, n) {
    58         rep(j, 0, 1) scanf("%d %d", &x[j], &y[j]);
    59         line1[++ tot1] = (node){x[0], x[1], y[0], 1}, a1[tot1] = x[0];
    60         line1[++ tot1] = (node){x[0], x[1], y[1],-1}, a1[tot1] = x[1];
    61         line2[++ tot2] = (node){y[0], y[1], x[0], 1}, a2[tot2] = y[0];
    62         line2[++ tot2] = (node){y[0], y[1], x[1],-1}, a2[tot2] = y[1];
    63     }
    64     sort(line1 + 1, line1 + tot1 + 1), sort(a1 + 1, a1 + tot1 + 1);
    65     sort(line2 + 1, line2 + tot2 + 1), sort(a2 + 1, a2 + tot2 + 1);
    66     rep(i, 2, tot1) {
    67         if(a1[i] != a1[k1])
    68             a1[++ k1] = a1[i];
    69         if(a2[i] != a2[k2])
    70             a2[++ k2] = a2[i];
    71     }
    72     rep(i, 1, tot1) {
    73         l = lower_bound(a1 + 1, a1 + k1 + 1, line1[i].x) - a1;
    74         r = lower_bound(a1 + 1, a1 + k1 + 1, line1[i].y) - a1 - 1;
    75         modify1(1, 1, k1 - 1, l, r, line1[i].d, 1);
    76     }
    77     rep(i, 1, tot2) {
    78         l = lower_bound(a2 + 1, a2 + k2 + 1, line2[i].x) - a2;
    79         r = lower_bound(a2 + 1, a2 + k2 + 1, line2[i].y) - a2 - 1;
    80         modify2(1, 1, k2 - 1, l, r, line2[i].d, 1);
    81     }
    82     printf("%d", ans);
    83     return 0;
    84 }
    View Code

     G.有多种图形,一个比较蠢的思路就是给每个图形造一个类...

    但是思考一下,判断不同的图形相交,其实还是在判断边相交

    所以都转换成判断线段相交就好了...

    (附:如果使用scanf的格式化读入的话,一定要和读入的格式完全相同

    因为用格式化读入的话,就不会忽略空格了...

      1 #include <cstdio>
      2 #include <vector>
      3 #include <iostream>
      4 #include <algorithm>
      5 
      6 using namespace std;
      7 
      8 #define pr pair<double, double>
      9 #define f(p) p.first
     10 #define s(p) p.second
     11 #define mp make_pair
     12 #define pb push_back
     13 
     14 struct node {
     15     string m;
     16     vector<pr> a;
     17     bool operator < (const node &a) const {
     18         return m < a.m;
     19     }
     20 };
     21 
     22 int n;
     23 
     24 char s[10];
     25 
     26 node tmp;
     27 
     28 pr temp[20];
     29 
     30 vector<node> h;
     31 
     32 vector<string> ans[30];
     33 
     34 double cross(pr p1, pr p2) {
     35     return f(p1) * s(p2) - f(p2) * s(p1);
     36 }
     37 
     38 bool line_cross(pr p1, pr p2, pr p3, pr p4) {
     39     double t1 = cross(mp(f(p2) - f(p1), s(p2) - s(p1)), mp(f(p3) - f(p1), s(p3) - s(p1)));
     40     double t2 = cross(mp(f(p2) - f(p1), s(p2) - s(p1)), mp(f(p4) - f(p1), s(p4) - s(p1)));
     41     double t3 = cross(mp(f(p4) - f(p3), s(p4) - s(p3)), mp(f(p1) - f(p3), s(p1) - s(p3)));
     42     double t4 = cross(mp(f(p4) - f(p3), s(p4) - s(p3)), mp(f(p2) - f(p3), s(p2) - s(p3)));
     43     if(!(1ll * t1 * t2 < 0 || ((t1 == 0 || t2 == 0) && (t1 + t2 != 0)))) return 0;
     44     if(!(1ll * t3 * t4 < 0 || ((t3 == 0 || t4 == 0) && (t3 + t4 != 0)))) return 0;
     45     return 1;
     46 }
     47 
     48 int main() {
     49     while(scanf("%s", s)) {
     50         if(s[0] == '.') return 0;
     51         if(s[0] == '-') {
     52             sort(h.begin(), h.end());
     53             for(int i = 0;i < h.size();i ++) {
     54                 ans[i].clear();
     55                 for(int j = 0;j < h.size();j ++) {
     56                     if(i == j) continue;
     57                     int x = 0;
     58                     for(int p = 1;p <  h[i].a.size();p ++) {
     59                         for(int q = 1;q < h[j].a.size();q ++) {
     60                             if(line_cross(h[i].a[p - 1], h[i].a[p], h[j].a[q - 1], h[j].a[q])) x = 1;
     61                             if(x) break;
     62                         }
     63                         if(x) break;
     64                     }
     65                     if(x) ans[i].pb(h[j].m);
     66                 }
     67                 switch(ans[i].size()) {
     68                     case 0:cout << h[i].m << " has no intersections" <<endl;
     69                         break;
     70                     case 1:cout << h[i].m << " intersects with " << ans[i][0] << endl;
     71                         break;
     72                     case 2:cout << h[i].m << " intersects with " << ans[i][0] <<  " and " << ans[i][1] <<endl;
     73                         break;
     74                     default:{
     75                         cout << h[i].m << " intersects with ";
     76                         for(int j = 0;j + 1 < ans[i].size();j ++)
     77                             cout << ans[i][j] << ", ";
     78                         cout << "and " << ans[i][ans[i].size() - 1] << endl;
     79                         break; 
     80                     }
     81                 }
     82             }
     83             h.clear();
     84             puts("");
     85         }
     86         else {
     87             tmp.a.clear();
     88             tmp.m = s;
     89             scanf("%s", s);
     90             switch(s[0]) {
     91                 case 'l':{
     92                     scanf(" (%lf,%lf)", &f(temp[0]), &s(temp[0]));
     93                     scanf(" (%lf,%lf)", &f(temp[1]), &s(temp[1]));
     94                     tmp.a.pb(temp[0]);
     95                     tmp.a.pb(temp[1]);
     96                     break;
     97                 }
     98                 case 't':{
     99                     scanf(" (%lf,%lf)", &f(temp[0]), &s(temp[0]));
    100                     scanf(" (%lf,%lf)", &f(temp[1]), &s(temp[1]));
    101                     scanf(" (%lf,%lf)", &f(temp[2]), &s(temp[2]));
    102                     tmp.a.pb(temp[0]);
    103                     tmp.a.pb(temp[1]);
    104                     tmp.a.pb(temp[2]);
    105                     break;
    106                 }
    107                 case 'p' :{
    108                     cin >> n;
    109                     for(int i = 0;i < n;i ++) {
    110                         scanf(" (%lf,%lf)", &f(temp[i]), &s(temp[i]));
    111                         tmp.a.pb(temp[i]);
    112                     }
    113                     break;
    114                 }
    115                 case 'r':{
    116                     scanf(" (%lf,%lf)", &f(temp[0]), &s(temp[0]));
    117                     scanf(" (%lf,%lf)", &f(temp[1]), &s(temp[1]));
    118                     scanf(" (%lf,%lf)", &f(temp[2]), &s(temp[2]));
    119                     tmp.a.pb(temp[0]);
    120                     tmp.a.pb(temp[1]);
    121                     tmp.a.pb(temp[2]);
    122                     temp[3] = mp(f(temp[0]) + f(temp[2]) - f(temp[1]), s(temp[0]) + s(temp[2]) - s(temp[1]));
    123                     tmp.a.pb(temp[3]);
    124                     break;
    125                 }
    126                 case 's':{
    127                     scanf(" (%lf,%lf)", &f(temp[0]), &s(temp[0]));
    128                     scanf(" (%lf,%lf)", &f(temp[2]), &s(temp[2]));
    129                     f(temp[4]) = (f(temp[0]) + f(temp[2])) / 2;
    130                     s(temp[4]) = (s(temp[0]) + s(temp[2])) / 2;
    131                     tmp.a.pb(temp[0]);
    132                     tmp.a.pb(mp(f(temp[4]) - s(temp[2]) + s(temp[4]), s(temp[4]) + f(temp[2]) - f(temp[4])));
    133                     tmp.a.pb(temp[2]);
    134                     tmp.a.pb(mp(f(temp[4]) + s(temp[2]) - s(temp[4]), s(temp[4]) - f(temp[2]) + f(temp[4])));
    135                     break;
    136                 }
    137             }
    138             tmp.a.pb(tmp.a[0]);
    139             h.pb(tmp);
    140         }
    141     }
    142 }
    View Code

    H.

    占坑

  • 相关阅读:
    top指令
    Trie
    最大公约数
    angular2 获取到的数据无法实时更新的问题
    npm install 的时候出现 write access 导致不能成功安装的问题
    angular 的 @Input、@Output 的一个用法
    windows 安装 apache 服务以及添加 php 解析
    php 性能优化之opcache
    intellij 插件结构(文件结构以及概念层面上的结构)
    jetBrains 插件开发第一课-- 在主菜单栏新增一个菜单
  • 原文地址:https://www.cnblogs.com/ytytzzz/p/7208551.html
Copyright © 2011-2022 走看看