社区讨论
求跳abcG
学术版参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @miudo4b5
- 此快照首次捕获于
- 2025/12/06 22:17 2 个月前
- 此快照最后确认于
- 2025/12/06 23:42 2 个月前
CPP
#include <bits/stdc++.h>
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize(3)
#pragma GCC optimize(2)
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
using namespace std;
//#undef ONLINE_JUDGE
#define int long long
void clear() {
}
int n, m, dp[500005], dp2[500005], l[500005], r[500005];
/* Yet another rongchi problem?
考虑 dp[i] 表示计数以 i 开头的合法方案数量
那么我们就会大力进行转移
这样就会把连续类的算进来,也就是不合法的
为了去除,我们需要容斥
我们考虑这个连续段会连续到哪里
然后再来计数
但是这样或许不利于方案数的计量
先试试
不会算重的吧
嗯哼算重了
我们考虑到,直接计算会包含以下情形:
xxxxoooooo
而不会包含:
xxxxxxoooo
因为这是我们对于合法的定义
也就是只有第一个不合法的?
我们考虑别样的计数,例如,另外计数一个东西表示任意搞的方案数量
那么就可以 i 的任意搞的值减去 i+2 任意搞的值?
这对吗
xxxxxxooooooxxxxoo
这个东西会被消除
xxooooooooooxxxxoo
这个不会被消除,这不符合预期
所以还是应该为 dp[i+2] - ...
所以应该是 -1 ^ i 状物,这不是我们想看见的,因为非常棍母
首先通过一些神秘东西去掉
然后滚木消失了一半
于是可能就需要大力 ds 了
好的
*/
const int p = 998244353;
int cnt1[500005], cnt2[500005], rsum[500005], r2sum[4][2];
vector<pair<int, int>> edges[500005];
void solve() {
cin >> n >> m;
for (int i = 1; i <= m; ++i) {
cin >> l[i] >> r[i];
edges[l[i]].push_back({r[i], -1});
edges[r[i]].push_back({r[i], 1});
cnt2[r[i]]++;
cnt2[l[i]]--;
}
dp[n + 1] =1;
dp2[n + 1] = 1;
int nowcnt = 0;
for (int i = n; i >= 1; --i) {
int ans = dp[i + 1];
int cnt = 0;
/*
for (int j = 1; j <= m; ++j) {
if (l[j] <= i && i + 1 <= r[j]) {
if (((r[j]+1-i)/2)%2) ans += dp2[((r[j] + 2) + ((r[j]+1)%2==i%2))];
else ans -= dp2[((r[j] + 2) + ((r[j]+1)%2==i%2))];
}
}*/
int j = 0;
ans += r2sum[(i + 1)%4][0];
ans += r2sum[(i + 2)%4][1];
ans -= r2sum[(i + 3)%4][0];
ans -= r2sum[(i + 4)%4][1];
/*
for (r[j] = i; r[j] <= n; ++r[j]) {
if (r[j] % 4 == (i+1) % 4)
ans += dp2[(r[j] + 2) + 1] * rsum[r[j]];
else if (r[j] % 4 == (i+2) % 4)
ans += dp2[(r[j] + 2)] * rsum[r[j]];
else if (r[j] % 4 == (i+3) % 4)
ans -= dp2[(r[j] + 2) + 1] * rsum[r[j]];
else
ans -= dp2[(r[j] + 2)] * rsum[r[j]];
}*/
cnt = nowcnt;
ans += (dp[i + 2] - dp2[i + 4]) * cnt % p;
nowcnt += cnt2[i];
for (auto j : edges[i]) {
rsum[j.first] += j.second ;
(r2sum[j.first % 4][1] += dp[j.first + 2] * j.second) %= p;
(r2sum[j.first % 4][0] += dp[j.first + 3] * j.second) %= p;
}
dp[i] = ans % p;
dp2[i] = (dp[i] - dp2[i + 2]) % p;
}
cout << (dp[1]%p+p)%p << "\n";
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int tc = 1;
// cin >> tc;
while (tc--) {
clear();
solve();
}
return 0;
}
不知道为什么不会过样例
回复
共 2 条回复,欢迎继续交流。
正在加载回复...