# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
545932 | rainboy | Scissors and Tape (CEOI19_scissors) | C11 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
/* https://codeforces.com/blog/entry/68748 */
#include <math.h>
#include <stdio.h>
#define N 10
double dot2(double x1, double y1, double x2, double y2) {
return x1 * x2 + y1 * y2;
}
double cross2(double x1, double y1, double x2, double y2) {
return x1 * y2 - x2 * y1;
}
double dot(double x0, double y0, double x1, double y1, double x2, double y2) {
return dot2(x1 - x0, y1 - y0, x2 - x0, y2 - y0);
}
int *xx, *yy;
double cross(int i, int j, int k) {
return cross2(xx[j] - xx[i], yy[j] - yy[i], xx[k] - xx[i], yy[k] - yy[i]);
}
int m;
int rect2rect(double x1, double y1, double x2, double y2, int h) {
if (x1 == x2)
return h;
if (x1 * 2 <= x2) {
printf("scissors\n");
printf("%d 2\n", h);
printf("4 %d %d %f %d %f %f %d %f\n", 0, 0, x1, 0, x1, y1 / 2, 0, y1 / 2);
printf("4 %d %f %f %f %f %f %d %f\n", 0, y1 / 2, x1, y1 / 2, x1, y1, 0, y1);
printf("tape\n");
printf("2 %d %d\n", m + 1, m + 2);
printf("4 %d %d %f %d %f %f %d %f\n", 0, 0, x1, 0, x1, y1 / 2, 0, y1 / 2);
printf("4 %f %d %f %d %f %f %f %f\n", x1, 0, x1 * 2, 0, x1 * 2, y1 / 2, x1, y1 / 2);
printf("4 %d %d %f %d %f %f %d %f\n", 0, 0, x1 * 2, 0, x1 * 2, y1 / 2, 0, y1 / 2);
return rect2rect(x1 * 2, y1 / 2, x2, y2, m += 3);
} else if (x1 / 2 >= x2) {
printf("scissors\n");
printf("%d 2\n", h);
printf("4 %d %d %f %d %f %f %d %f\n", 0, 0, x1 / 2, 0, x1 / 2, y1, 0, y1);
printf("4 %f %d %f %d %f %f %f %f\n", x1 / 2, 0, x1, 0, x1, y1, x1 / 2, y1);
printf("tape\n");
printf("2 %d %d\n", m + 1, m + 2);
printf("4 %d %d %f %d %f %f %d %f\n", 0, 0, x1 / 2, 0, x1 / 2, y1, 0, y1);
printf("4 %d %f %f %f %f %f %d %f\n", 0, y1, x1 / 2, y1, x1 / 2, y1 * 2, 0, y1 * 2);
printf("4 %d %d %f %d %f %f %d %f\n", 0, 0, x1 / 2, 0, x1 / 2, y1 * 2, 0, y1 * 2);
return rect2rect(x1 / 2, y1 * 2, x2, y2, m += 3);
} else if (x1 > x2) {
printf("scissors\n");
printf("%d 3\n", h);
printf("5 %d %d %f %d %f %f %f %f %d %f\n", 0, 0, x2, 0, x2, y2 - y1, x1 - x2, y1, 0, y1);
printf("3 %f %d %f %d %f %f\n", x2, 0, x1, 0, x2, y2 - y1);
printf("3 %f %d %f %f %f %f\n", x1, 0, x1, y1, x1 - x2, y1);
printf("tape\n");
printf("3 %d %d %d\n", m + 1, m + 2, m + 3);
printf("5 %d %d %f %d %f %f %f %f %d %f\n", 0, 0, x2, 0, x2, y2 - y1, x1 - x2, y1, 0, y1);
printf("3 %d %f %f %f %d %f\n", 0, y1, x1 - x2, y1, 0, y2);
printf("3 %f %f %f %f %d %f\n", x2, y2 - y1, x2, y2, 0, y2);
printf("4 %d %d %f %d %f %f %d %f\n", 0, 0, x2, 0, x2, y2, 0, y2);
return m += 4;
} else {
printf("scissors\n");
printf("%d 3\n", h);
printf("5 %d %d %f %d %f %f %f %f %d %f\n", 0, 0, x1, 0, x1, y1 - y2, x2 - x1, y2, 0, y2);
printf("3 %d %f %f %f %d %f\n", 0, y2, x2 - x1, y2, 0, y1);
printf("3 %f %f %f %f %d %f\n", x1, y1 - y2, x1, y1, 0, y1);
printf("tape\n");
printf("3 %d %d %d\n", m + 1, m + 2, m + 3);
printf("5 %d %d %f %d %f %f %f %f %d %f\n", 0, 0, x1, 0, x1, y1 - y2, x2 - x1, y2, 0, y2);
printf("3 %f %d %f %d %f %f\n", x1, 0, x2, 0, x1, y1 - y2);
printf("3 %f %d %f %f %f %f\n", x2, 0, x2, y2, x2 - x1, y2);
printf("4 %d %d %f %d %f %f %d %f\n", 0, 0, x2, 0, x2, y2, 0, y2);
return m += 4;
}
}
int tri2rect(double x0, double y0, double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, int h) {
double a, b, c;
if (dot(x0, y0, x1, y1, x2, y2) < 0) {
printf("tape\n");
printf("1 %d\n", h);
printf("3 %f %f %f %f %f %f\n", x0, y0, x1, y1, x2, y2);
printf("3 %f %f %f %f %f %f\n", x1, y1, x2, y2, x0, y0);
return tri2rect(x1, y1, x2, y2, x0, y0, x3, y3, x4, y4, ++m);
}
if (dot(x1, y1, x0, y0, x2, y2) < 0) {
printf("tape\n");
printf("1 %d\n", h);
printf("3 %f %f %f %f %f %f\n", x0, y0, x1, y1, x2, y2);
printf("3 %f %f %f %f %f %f\n", x2, y2, x0, y0, x1, y1);
return tri2rect(x2, y2, x0, y0, x1, y1, x3, y3, x4, y4, ++m);
}
if (x0 != 0 || y0 != 0 || x1 <= x0 || y1 != y0) {
double d = hypot(x1 - x0, y1 - y0), x1_ = (x1 - x0) / d, y1_ = (y1 - y0) / d;
double x2_ = (x2 - x0) * x1_ + (y2 - y0) * y1_, y2_ = (y2 - y0) * x1_ - (x2 - x0) * y1_;
printf("tape\n");
printf("1 %d\n", h);
printf("3 %d %d %f %d %f %f\n", 0, 0, d, 0, x2_, y2_);
printf("3 %d %d %f %d %f %f\n", 0, 0, d, 0, x2_, y2_);
return tri2rect(0, 0, d, 0, x2_, y2_, x3, y3, x4, y4, ++m);
}
printf("scissors\n");
printf("%d 2\n", h);
printf("4 %d %d %f %d %f %f %f %f\n", 0, 0, x1, 0, (x2 + x1) / 2, y2 / 2, x2 / 2, y2 / 2);
printf("3 %f %f %f %f %f %f\n", x2 / 2, y2 / 2, (x2 + x1) / 2, y2 / 2, x2, y2);
printf("tape\n");
printf("2 %d %d\n", m + 1, m + 2);
printf("4 %d %d %f %d %f %f %f %f\n", 0, 0, x1, 0, (x2 + x1) / 2, y2 / 2, x2 / 2, y2 / 2);
printf("3 %f %f %f %f %f %d\n", x2 / 2 + x1, y2 / 2, (x2 + x1) / 2, y2 / 2, x1, 0);
printf("4 %d %d %f %d %f %f %f %f\n", 0, 0, x1, 0, x2 / 2 + x1, y2 / 2, x2 / 2, y2 / 2);
h = m += 3;
a = x1, b = x2 / 2, c = y2 / 2;
if (b != 0) {
printf("scissors\n");
printf("%d 2\n", h);
printf("4 %d %d %f %d %f %f %f %f\n", 0, 0, a, 0, a, c, b, c);
printf("3 %f %d %f %f %f %f\n", a, 0, a + b, c, a, c);
printf("tape\n");
printf("2 %d %d\n", m + 1, m + 2);
printf("4 %d %d %f %d %f %f %f %f\n", 0, 0, a, 0, a, c, b, c);
printf("3 %d %d %f %f %d %f\n", 0, 0, b, c, 0, c);
printf("4 %d %d %f %d %f %f %d %f\n", 0, 0, a, 0, a, c, 0, c);
h = m += 3;
}
h = rect2rect(a, c, x4 - x3, y4 - y3, h);
if (x3 != 0 || y3 != 0) {
printf("tape\n");
printf("1 %d\n", h);
printf("4 %f %f %f %f %f %f %f %f\n", x3, y3, x4, y3, x4, y4, x3, y4);
printf("4 %f %f %f %f %f %f %f %f\n", x3, y3, x4, y3, x4, y4, x3, y4);
h = ++m;
}
return h;
}
int rect2tri(double x0, double y0, double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4, int h) {
double a, b, c;
if (dot(x0, y0, x1, y1, x2, y2) < 0) {
h = rect2tri(x1, y1, x2, y2, x0, y0, x3, y3, x4, y4, h);
printf("tape\n");
printf("1 %d\n", h);
printf("3 %f %f %f %f %f %f\n", x1, y1, x2, y2, x0, y0);
printf("3 %f %f %f %f %f %f\n", x0, y0, x1, y1, x2, y2);
return ++m;
}
if (dot(x1, y1, x0, y0, x2, y2) < 0) {
h = rect2tri(x2, y2, x0, y0, x1, y1, x3, y3, x4, y4, h);
printf("tape\n");
printf("1 %d\n", h);
printf("3 %f %f %f %f %f %f\n", x2, y2, x0, y0, x1, y1);
printf("3 %f %f %f %f %f %f\n", x0, y0, x1, y1, x2, y2);
return ++m;
}
if (x0 != 0 || y0 != 0 || x1 <= x0 || y1 != y0) {
double d = hypot(x1 - x0, y1 - y0), x1_ = (x1 - x0) / d, y1_ = (y1 - y0) / d;
double x2_ = (x2 - x0) * x1_ + (y2 - y0) * y1_, y2_ = (y2 - y0) * x1_ - (x2 - x0) * y1_;
h = rect2tri(0, 0, d, 0, x2_, y2_, x3, y3, x4, y4, h);
printf("tape\n");
printf("1 %d\n", h);
printf("3 %f %f %f %f %f %f\n", x0, y0, x1, y1, x2, y2);
printf("3 %f %f %f %f %f %f\n", x0, y0, x1, y1, x2, y2);
return ++m;
}
a = x1, b = x2 / 2, c = y2 / 2;
if (x3 != 0 || y3 != 0) {
x4 -= x3, y4 -= y3, x3 = 0, y3 = 0;
printf("tape\n");
printf("1 %d\n", h);
printf("4 %f %f %f %f %f %f %f %f\n", x3, y3, x4, y3, x4, y4, x3, y4);
printf("4 %f %f %f %f %f %f %f %f\n", x3, y3, x4, y3, x4, y4, x3, y4);
h = ++m;
}
h = rect2rect(x4, y4, a, c, h);
if (b != 0) {
printf("scissors\n");
printf("%d 2\n", h);
printf("4 %d %d %f %d %f %f %f %f\n", 0, 0, a, 0, a, c, b, c);
printf("3 %d %d %f %f %d %f\n", 0, 0, b, c, 0, c);
printf("tape\n");
printf("2 %d %d\n", m + 1, m + 2);
printf("4 %d %d %f %d %f %f %f %f\n", 0, 0, a, 0, a, c, b, c);
printf("3 %f %d %f %f %f %f\n", a, 0, a + b, c, a, c);
printf("4 %d %d %f %d %f %f %f %f\n", 0, 0, a, 0, a + b, c, b, c);
h = m += 3;
}
printf("scissors\n");
printf("%d 2\n", h);
printf("4 %d %d %f %d %f %f %f %f\n", 0, 0, x1, 0, (x2 + x1) / 2, y2 / 2, x2 / 2, y2 / 2);
printf("3 %f %f %f %f %f %d\n", x2 / 2 + x1, y2 / 2, (x2 + x1) / 2, y2 / 2, x1, 0);
printf("tape\n");
printf("2 %d %d\n", m + 1, m + 2);
printf("4 %d %d %f %d %f %f %f %f\n", 0, 0, x1, 0, (x2 + x1) / 2, y2 / 2, x2 / 2, y2 / 2);
printf("3 %f %f %f %f %f %f\n", x2 / 2, y2 / 2, (x2 + x1) / 2, y2 / 2, x2, y2);
printf("3 %f %f %f %f %f %f\n", x0, y0, x1, y1, x2, y2);
h = m += 3;
return h;
}
int ii_[N], n_;
int inside(int i, int j) {
int p = (i - 1 + n_) % n_, q = (i + 1 + n_) % n_;
double cpq = cross(ii_[i], ii_[p], ii_[q]);
double cpj = cross(ii_[i], ii_[p], ii_[j]);
double cjq = cross(ii_[i], ii_[j], ii_[q]);
return cpq < 0 ? cpj < 0 && cjq < 0 : cpj < 0 || cjq < 0;
}
int check(int i, int j) {
int k, l;
if (!inside(i, j))
return 0;
for (k = 0; k < n_; k++) {
l = (k + 1) % n_;
if (k == i || k == j || l == i || l == j)
continue;
if ((cross(ii_[i], ii_[j], ii_[k]) < 0) != (cross(ii_[i], ii_[j], ii_[l]) < 0)
&& (cross(ii_[k], ii_[l], ii_[i]) < 0) != (cross(ii_[k], ii_[l], ii_[j]) < 0))
return 0;
}
return 1;
}
int ii[N], jj[N], kk[N];
void triangulate(int n, int b) {
int h, i, j, b1, b2;
n_ = 0;
for (i = 0; i < n; i++)
if ((b & 1 << i) != 0)
ii_[n_++] = i;
if (n_ == 3) {
m++, ii[m] = ii_[0], jj[m] = ii_[1], kk[m] = ii_[2];
return;
}
for (i = 0; i < n_; i++)
for (j = i + 1; j < n_; j++)
if (check(i, j)) {
b1 = b2 = 1 << ii_[j];
for (h = i; h != j; h = (h + 1) % n_)
b1 |= 1 << ii_[h];
for (h = i; h != j; h = (h - 1 + n_) % n_)
b2 |= 1 << ii_[h];
triangulate(n, b1), triangulate(n, b2);
return;
}
}
int main() {
static int xx1[N], yy1[N], xx2[N], yy2[N], hh[N];
static double yy_[N];
int n1, n2, m_, g, i, j, k;
double s;
scanf("%d", &n1);
for (i = 0; i < n1; i++)
scanf("%d%d", &xx1[i], &yy1[i]);
scanf("%d", &n2);
for (j = 0; j < n2; j++)
scanf("%d%d", &xx2[j], &yy2[j]);
s = 0;
for (i = 0; i < n1; i++)
s += cross2(xx1[i], yy1[i], xx1[(i + 1) % n1], yy1[(i + 1) % n1]);
s = sqrt(s / 2);
xx = xx1, yy = yy1;
m = 0, triangulate(n1, (1 << n1) - 1);
printf("scissors\n");
printf("0 %d\n", n1 - 2);
for (g = 1; g < n1 - 1; g++) {
i = ii[g], j = jj[g], k = kk[g];
printf("3 %d %d %d %d %d %d\n", xx1[i], yy1[i], xx1[j], yy1[j], xx1[k], yy1[k]);
}
for (g = 1; g < n1 - 1; g++) {
i = ii[g], j = jj[g], k = kk[g];
yy_[g] = yy_[g - 1] + cross(i, j, k) / 2 / s;
hh[g] = tri2rect(xx1[i], yy1[i], xx1[j], yy1[j], xx1[k], yy1[k], 0, yy_[g - 1], s, yy_[g], g);
}
printf("tape\n");
printf("%d", n1 - 2);
for (g = 1; g < n1 - 1; g++)
printf(" %d", hh[g]);
printf("\n");
for (g = 1; g < n1 - 1; g++)
printf("4 %d %f %f %f %f %f %d %f\n", 0, yy_[g - 1], s, yy_[g - 1], s, yy_[g], 0, yy_[g]);
printf("4 %d %d %f %d %f %f %d %f\n", 0, 0, s, 0, s, s, 0, s);
m++;
xx = xx2, yy = yy2;
m_ = m, m = 0, triangulate(n2, (1 << n2) - 1);
for (g = 1; g < n2 - 1; g++) {
i = ii[g], j = jj[g], k = kk[g];
yy_[g] = yy_[g - 1] + cross(i, j, k) / 2 / s;
}
printf("scissors\n");
printf("%d %d\n", m_, n2 - 2);
for (g = 1; g < n2 - 1; g++) {
i = ii[g], j = jj[g], k = kk[g];
printf("4 %d %f %f %f %f %f %d %f\n", 0, yy_[g - 1], s, yy_[g - 1], s, yy_[g], 0, yy_[g]);
}
m += m_;
for (g = 1; g < n2 - 1; g++) {
i = ii[g], j = jj[g], k = kk[g];
hh[g] = rect2tri(xx2[i], yy2[i], xx2[j], yy2[j], xx2[k], yy2[k], 0, yy_[g - 1], s, yy_[g], m_ + g);
}
printf("tape\n");
printf("%d", n2 - 2);
for (g = 1; g < n2 - 1; g++)
printf(" %d", hh[g]);
printf("\n");
for (g = 1; g < n2 - 1; g++) {
i = ii[g], j = jj[g], k = kk[g];
printf("3 %d %d %d %d %d %d\n", xx2[i], yy2[i], xx2[j], yy2[j], xx2[k], yy2[k]);
}
printf("%d", n2);
for (j = 0; j < n2; j++)
printf(" %d %d", xx2[j], yy2[j]);
printf("\n");
m++;
return 0;
}