結果

問題 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]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ソースコード

diff #
プレゼンテーションモードにする

#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;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0