結果
問題 | No.259 セグメントフィッシング+ |
ユーザー | codershifth |
提出日時 | 2015-12-28 00:01:28 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 80 ms / 2,000 ms |
コード長 | 3,275 bytes |
コンパイル時間 | 1,408 ms |
コンパイル使用メモリ | 164,364 KB |
実行使用メモリ | 7,348 KB |
最終ジャッジ日時 | 2024-09-19 07:33:18 |
合計ジャッジ時間 | 3,824 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,812 KB |
testcase_01 | AC | 1 ms
6,940 KB |
testcase_02 | AC | 1 ms
6,940 KB |
testcase_03 | AC | 1 ms
6,940 KB |
testcase_04 | AC | 2 ms
6,940 KB |
testcase_05 | AC | 1 ms
6,940 KB |
testcase_06 | AC | 2 ms
6,944 KB |
testcase_07 | AC | 1 ms
6,940 KB |
testcase_08 | AC | 73 ms
7,332 KB |
testcase_09 | AC | 76 ms
7,348 KB |
testcase_10 | AC | 73 ms
7,324 KB |
testcase_11 | AC | 70 ms
7,228 KB |
testcase_12 | AC | 73 ms
7,300 KB |
testcase_13 | AC | 80 ms
7,348 KB |
testcase_14 | AC | 76 ms
7,284 KB |
testcase_15 | AC | 77 ms
7,272 KB |
testcase_16 | AC | 77 ms
7,300 KB |
testcase_17 | AC | 75 ms
7,296 KB |
testcase_18 | AC | 76 ms
7,308 KB |
testcase_19 | AC | 76 ms
7,340 KB |
testcase_20 | AC | 78 ms
7,276 KB |
testcase_21 | AC | 76 ms
7,332 KB |
testcase_22 | AC | 73 ms
7,164 KB |
testcase_23 | AC | 31 ms
6,944 KB |
testcase_24 | AC | 43 ms
7,156 KB |
testcase_25 | AC | 45 ms
7,292 KB |
ソースコード
#include <bits/stdc++.h> typedef long long ll; typedef unsigned long long ull; #define FOR(i,a,b) for(int (i)=(a);i<(b);i++) #define REP(i,n) FOR(i,0,n) #define RANGE(vec) (vec).begin(),(vec).end() template <typename T> class BIT { public: std::vector<T> data; // [1,n] BIT() {} BIT(int n) { init(n); } void init(int n) { data.resize((1LL<<(int)ceil(log2(n))), 0); } // a[i] += x O(log(n)) void add(int i, int x) { int maxN = data.size()+1; // 2 冪 for (int k = i+1; k <= maxN; k += (k & -k)) data[k-1] += x; } // a[0]+...+a[i] O(log(n)) T sum(int i) { T s = 0; for (int k = i+1; k > 0; k -= (k & -k)) s += data[k-1]; return s; } T operator[](int i) { return sum(i)-sum(i-1); } }; using namespace std; class SegmentFishingPlus { public: void solve(void) { int N,Q; cin>>N>>Q; int B = 2*N; // 配列に含まれる魚を移動するのではなくて,魚の格納インデックスが時間毎に // 変化すると考える。 // 長さ 2*N の配列を考えて N-1 -> N, 2*N -> 0 とリング上につながっていて、 // 0~N-1 が右向き、N~2*n-1 が左向きとみなすことで端の魚の向きの反転を表現できる。 // 区間の総和を計算するには BIT をつかえばよい。 BIT<ll> ring(B); // O(Q*log(N)) while (Q--) { char x; int t,y,z; cin>>x>>t>>y>>z; t %= B; // t が B 未満とは限らない switch (x) { case 'R': ring.add((y-t+B)%B, z); break; case 'L': ring.add((B-1-y-t+B)%B, z); break; case 'C': { ll cnt = 0; --z; // [y,z) -> [y,z-1] 閉区間で扱う for (int i = 0; i < 2; ++i) { int l,r; if (i == 0) { l = (y-t+B)%B; r = (z-t+B)%B; } else { r = (B-1-y-t+B)%B; l = (B-1-z-t+B)%B; } ll add = ring.sum(r) - ring.sum(l-1); // 配列の末尾をまたぐケース if (r < l) add += ring.sum(B-1); cnt += add; } cout<<cnt<<endl; } break; default: assert(false); break; } } } }; #if 1 int main(int argc, char *argv[]) { ios::sync_with_stdio(false); auto obj = new SegmentFishingPlus(); obj->solve(); delete obj; return 0; } #endif