結果
問題 | No.142 単なる配列の操作に関する実装問題 |
ユーザー | beet |
提出日時 | 2021-06-20 17:57:15 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 3,187 ms / 5,000 ms |
コード長 | 1,994 bytes |
コンパイル時間 | 1,876 ms |
コンパイル使用メモリ | 205,220 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-22 22:32:51 |
合計ジャッジ時間 | 13,419 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 738 ms
6,816 KB |
testcase_01 | AC | 2,573 ms
6,944 KB |
testcase_02 | AC | 3,187 ms
6,940 KB |
testcase_03 | AC | 717 ms
6,940 KB |
testcase_04 | AC | 2,534 ms
6,940 KB |
ソースコード
#ifndef call_from_test #include <bits/stdc++.h> using namespace std; #endif //BEGIN CUT HERE // half open interval [l, r) template<typename T=unsigned long long> struct BitVector{ inline static constexpr size_t B = sizeof(T) * CHAR_BIT; size_t n; vector<T> dat; BitVector(size_t n_):n(n_),dat(n_/B+1,0){} inline T get(size_t i)const{return (dat[i/B]>>(i%B))&T(1);} void set(size_t i,T v){ dat[i/B]&=~(T(1)<<(i%B)); dat[i/B]|=v<<(i%B); } // O(B + (r - l) / B) BitVector get(size_t l,size_t r)const{ BitVector res(r-l); if(r-l<=B){ for(size_t i=l;i<r;i++) res.set(i-l,get(i)); return res; } size_t p=(l+B-1)/B*B,q=r/B*B; // [l, p) for(size_t i=l;i<p;i++) res.set(i-l,get(i)); // [p, q) for(size_t i=p;i<q;i+=B){ if(l%B==0) res.dat[(i-l)/B]=dat[i/B]; else{ res.dat[(i-l)/B+0]|=dat[i/B]<<(p-l); res.dat[(i-l)/B+1]|=dat[i/B]>>(B-(p-l)); } } // [q, r) for(size_t i=q;i<r;i++) res.set(i-l,get(i)); return res; } void set(size_t l,size_t r,const BitVector& bv){ if(r-l<=B){ for(size_t i=l;i<r;i++) set(i,bv.get(i-l)); return; } size_t p=(l+B-1)/B*B,q=r/B*B; // [l, p) for(size_t i=l;i<p;i++) set(i,bv.get(i-l)); // [p, q) for(size_t i=p;i<q;i+=B){ if(l%B==0) dat[i/B]=bv.dat[(i-l)/B]; else dat[i/B]=(bv.dat[(i-l)/B+0]>>(p-l))|(bv.dat[(i-l)/B+1]<<(B-(p-l))); } // [q, r) for(size_t i=q;i<r;i++) set(i,bv.get(i-l)); } }; //END CUT HERE #ifndef call_from_test signed main(){ int n,s,x,y,z; cin>>n>>s>>x>>y>>z; int q; cin>>q; BitVector bv(n+1); int a=s; for(int i=1;i<=n;i++){ bv.set(i,a&1); a=(1LL*x*a+y)%z; } for(int i=0;i<q;i++){ int s,t,u,v; cin>>s>>t>>u>>v; auto p=bv.get(s,t+1),q=bv.get(u,v+1); for(int i=0;i<(int)p.dat.size();i++) p.dat[i]^=q.dat[i]; bv.set(u,v+1,p); } for(int i=1;i<=n;i++) cout<<(bv.get(i)?"O":"E"); cout<<endl; return 0; } #endif