結果
| 問題 |
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;
}
钟梓皓