結果
問題 | No.1222 -101 |
ユーザー |
![]() |
提出日時 | 2020-09-04 22:45:24 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 129 ms / 2,000 ms |
コード長 | 3,860 bytes |
コンパイル時間 | 2,749 ms |
コンパイル使用メモリ | 196,716 KB |
最終ジャッジ日時 | 2025-01-14 06:10:02 |
ジャッジサーバーID (参考情報) |
judge1 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 35 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:39:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 39 | scanf("%d%d", &n, &m); | ~~~~~^~~~~~~~~~~~~~~~ main.cpp:41:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 41 | scanf("%d%d%d", &l[i], &r[i], &p[i]); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include <bits/stdc++.h>const int N = 200010;const int moder = int(1e9) + 7;int l[N], r[N], p[N];int cnt[N], zeroid[N], oneid[N];int right[N], left[N];int zeroleft[N];int dp[N][2], pre1[N][2], pre2[N][2];int power[N], invpower[N];int fa[N * 2];int powermod(int a, int exp){int ret = 1;for ( ; exp > 0; exp >>= 1){if (exp & 1){ret = 1ll * ret * a % moder;}a = 1ll * a * a % moder;}return ret;}int find(int u){return fa[u] == u ? u : (fa[u] = find(fa[u]));}void unite(int u, int v){u = find(u), v = find(v);if (u == v){return;}fa[u] = v;}int main(){int n, m;scanf("%d%d", &n, &m);for (int i = 0; i < m; ++ i){scanf("%d%d%d", &l[i], &r[i], &p[i]);if (p[i]){++ cnt[l[i]];-- cnt[r[i] + 1];}}for (int i = 1; i <= n; ++ i){cnt[i] += cnt[i - 1];}int id = 0;for (int i = 1; i <= n; ++ i){if (!cnt[i]){zeroid[i] = ++ id;}}for (int i = n; i >= 1; -- i){right[i] = cnt[i] == 0 ? zeroid[i] : right[i + 1];}for (int i = 1; i <= n; ++ i){left[i] = cnt[i] == 0 ? zeroid[i] : left[i - 1];}for (int i = 0; i < m; ++ i){if (!p[i]){int ll = right[l[i]];int rr = left[r[i]];if (ll == 0 || rr == 0 || ll > rr){puts("0");return 0;}zeroleft[rr] = ll;}}int max = 0;for (int i = 1; i <= id; ++ i){if (zeroleft[i] <= max){zeroleft[i] = 0;}max = std::max(max, zeroleft[i]);}power[0] = 1, power[1] = 2ll * powermod(3, moder - 2) % moder;invpower[0] = 1, invpower[1] = 3ll * powermod(2, moder - 2) % moder;for (int i = 2; i < N; ++ i){power[i] = 1ll * power[i - 1] * power[1] % moder;invpower[i] = 1ll * invpower[i - 1] * invpower[1] % moder;}dp[0][0] = pre1[0][0] = pre2[0][0] = 1;for (int i = 1; i <= id; ++ i){if (zeroleft[i]){int len = i - zeroleft[i] + 1;for (int j = 0; j < 2; ++ j){dp[i][j] = 1ll * pre1[zeroleft[i] - 1][j ^ 1] * power[len] % moder;dp[i][j] = (dp[i][j] + 1ll * (pre2[i - 1][j ^ 1] - pre2[zeroleft[i] - 1][j ^ 1]) * power[i]) % moder;dp[i][j] += dp[i][j] < 0 ? moder : 0;}}for (int j = 0; j < 2; ++ j){pre1[i][j] = (pre1[i - 1][j] + dp[i][j]) % moder;pre2[i][j] = (pre2[i - 1][j] + 1ll * invpower[i] * dp[i][j]) % moder;}}int ans = (1ll * (pre1[id][0] - pre1[id][1]) * powermod(3, id)) % moder;ans += ans < 0 ? moder : 0;id = 0;for (int i = 1; i <= n; ++ i){if (cnt[i]){oneid[i] = ++ id;}}for (int i = 0; i < 2 * N; ++ i){fa[i] = i;}int nn = n;n = id + 1;for (int i = 0; i < m; ++ i){if (!p[i]){continue;}l[i] = oneid[l[i]];r[i] = oneid[r[i]];if (p[i] == 1){if (find(l[i] - 1) == find(r[i] + n)){puts("0");return 0;}unite(l[i] - 1, r[i]);unite(l[i] - 1 + n, r[i] + n);}else if (p[i] == -1){if (find(l[i] - 1) == find(r[i])){puts("0");return 0;}unite(l[i] - 1, r[i] + n);unite(l[i] - 1 + n, r[i]);}}int ccnt = 0;for (int i = 0; i < 2 * n; ++ i){if (find(i) == i){++ ccnt;}}ccnt /= 2;-- ccnt;ans = 1ll * ans * powermod(2, ccnt) % moder;printf("%d\n", ans);return 0;}