結果

問題 No.1226 I hate Robot Arms
ユーザー chielochielo
提出日時 2020-09-11 22:43:52
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 3,770 bytes
コンパイル時間 2,372 ms
コンパイル使用メモリ 206,596 KB
実行使用メモリ 19,144 KB
最終ジャッジ日時 2024-06-10 10:29:01
合計ジャッジ時間 7,407 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 7 ms
18,136 KB
testcase_01 AC 7 ms
18,252 KB
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
testcase_21 WA -
testcase_22 WA -
testcase_23 WA -
testcase_24 WA -
testcase_25 WA -
testcase_26 WA -
testcase_27 AC 162 ms
19,008 KB
testcase_28 AC 164 ms
19,012 KB
testcase_29 AC 167 ms
18,996 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

const int maxn = 1e5 + 3, lo = 0x2'0000;
const double pi = acos(-1);

struct SEG {
    struct node {
        double a[2][2], b[2];
        bool m;
        void tag(double u[2][2], double v[2]) {
            double c[2][2];
            for(int i = 0; i < 2; ++i) {
                for(int j = 0; j < 2; ++j) {
                    c[i][j] = 0.0;
                    for(int k = 0; k < 2; ++k) {
                        c[i][j] += a[i][k] * u[k][j];
                    }
                }
            }
            memcpy(a, c, sizeof(a));
            double d[2];
            for(int i = 0; i < 2; ++i) {
                d[i] = 0;
                for(int k = 0; k < 2; ++k)
                    d[i] += b[k] * u[k][i];
                d[i] += v[i];
            }
            memcpy(b, d, sizeof(b));
            m = true;
        }
        void down(node &u, node &v) {
            if(m) {
                u.tag(a, b);
                v.tag(a, b);
                *this = {{{1.0, 0.0}, {0.0, 1.0}}, {0.0, 0.0}, false};
            }
        }
    } seg[lo * 2];
    void init() {
        for(int i = 0; i < lo * 2; ++i) {
            seg[i] = {{{1.0, 0.0}, {0.0, 1.0}}, {0.0, 0.0}, false};
        }
    }
    void modify(int l, int r, double u[2][2], double v[2]) {
        down(l - 1); down(r);
        for(int i = l + lo, j = r + lo; i < j; i /= 2, j /= 2) {
            if(i & 1) {
                seg[i++].tag(u, v);
            }
            if(j & 1) {
                seg[j++].tag(u, v);
            }
        }
    }
    void down(int k) {
        if(k < 0 || k >= lo)
            return;
        for(int i = 1, j = lo; i < lo; j /= 2, i = i * 2 + bool(k & j)) {
            seg[i].down(seg[i * 2], seg[i * 2 + 1]);
        }
    }
    std::pair<double, double> query(int k, double v[2]) {
        down(k);
        double d[2];
        auto &&u = seg[k + lo];
        for(int i = 0; i < 2; ++i) {
            d[i] = 0;
            for(int j = 0; j < 2; ++j)
                d[i] += v[j] * u.a[j][i];
            d[i] += u.b[i];
        }
        return {d[0], d[1]};
    }
} s;

std::pair<double, double> get(int i) {
    double v[2] = {double(i), 0.0};
    return s.query(i, v);
}

int ct[maxn], cl[maxn];

void rotate(int k, int v) {
    double t = double(v) / 360. * 2. * pi;
    auto uu = get(k - 1);
    SEG::node p = {{{1.0, 0.0}, {0.0, 1.0}}, {0.0, 0.0}, false};
    {
        double u[2][2] = {{1.0, 0.0}, {0.0, 1.0}};
        double w[2] = {-uu.first, -uu.second};
        p.tag(u, w);
    }
    {
        double u[2][2] = {{cos(t), sin(t)}, {-sin(t), cos(t)}};
        double w[2] = {0.0, 0.0};
        p.tag(u, w);
    }
    {
        double u[2][2] = {{1.0, 0.0}, {0.0, 1.0}};
        double w[2] = {+uu.first, +uu.second};
        p.tag(u, w);
    }
    s.modify(k, lo, p.a, p.b);
}

void extend(int k, int v) {
    auto uu = get(k - 1);
    auto vv = get(k);
    double dx = vv.first - uu.first;
    double dy = vv.second - uu.second;
    double uvl = dx * dx + dy * dy;
    {
        double u[2][2] = {{1.0, 0.0}, {0.0, 1.0}};
        double w[2] = {dx / uvl * v, dy / uvl * v};
        s.modify(k, lo, u, w);
    }
}

int main() {
    s.init();
    int n, q;
    scanf("%d%d", &n, &q);
    for(int i = 1; i <= n; ++i) {
        ct[i] = 0;
        cl[i] = 1;
    }
    for(int i = 0; i < q; ++i) {
        int op, k, v;
        scanf("%d%d", &op, &k);
        if(op == 0) {
            scanf("%d", &v);
            rotate(k, v - ct[k - 1]);
            ct[k - 1] = v;
        } else if(op == 1) {
            scanf("%d", &v);
            extend(k, v - cl[k - 1]);
            cl[k - 1] = v;
        } else {
            auto p = get(k);
            printf("%.6f %.6f\n", p.first, p.second);
        }
    }
    return 0;
}
0