結果
| 問題 |
No.1226 I hate Robot Arms
|
| コンテスト | |
| ユーザー |
hotman78
|
| 提出日時 | 2020-09-11 22:31:29 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 553 ms / 2,000 ms |
| コード長 | 6,581 bytes |
| コンパイル時間 | 3,278 ms |
| コンパイル使用メモリ | 212,396 KB |
| 最終ジャッジ日時 | 2025-01-14 10:48:47 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 28 |
ソースコード
#line 1 "code.cpp"
#define MOD 1000000007LL
//#define MOD 998244353LL
//#define MOD 18446744069414584321ULL
#include<bits/stdc++.h>
#line 1 "cpplib/util/template.hpp"
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx")
#line 5 "cpplib/util/template.hpp"
using namespace std;
__attribute__((constructor))void init(){cin.tie(0);ios::sync_with_stdio(false);cout<<fixed<<setprecision(15);}
typedef long long lint;
#define INF (1LL<<60)
#define IINF (1<<30)
#define EPS (1e-10)
#define endl ('\n')
typedef vector<lint> vec;
typedef vector<vector<lint>> mat;
typedef vector<vector<vector<lint>>> mat3;
typedef vector<string> svec;
typedef vector<vector<string>> smat;
template<typename T>inline void numout(T t){bool f=0;for(auto i:t){cout<<(f?" ":"")<<i<INF/2?i:"INF";f=1;}cout<<endl;}
template<typename T>inline void numout2(T t){for(auto i:t)numout(i);}
template<typename T>inline void output(T t){bool f=0;for(auto i:t){cout<<(f?" ":"")<<i;f=1;}cout<<endl;}
template<typename T>inline void output2(T t){for(auto i:t)output(i);}
template<typename T>inline void _output(T t){bool f=0;for(lint i=0;i<t.size();i++){cout<<f?"":" "<<t[i];f=1;}cout<<endl;}
template<typename T>inline void _output2(T t){for(lint i=0;i<t.size();i++)output(t[i]);}
#define rep(i,...) for(auto i:range(__VA_ARGS__))
#define rrep(i,...) for(auto i:reversed(range(__VA_ARGS__)))
#define repi(i,a,b) for(lint i=lint(a);i<(lint)(b);++i)
#define rrepi(i,a,b) for(lint i=lint(b)-1;i>=lint(a);--i)
#define irep(i) for(lint i=0;;++i)
inline vector<long long> range(long long n){vector<long long>v(n);iota(v.begin(),v.end(),0LL);return v;}
inline vector<long long> range(long long a,long long b){vector<long long>v(b-a);iota(v.begin(),v.end(),a);return v;}
inline vector<long long> range(long long a,long long b,long long c){if((b-a+c-1)/c<=0)return vector<long long>();vector<long long>v((b-a+c-1)/c);for(int i=0;i<(int)v.size();++i)v[i]=i?v[i-1]+c:a;return v;}
template<typename T>inline T reversed(T v){reverse(v.begin(),v.end());return v;}
#define all(n) begin(n),end(n)
#define dist(a,b,c,d) sqrt(pow(a-c,2)+pow(b-d,2))
template<typename T,typename E>bool chmin(T& s,const E& t){bool res=s>t;s=min<T>(s,t);return res;}
template<typename T,typename E>bool chmax(T& s,const E& t){bool res=s<t;s=max<T>(s,t);return res;}
const vector<lint> dx={1,0,-1,0,1,1,-1,-1};
const vector<lint> dy={0,1,0,-1,1,-1,1,-1};
#define SUM(v) accumulate(all(v),0LL)
template<typename T,typename ...Args>auto make_vector(T x,int arg,Args ...args){if constexpr(sizeof...(args)==0)return vector<T>(arg,x);else return vector(arg,make_vector<T>(x,args...));}
#line 6 "code.cpp"
//#include "cpplib/math/mod_int.hpp"
#line 2 "cpplib/data_structure/segment_tree/segment_tree.hpp"
/**
* @brief Segment Tree
* @docs docs/segment_tree.md
* @see https://en.wikipedia.org/wiki/Segment_tree
*/
#line 1 "cpplib/alga/maybe.hpp"
/**
* @brief Maybe
* @docs docs/maybe.md
* @see https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%8A%E3%83%89_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)#Maybe%E3%83%A2%E3%83%8A%E3%83%89
*/
template<typename T>
struct maybe{
bool _is_none;
T val;
maybe():_is_none(true){}
maybe(T val):_is_none(false),val(val){}
T unwrap()const{
assert(!_is_none);
return val;
}
T unwrap_or(T e)const{
return _is_none?e:val;
}
bool is_none()const{return _is_none;}
bool is_some()const{return !_is_none;}
};
template<typename T,typename F>
auto expand(F op){
return [op](const maybe<T>& s,const maybe<T>& t){
if(s.is_none())return t;
if(t.is_none())return s;
return maybe<T>(op(s.unwrap(),t.unwrap()));
};
}
#line 9 "cpplib/data_structure/segment_tree/segment_tree.hpp"
template<typename T,typename F>
class segment_tree{
maybe<T>* node;
F op;
int n=1;
public:
segment_tree(){}
segment_tree(int sz,F op):op(op){
while(n<=sz)n<<=1;
node=new maybe<T>[n*2];
for(int i=0;i<n*2;i++)node[i]=maybe<T>();
}
segment_tree(const vector<T>&v,F op):op(op){
auto f=expand<T,F>(op);
const int sz=v.size();
while(n<=sz)n<<=1;
node=new maybe<T>[n*2]();
for(int i=0;i<sz;i++)node[i+n]=maybe<T>(v[i]);
for(int i=n-1;i>=1;i--)node[i]=f(node[i*2],node[i*2+1]);
}
maybe<T> get(int l,int r){
auto f=expand<T,F>(op);
l+=n;r+=n;
maybe<T> s,t;
while(l<r){
if(l&1)s=f(s,node[l++]);
if(r&1)t=f(node[--r],t);
l>>=1;r>>=1;
}
return f(s,t);
}
void apply(int t,T _val){
auto f=expand<T,F>(op);
t+=n;
maybe<T> val=maybe<T>(_val);
while(t){
node[t]=f(node[t],val);
t=t>>1;
}
}
void apply_left(int t,T _val){
auto f=expand<T,F>(op);
t+=n;
maybe<T> val=maybe<T>(_val);
while(t){
node[t]=f(val,node[t]);
t=t>>1;
}
}
void change(int t,T val){
auto f=expand<T,F>(op);
t+=n;
node[t]=maybe<T>(val);
while(t>1){
t=t>>1;
node[t]=f(node[t*2],node[t*2+1]);
}
}
};
template<typename T,typename F>
segment_tree<T,F> make_segment_tree(vector<T> v,F op){
return segment_tree<T,F>(v,op);
}
template<typename T,typename F>
segment_tree<T,F> make_segment_tree(int size,T goast,F op){
return segment_tree<T,F>(size,op);
}
#line 8 "code.cpp"
int main(){
lint n,q;
cin>>n>>q;
auto seg=make_segment_tree(vector<tuple<double,double,double>>(n,tuple(1.,0.,0.)),[](auto s,auto t){
return make_tuple(
get<0>(s)+cos(get<2>(s))*get<0>(t)-sin(get<2>(s))*get<1>(t),
get<1>(s)+sin(get<2>(s))*get<0>(t)+cos(get<2>(s))*get<1>(t),
get<2>(s)+get<2>(t)
);
});
vector<pair<double,double>>now(n,make_pair(1,0));
rep(i,q){
lint c;
cin>>c;
if(c==0){
lint s,t;
cin>>s>>t;
s--;
now[s].second=t*M_PIl/180;
seg.change(s,make_tuple(now[s].first*cos(now[s].second),now[s].first*sin(now[s].second),now[s].second));
}else if(c==1){
lint s,t;
cin>>s>>t;
s--;
now[s].first=t;
seg.change(s,make_tuple(now[s].first*cos(now[s].second),now[s].first*sin(now[s].second),now[s].second));
}else{
lint s;
cin>>s;
auto tmp=seg.get(0,s).unwrap();
cout<<get<0>(tmp)<<" "<<get<1>(tmp)<<endl;
}
}
}
hotman78