結果
| 問題 |
No.1226 I hate Robot Arms
|
| コンテスト | |
| ユーザー |
msm1993
|
| 提出日時 | 2020-10-08 10:03:40 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 269 ms / 2,000 ms |
| コード長 | 2,325 bytes |
| コンパイル時間 | 2,069 ms |
| コンパイル使用メモリ | 175,912 KB |
| 実行使用メモリ | 11,996 KB |
| 最終ジャッジ日時 | 2024-07-20 05:47:00 |
| 合計ジャッジ時間 | 11,107 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 28 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
double R = acos(-1) / 180;
struct Node {
double x, y, t;
Node(double x, double y, double t) : x(x), y(y), t(t){}
};
class SegmentTree {
private:
int n;
vector<Node> node;
public:
SegmentTree(int N) {
n = 1;
while (n < N) n *= 2;
node.resize(2 * n - 1, Node(0, 0, 0));
for (int i = 0; i < N; i++) {
node[i + n - 1].x = 1;
}
for (int i = n - 2; i >= 0; i--) {
node[i] = add(node[2 * i + 1], node[2 * i + 2]);
}
}
Node update(double t, double d) {
return Node(d * cos(R * t), d * sin(R * t), t);
}
Node add(Node v1, Node v2) {
double x = v1.x + v2.x * cos(R * v1.t) - v2.y * sin(R * v1.t);
double y = v1.y + v2.x * sin(R * v1.t) + v2.y * cos(R * v1.t);
return Node(x, y, v1.t + v2.t);
}
void update_all(int i, double t, double d) {
i += n - 1;
node[i] = update(t, d);
while (i > 0) {
i = (i - 1) / 2;
node[i] = add(node[2 * i + 1], node[2 * i + 2]);
}
}
Node query(int a, int b, int k = 0, int l = 0, int r = -1) {
if (r < 0) r = n;
if (b <= l || r <= a) return Node(0, 0, 0);
if (a <= l && r <= b) return node[k];
Node v_l = query(a, b, 2 * k + 1, l, (l + r) / 2);
Node v_r = query(a, b, 2 * k + 2, (l + r) / 2, r);
return add(v_l, v_r);
}
void disp() {
int idx = 0;
for (Node i : node) {
printf("%d ( %f %f %f)\n",idx, i.x, i.y, i.t);
idx++;
}
}
};
int main() {
int N, Q;
int a, b, x;
cin >> N >> Q;
vector<Node> ans;
SegmentTree st(N);
//st.disp();
int t[N]{}, d[N]{};
fill(d, d + N, 1);
for (int i = 0; i < Q; i++) {
cin >> a >> b;
if (a == 2) {
Node p = st.query(0, b);
ans.push_back(p);
} else {
cin >> x;
if (a == 0) {
t[b - 1] = x;
} else {
d[b - 1] = x;
}
st.update_all(b - 1, t[b - 1], d[b - 1]);
}
}
for (Node p : ans) {
printf("%.9f %.9f\n", p.x, p.y);
}
//st.disp();
return 0;
}
msm1993