結果
問題 | No.2395 区間二次変換一点取得 |
ユーザー | anago-pie |
提出日時 | 2023-08-02 08:07:01 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 450 ms / 2,000 ms |
コード長 | 1,489 bytes |
コンパイル時間 | 1,737 ms |
コンパイル使用メモリ | 172,296 KB |
実行使用メモリ | 7,296 KB |
最終ジャッジ日時 | 2024-10-12 03:06:14 |
合計ジャッジ時間 | 6,625 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 2 ms
5,248 KB |
testcase_03 | AC | 2 ms
5,248 KB |
testcase_04 | AC | 2 ms
5,248 KB |
testcase_05 | AC | 2 ms
5,248 KB |
testcase_06 | AC | 2 ms
5,248 KB |
testcase_07 | AC | 2 ms
5,248 KB |
testcase_08 | AC | 2 ms
5,248 KB |
testcase_09 | AC | 2 ms
5,248 KB |
testcase_10 | AC | 2 ms
5,248 KB |
testcase_11 | AC | 5 ms
5,248 KB |
testcase_12 | AC | 41 ms
5,248 KB |
testcase_13 | AC | 447 ms
7,296 KB |
testcase_14 | AC | 445 ms
7,168 KB |
testcase_15 | AC | 446 ms
7,296 KB |
testcase_16 | AC | 446 ms
7,296 KB |
testcase_17 | AC | 450 ms
7,296 KB |
testcase_18 | AC | 401 ms
7,296 KB |
testcase_19 | AC | 400 ms
7,296 KB |
ソースコード
#include <bits/stdc++.h> #include <iterator> using namespace std; #define rep(i, n) for(int i=0; i<n; i++) #define debug 1 using ll = long long; using ld = long double; const int mod = 998244353; const double pi = atan2(0, -1); #include <time.h> #include <chrono> ll Power(ll x, ll y, ll B) { if (y == 0) { return 1; } if (y == 1) { return x % B; } if (y % 2 == 1) { return (Power(x, y - 1, B) * (x % B)) % B; } else { ll t = Power(x, y / 2, B) % B; return (t*t)%B; } } ll N, B; ll n = 1; struct SegTree { vector<ll> Tree; SegTree() { while (n < N) { n *= 2; } vector<ll> t(n*2, 0); Tree = t; } void Add(int l, int r){ AddFunc(l, r, 0, 0, n); } void AddFunc(int l, int r, int k, int s, int t) { if (r<=s || l>=t) { return; } else if (l <= s && r >= t) { Tree[k]++; } else { AddFunc(l, r, k * 2 + 1, s, (s+t) / 2); AddFunc(l, r, k * 2 + 2, (s+t) / 2, t); } } int Query(int m) { int ans = 0; int p = m + n - 1; while (p>0) { ans += Tree[p]; p = (p - 1) / 2; } ans += Tree[0]; return ans; } }; int main() { int Q; cin >> N >> B >> Q; SegTree tree; rep(test, Q) { int L, M, R; cin >> L >> M >> R; L--; M--; tree.Add(L, R); int num = tree.Query(M); ll X, Y, Z; X = (num + 1)%B; Z = Power(3, num, B)%B; if (num == 0) { Y = 1; } else { Y = (Power(3, num, B) + Power(3, num - 1, B) * (ll)num % B * ((ll)num + 3)%B) % B; } cout << X << " " << Y << " " << Z << endl; } }