結果
問題 | No.1000 Point Add and Array Add |
ユーザー | Imperi_Night |
提出日時 | 2020-02-28 21:38:41 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 404 ms / 2,000 ms |
コード長 | 4,379 bytes |
コンパイル時間 | 4,951 ms |
コンパイル使用メモリ | 145,200 KB |
実行使用メモリ | 20,384 KB |
最終ジャッジ日時 | 2024-10-13 17:04:03 |
合計ジャッジ時間 | 6,246 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,816 KB |
testcase_01 | AC | 2 ms
6,820 KB |
testcase_02 | AC | 2 ms
6,820 KB |
testcase_03 | AC | 2 ms
6,820 KB |
testcase_04 | AC | 2 ms
6,816 KB |
testcase_05 | AC | 2 ms
6,816 KB |
testcase_06 | AC | 2 ms
6,820 KB |
testcase_07 | AC | 2 ms
6,816 KB |
testcase_08 | AC | 2 ms
6,820 KB |
testcase_09 | AC | 2 ms
6,820 KB |
testcase_10 | AC | 2 ms
6,816 KB |
testcase_11 | AC | 2 ms
6,816 KB |
testcase_12 | AC | 3 ms
6,820 KB |
testcase_13 | AC | 3 ms
6,820 KB |
testcase_14 | AC | 4 ms
6,816 KB |
testcase_15 | AC | 4 ms
6,820 KB |
testcase_16 | AC | 256 ms
17,304 KB |
testcase_17 | AC | 219 ms
15,244 KB |
testcase_18 | AC | 389 ms
20,032 KB |
testcase_19 | AC | 387 ms
20,384 KB |
testcase_20 | AC | 216 ms
19,876 KB |
testcase_21 | AC | 396 ms
20,260 KB |
testcase_22 | AC | 321 ms
20,092 KB |
testcase_23 | AC | 404 ms
20,148 KB |
ソースコード
#include <cassert> #include <algorithm> #include <array> #include <bitset> #include <cctype> #include <cstdint> #include <cmath> #include <complex> #include <chrono> #include <deque> #include <functional> #include <iomanip> #include <iostream> #include <map> #include <numeric> #include <queue> #include <set> #include <stack> #include <string> #include <unordered_map> #include <vector> #include <random> #include <memory> #include <utility> #include <limits> #define rep(i, a, b) for (long long i = (a); (i) < (b); (i)++) #define all(i) i.begin(), i.end() #define debug(...) std::cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__) void debug_out(){std::cerr<<std::endl;} template<typename Head,typename... Tail> void debug_out(Head h,Tail... t){ std::cerr<<" "<<h; debug_out(t...); } template <typename T1, typename T2> std::ostream& operator<<(std::ostream& os, std::pair<T1, T2> pa) { return os << pa.first << " " << pa.second; } template <typename T> std::ostream& operator<<(std::ostream& os, std::vector<T> vec) { for (int i = 0; i < vec.size(); i++)os << vec[i] << (i + 1 == vec.size() ? "" : " "); return os; } template<typename T1,typename T2> inline bool chmax(T1& a,T2 b){return a<b && (a=b,true);} template<typename T1,typename T2> inline bool chmin(T1& a,T2 b){return a>b && (a=b,true);} long long pow_mod(long long a, long long b, long long mod=-1) { if(b==0)return 1; if ((a == 0)||(mod!=-1&&(a+mod)%mod==0))return 0; long long x = 1; while (b > 0) { if (b & 1)x = (mod!=-1)?(x * a) % mod:x*a; a = (mod!=-1)?(a * a) % mod:a*a; b >>= 1; } return x; } //const long long MOD = 998244353; const long long MOD = 1e9 + 7; using ll = long long; using P=std::pair<long long,long long>; //遅延セグ木 template<typename T,typename E> class LazySegmentTree{ private: int n,n0; std::vector<T> dat; std::vector<E> lazy; T init_t; E init_e; using F=std::function<T(T,T)>; using G=std::function<T(T,E)>; using H=std::function<E(E,E)>; using P=std::function<E(E,int)>; F f; G g; H h; P p; T update(int a,int b,E val,int l,int r,int k){ if(lazy[k]!=init_e){ if(k<n0-1){ lazy[2*k+1]=h(lazy[2*k+1],lazy[k]); lazy[2*k+2]=h(lazy[2*k+2],lazy[k]); } dat[k]=g(dat[k],p(lazy[k],r-l)); lazy[k]=init_e; } if(r<=a||b<=l)return dat[k]; if(a<=l&&r<=b){ lazy[k]=h(lazy[k],val); return g(dat[k],p(lazy[k],r-l)); } return dat[k]=f(update(a,b,val,l,l+(r-l)/2,2*k+1),update(a,b,val,l+(r-l)/2,r,2*k+2)); } T query(int a,int b,int l,int r,int k){ if(lazy[k]!=init_e){ if(k<n0-1){ lazy[2*k+1]=h(lazy[2*k+1],lazy[k]); lazy[2*k+2]=h(lazy[2*k+2],lazy[k]); } dat[k]=g(dat[k],p(lazy[k],r-l)); lazy[k]=init_e; } if(r<=a||b<=l)return init_t; if(a<=l&&r<=b)return dat[k]; T lval=query(a,b,l,l+(r-l)/2,2*k+1); T rval=query(a,b,l+(r-l)/2,r,2*k+2); return f(lval,rval); } public: LazySegmentTree(int n_,F f_,G g_,H h_,T t,E e,std::vector<T> dat_=std::vector<T>(),P p_=[](E a,int n){return a;}) :n(n_),init_t(t),init_e(e),f(f_),g(g_),h(h_),p(p_){ n0=1; while(n0<n)n0<<=1; dat=std::vector<T>(2*n0-1,init_t); lazy=std::vector<E>(2*n0-1,init_e); if(n_==dat_.size()){ for(int i=0;i<n_;i++)dat[i+n0-1]=dat_[i]; for(int i=n0-2;i>=0;i--)dat[i]=f(dat[2*i+1],dat[2*i+2]); } } void update(int a,int b,E val){ update(a,b,val,0,n0,0); } T query(int a,int b){ return query(a,b,0,n0,0); } }; int main() { std::cin.tie(nullptr); std::ios::sync_with_stdio(false); ll n,q; std::cin>>n>>q; std::vector<ll> a(n); rep(i,0,n)std::cin>>a[i]; auto sum=[](ll a,ll b){return a+b;}; auto mul=[](ll a,int n){return a*n;}; LazySegmentTree<ll,ll> seg(n,sum,sum,sum,0,0,std::vector<ll>(n,0),mul); using Query=std::tuple<char,ll,ll>; std::vector<Query> que; rep(i,0,q){ char c; ll x,y; std::cin>>c>>x>>y; x--; que.emplace_back(c,x,y); } std::vector<ll> ans(n,0); for(ll i=q-1;i>=0;i--){ ll x=std::get<1>(que[i]); ll y=std::get<2>(que[i]); if(std::get<0>(que[i])=='A'){ ans[x]+=y*seg.query(x,x+1); }else{ seg.update(x,y,1); } } rep(i,0,n){ std::cout<<ans[i]+a[i]*seg.query(i,i+1)<<" "; } std::cout<<"\n"; return 0; }