結果
問題 | No.675 ドットちゃんたち |
ユーザー |
![]() |
提出日時 | 2024-01-03 16:29:07 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 153 ms / 2,000 ms |
コード長 | 7,259 bytes |
コンパイル時間 | 1,610 ms |
コンパイル使用メモリ | 136,252 KB |
最終ジャッジ日時 | 2025-02-18 16:02:36 |
ジャッジサーバーID (参考情報) |
judge2 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 8 |
ソースコード
#include <iostream>#include <string>#include <vector>#include <algorithm>#include <array>#include <cctype>#include <cstring>#include <cstdlib>#include <cassert>#include <cmath>#include <ctime>#include <iomanip>#include <numeric>#include <stack>#include <queue>#include <map>#include <unordered_map>#include <set>#include <unordered_set>#include <bitset>#include <random>#include <utility>#include <functional>using namespace std;template<class T,T (*op)(T,T),T e(),class F,T (*mapping)(F,T),F (*composition)(F,F),F id()> struct LazySegmentTree{private:vector<T> node;vector<F> lazy;int siz,log;void map_and_comp(F f,int u){node[u] = mapping(f,node[u]);if(u < siz) lazy[u] = composition(f,lazy[u]);}void propagate(int u){assert(0 <= u && u < siz);map_and_comp(lazy[u],2*u);map_and_comp(lazy[u],2*u+1);lazy[u] = id();}void recalculate(int u) {node[u] = op(node[2*u],node[2*u+1]);}public:LazySegmentTree(int n = 0) : LazySegmentTree(vector<T>(n,e())) {}LazySegmentTree(const vector<T> &V){siz = 1;log = 0;while(siz < (int)V.size()) siz <<= 1,log++;node.assign(2*siz,e());lazy.assign(siz,id());for(int i = 0;i < (int)V.size();i++) node[i+siz] = V[i];for(int i = siz-1;i >= 1;i--) recalculate(i);}void fill(T x,int l = 0,int r = -1) {if(r < 0){r = siz;} for(int i = l;i < r;i++) replace(i,x);}void clear() {fill(e());}void replace(int pos,T x) {func_update(pos,x,[](T u,T v){return u = v;});}void add(int pos,T x) {func_update(pos,x,[](T u,T v){return u + v;});}void func_update(int pos,T x,T (*func)(T,T)){assert(0 <= pos && pos < siz);pos += siz;for(int i = log;i >= 1;i--) propagate(pos >> i);node[pos] = func(node[pos],x);for(int i = 1;i <= log;i++) recalculate(pos >> i);}T operator[](int pos){assert(0 <= pos && pos < siz);pos += siz;for(int i = log;i >= 1;i--) propagate(pos >> i);return node[pos];}void apply(int pos,F f){assert(0 <= pos && pos < siz);pos += siz;for(int i = log;i >= 1;i--) propagate(pos >> i);node[pos] = mapping(f,node[pos]);for(int i = 1;i <= log;i++) recalculate(pos >> i);}void apply(int l,int r,F f){assert(0 <= l && l <= r && r <= siz);if(l == r) return;l += siz;r += siz;int l0 = l/(l & -l);int r0 = r/(r & -r);for(int i = log;i >= 1;i--) propagate(l0 >> i);for(int i = log;i >= 1;i--) propagate((r0-1) >> i);while(l < r){if(l & 1) map_and_comp(f,l++);if(r & 1) map_and_comp(f,--r);l >>= 1;r >>= 1;}for(int i = 1;i <= log;i++) recalculate(l0 >> i);for(int i = 1;i <= log;i++) recalculate((r0-1) >> i);}T prod() {return node[1];}T prod(int l,int r){assert(0 <= l && l <= r && r <= siz);l += siz;r += siz;int l0 = l/(l & -l);int r0 = r/(r & -r);for(int i = log;i >= 1;i--) propagate(l0 >> i);for(int i = log;i >= 1;i--) propagate((r0-1) >> i);T Lval = e(),Rval = e();while(l < r){if(l & 1) Lval = op(Lval,node[l++]);if(r & 1) Rval = op(node[--r],Rval);l >>= 1;r >>= 1;}return op(Lval,Rval);}};template<class T> struct mat{private:vector<vector<T>> m;int h,w;public:constexpr mat(int _h,int _w,T x = 0) noexcept {m.assign(_h,vector<T>(_w,x));h = _h,w = _w;}constexpr vector<T> operator[](const int i) const {assert(0 <= i && i < h); return m[i];}constexpr vector<T> &operator[](const int i) noexcept {assert(0 <= i && i < h); return m[i];}constexpr mat operator+(mat &other) noexcept{mat tmp = *this;return tmp += other;}constexpr mat operator-(mat &other) noexcept{mat tmp = *this;return tmp -= other;}constexpr mat operator*(mat &other) noexcept{mat tmp = *this;return tmp *= other;}constexpr mat &operator+=(mat &other) noexcept{assert(h == other.h && w == other.w);for(int i = 0;i < h;i++)for(int j = 0;j < w;j++) m[i][j] += other[i][j];return *this;}constexpr mat &operator-=(mat &other) noexcept{assert(h == other.h && w == other.w);for(int i = 0;i < h;i++)for(int j = 0;j < w;j++) m[i][j] -= other[i][j];return *this;}constexpr mat &operator*=(mat &other) noexcept{assert(w == other.h);mat tmp(h,other.w);for(int i = 0;i < h;i++)for(int j = 0;j < other.w;j++)for(int k = 0;k < w;k++) tmp[i][j] += m[i][k]*other[k][j];for(int i = 0;i < h;i++){m[i].resize(other.w);for(int j = 0;j < other.w;j++) m[i][j] = tmp[i][j];}return *this;}constexpr mat power(long n) noexcept{assert(h == w);assert(n >= 0);mat res(h,w);for(int i = 0;i < h;i++) res[i][i] = 1;mat p = *this;long ex = n;while(ex){if(ex & 1) res *= p;p *= p;ex >>= 1;}return res;}constexpr bool operator==(mat &other) noexcept{assert(h == other.h && w == other.w);bool res = true;for(int i = 0;i < h;i++)for(int j = 0;j < w;j++) if(m[i][j] != other[i][j]) res = false;return res;}constexpr bool operator!=(mat &other) noexcept{assert(h == other.h && w == other.w);bool res = false;for(int i = 0;i < h;i++)for(int j = 0;j < w;j++) if(m[i][j] != other[i][j]) res = true;return res;}template<class S> friend ostream &operator<<(ostream &os,const mat<S> &x);};template<class S> ostream &operator<<(ostream &os,const mat<S> &x){for(int i = 0;i < x.h;i++)for(int j = 0;j < x.w;j++){os << x[i][j] << (j+1 == x.w && i+1 < x.h ? "\n":" ");return os;}}void solve(){int N,Px,Py;cin >> N >> Px >> Py;vector<mat<long long>> M(N,mat<long long>(3,3));for(int i = 0;i < N;i++){int t;cin >> t;if(t == 1){int d;cin >> d;for(int j = 0;j < 3;j++) M[i][j][j] = 1;M[i][0][2] = d;}else if(t == 2){int d;cin >> d;for(int j = 0;j < 3;j++) M[i][j][j] = 1;M[i][1][2] = d;}else{M[i][0][1] = 1;M[i][1][0] = -1;M[i][2][2] = 1;}}mat<long long> op(3,3);for(int i = 0;i < 3;i++) op[i][i] = 1;mat<long long> S(3,1);S[0][0] = Px,S[1][0] = Py,S[2][0] = 1;vector<long long>X(N),Y(N);for(int i = N;i--;){op = op * M[i];mat<long long> cur = op * S;X[i] = cur[0][0],Y[i] = cur[1][0];}for(int i = 0;i < N;i++) cout << X[i] << " " << Y[i] << "\n";}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int tt = 1;/* cin >> tt; */while(tt--) solve();}