結果
問題 | No.1226 I hate Robot Arms |
ユーザー | milanis48663220 |
提出日時 | 2020-11-23 20:52:06 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 6,377 bytes |
コンパイル時間 | 1,820 ms |
コンパイル使用メモリ | 121,712 KB |
実行使用メモリ | 119,168 KB |
最終ジャッジ日時 | 2024-07-23 17:42:26 |
合計ジャッジ時間 | 16,078 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
10,752 KB |
testcase_01 | AC | 4 ms
5,376 KB |
testcase_02 | AC | 1,329 ms
17,064 KB |
testcase_03 | AC | 1,823 ms
31,232 KB |
testcase_04 | TLE | - |
testcase_05 | TLE | - |
testcase_06 | TLE | - |
testcase_07 | -- | - |
testcase_08 | -- | - |
testcase_09 | -- | - |
testcase_10 | -- | - |
testcase_11 | -- | - |
testcase_12 | -- | - |
testcase_13 | -- | - |
testcase_14 | -- | - |
testcase_15 | -- | - |
testcase_16 | -- | - |
testcase_17 | -- | - |
testcase_18 | -- | - |
testcase_19 | -- | - |
testcase_20 | -- | - |
testcase_21 | -- | - |
testcase_22 | -- | - |
testcase_23 | -- | - |
testcase_24 | -- | - |
testcase_25 | -- | - |
testcase_26 | -- | - |
testcase_27 | -- | - |
testcase_28 | -- | - |
testcase_29 | -- | - |
ソースコード
#include <iostream> #include <algorithm> #include <iomanip> #include <vector> #include <queue> #include <set> #include <map> #include <cassert> #include <cmath> #define debug_value(x) cerr << "line" << __LINE__ << ":<" << __func__ << ">:" << #x << "=" << x << endl; #define debug(x) cerr << "line" << __LINE__ << ":<" << __func__ << ">:" << x << endl; template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } using namespace std; typedef long long ll; template <typename T, typename S> struct LazySegmentTree { int n; T unit; S unit_lazy; vector<T> node; vector<S> lazy; vector<bool> lazyFlag; T (*calc)(T, T); S (*propagateLazy)(S, S); T (*merge)(T, S); LazySegmentTree(vector<T> v, T UNIT, S UNIT_LAZY, T (*_calc)(T, T), S (*_propagateLazy)(S, S), T (*_merge)(T, S)) { int sz = (int)v.size(); unit = UNIT; unit_lazy = UNIT_LAZY; calc = _calc; propagateLazy = _propagateLazy; merge = _merge; n = 1; while(n < sz) n *= 2; node.resize(2*n-1, unit); lazy.resize(2*n-1, UNIT_LAZY); lazyFlag.resize(2*n-1, false); for(int i=0; i<sz; i++) node[i+n-1] = v[i]; for(int i=n-2; i>=0; i--) node[i] = calc(node[i*2+1], node[i*2+2]); } void lazyEvaluate(int k, int l, int r) { if(lazyFlag[k]) { node[k] = merge(lazy[k], node[k]); if(r - l > 1) { lazy[k*2+1] = propagateLazy(lazy[k*2+1], lazy[k]); lazy[k*2+2] = propagateLazy(lazy[k*2+2], lazy[k]); lazyFlag[k*2+1] = lazyFlag[k*2+2] = true; } lazyFlag[k] = false; lazy[k] = unit_lazy; } } //[a, b) //区間[a, b]への更新に対してはupdate(a, b+1, x)と呼ぶ void update(int a, int b, S x, int k=0, int l=0, int r=-1) { if(r < 0) r = n; lazyEvaluate(k, l, r); if(b <= l || r <= a) return; if(a <= l && r <= b) { lazy[k] = propagateLazy(lazy[k], x); lazyFlag[k] = true; lazyEvaluate(k, l, r); } else { update(a, b, x, 2*k+1, l, (l+r)/2); update(a, b, x, 2*k+2, (l+r)/2, r); node[k] = calc(node[2*k+1], node[2*k+2]); } } //[a, b) //区間[a, b]へのクエリに対してはquery(a, b+1)と呼ぶ T query(int a, int b, int k=0, int l=0, int r=-1) { if(r < 0) r = n; lazyEvaluate(k, l, r); if(b <= l || r <= a) return unit; if(a <= l && r <= b) return node[k]; T vl = query(a, b, 2*k+1, l, (l+r)/2); T vr = query(a, b, 2*k+2, (l+r)/2, r); return calc(vl, vr); } }; template <typename T> struct matrix{ int n, m; vector<vector<T>> dat; matrix(int n_ = 0, int m_ = 0){ n = n_; m = m_; for(int i = 0; i < n; i++){ dat.push_back(vector<T>(m)); } } vector<T>& operator[](int x) { return dat[x]; } }; template <typename T> void prod(matrix<T> a, matrix<T> b, matrix<T> &ans){ assert(a.m == b.n); for(int i = 0; i < a.n; i++){ for(int j = 0; j < a.m; j++){ ans.dat[i][j] = 0; for(int k = 0; k < b.m; k++){ ans.dat[i][j] += (a.dat[i][k]*b.dat[k][j]); } } } } template <typename T> matrix<T> prod(matrix<T> a, matrix<T> b){ assert(a.m == b.n); matrix<T> ans(a.n, b.m); for(int i = 0; i < a.n; i++){ for(int j = 0; j < a.m; j++){ ans.dat[i][j] = 0; for(int k = 0; k < b.n; k++){ ans.dat[i][j] += (a.dat[i][k]*b.dat[k][j]); } } } return ans; } template <typename T> matrix<T> add(matrix<T> a, matrix<T> b){ assert(a.n == b.n); assert(a.m == b.m); matrix<T> ans(a.n, a.m); for(int i = 0; i < a.n; i++){ for(int j = 0; j < a.m; j++){ ans[i][j] = a[i][j]+b[i][j]; } } return ans; } template <typename T> void copy_mat(matrix<T> a, matrix<T> &b){ assert(a.n == b.n); assert(a.m == b.m); for(int i = 0; i < a.n; i++){ for(int j = 0; j < a.m; j++){ b.dat[i][j] = a.dat[i][j]; } } } template <typename T> void pow_mat(matrix<T> a, ll n, matrix<T> &ans){ matrix<T> buf(a.n, a.n); matrix<T> tmp(a.n, a.n); copy_mat(a, tmp); for(int i = 0; i < a.n; i++) { for(int j = 0; j < a.n; j++){ ans.dat[i][j] = 0; } ans.dat[i][i] = 1; } for(int i = 0; i <= 30; i++){ ll m = (ll)1 << i; if(m&n){ prod(tmp, ans, buf); copy_mat(buf, ans); } prod(tmp, tmp, buf); copy_mat(buf, tmp); } } template <typename T> void print_mat(matrix<T> a){ for(int i = 0; i < a.n; i++){ for(int j = 0; j < a.m; j++){ cout << a.dat[i][j] << ' '; } cout << endl; } } matrix<double> rot2d(double theta){ matrix<double> ans(2, 2); ans[0][0] = cos(theta); ans[0][1] = -sin(theta); ans[1][0] = sin(theta); ans[1][1] = cos(theta); return ans; } double d[100000], theta[100000]; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout << setprecision(10) << fixed; int n, q; cin >> n >> q; matrix<double> unit_vec(2, 1), unit_mat(2, 2); unit_mat[0][0] = 1.0; unit_mat[1][1] = 1.0; vector<matrix<double>> v(n); for(int i = 0; i < n; i++) { matrix<double> m(2, 1); m[0][0] = 1.0; v[i] = m; d[i] = 1.0; } LazySegmentTree<matrix<double>, matrix<double>> sgt(v, unit_vec, unit_mat, add, prod, prod); for(int _ = 0; _ < q; _++){ int t, i; cin >> t >> i; i--; double x; if(t == 0){ cin >> x; x = x*M_PI/180.0; sgt.update(i, n, rot2d(x-theta[i])); theta[i] = x; }else if(t == 1){ cin >> x; matrix<double> m(2, 2); m[0][0] = x/d[i]; m[1][1] = x/d[i]; sgt.update(i, i+1, m); d[i] = x; }else{ auto r = sgt.query(0, i+1); cout << r[0][0] << ' ' << r[1][0] << endl; } } }