結果
問題 | No.1222 -101 |
ユーザー |
![]() |
提出日時 | 2020-09-04 22:14:52 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 200 ms / 2,000 ms |
コード長 | 1,408 bytes |
コンパイル時間 | 1,990 ms |
コンパイル使用メモリ | 200,424 KB |
最終ジャッジ日時 | 2025-01-14 05:53:10 |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 35 |
ソースコード
#include <bits/stdc++.h>using namespace std;const long long MOD = 1000000007;long long modpow(long long a, long long b){long long ans = 1;while (b > 0){if (b % 2 == 1){ans *= a;ans %= MOD;}a *= a;a %= MOD;b /= 2;}return ans;}long long modinv(long long a){return modpow(a, MOD - 2);}int main(){int N, M;cin >> N >> M;vector<int> L(M), R(M), P(M);for (int i = 0; i < M; i++){cin >> L[i] >> R[i] >> P[i];L[i]--;}vector<int> d(N + 1, 0);vector<int> left(N + 1, -1);vector<bool> right(N + 1, false);for (int i = 0; i < M; i++){if (P[i] == 0){left[R[i]] = max(left[R[i]], L[i]);} else {d[L[i]]++;d[R[i]]--;right[R[i]] = true;}}for (int i = 0; i < N; i++){d[i + 1] += d[i];left[i + 1] = max(left[i + 1], left[i]);}vector<long long> dp(N + 1, 0);vector<long long> sum(N + 2, 0);dp[0] = 1;sum[1] = 1;long long tmp = 1;for (int i = 0; i < N; i++){if (d[i] == 0){dp[i + 1] = (sum[i + 1] - sum[left[i] + 1] + MOD) % MOD;if (!right[i + 1]){dp[i + 1] *= modinv(2);dp[i + 1] %= MOD;}}if (!right[i + 1]){tmp *= 2;tmp %= MOD;}sum[i + 2] = (sum[i + 1] + dp[i + 1]) % MOD;}long long ans = (sum[N + 1] - sum[left[N] + 1] + MOD) % MOD;ans *= tmp;ans %= MOD;cout << ans << endl;}