去年花了大概并不长的时间口胡了四个 (D1T2, D1T3, D2T1, D2T2),感觉比 ZJOI 2018 不知道友好到哪里去了。然后 D1T1 不会算复杂度跑路了,D2T3 只会 (后面用奇技淫巧优化到了 然后卡了。
在 little_waxberry 神仙的指点下意识到 D2T3 只用关心每条直线最上面的一次 occurence(也就是说剥掉上层凸壳之后上面的直线只会起到增加其它直线 rank 的作用而不会被计入答案),顿悟,才发现之前自己一直在试图把凸壳前 层的完整形态求出来(其实前 层加起来就已经有 段了,标算的复杂度是不可能做到的,这辈子都不可能做到的),然后会了。可能这就是菜吧。
感觉这个 2020 年状态一直不太行……经常浮躁而无法静下来去分析一个问题试图突破……希望,能改改吧。
D1T1
由于某种原因鸽了。
人有多大胆,地有多大产。
考虑怎么判断和牌:dp 即可。 表示考虑了值为 的牌,有 个 的顺子, 个 的顺子, 个对子的方案数,再记一下不同对子个数的最大值。注意只存那些目前还没和的状态,总共只有几百个。
再用一个 dp 套它,dp for dp. 时间复杂度 .
D1T2
套路数据结构题
令 表示节点 上有 tag 的概率并维护。遗憾的是这玩意没法转移。
观察为啥没法转移。考虑除了 之外再维护 表示 到根的链上至少有一个 tag 的概率。然后这二者可以相互转移。
用线段树维护。时间复杂度 。
#include <bits/stdc++.h>
#define rep(i, n) for(int i = 0; i < (int)(n); i ++)
#define rep1(i, n) for(int i = 1; i <= (int)(n); i ++)
#define MP make_pair
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int MOD = 998244353;
const int INV2 = (MOD + 1) / 2;
int pwi2[100005];
int n, m, sum;
int f[262144], g[262144];
int cnt[262144];
void pushdown(int v)
{
cnt[v << 1] += cnt[v];
f[v << 1] = (1 - pwi2[cnt[v]] + 1LL * f[v << 1] * pwi2[cnt[v]] + MOD) % MOD;
cnt[v << 1 | 1] += cnt[v];
f[v << 1 | 1] = (1 - pwi2[cnt[v]] + 1LL * f[v << 1 | 1] * pwi2[cnt[v]] + MOD) % MOD;
cnt[v] = 0;
}
void modify(int rt, int cl, int cr, int l, int r, int ccnt)
{
if(r < cl || l > cr) {
sum = (sum - g[rt] + MOD) % MOD;
g[rt] = 1LL * (g[rt] + f[rt]) * INV2 % MOD;
sum = (sum + g[rt]) % MOD;
return;
}
if(l <= cl && r >= cr) {
cnt[rt] ++;
sum = (sum - g[rt] + MOD) % MOD;
g[rt] = 1LL * (g[rt] + 1) * INV2 % MOD;
sum = (sum + g[rt]) % MOD;
f[rt] = 1LL * (f[rt] + 1) * INV2 % MOD;
return;
}
sum = (sum - g[rt] + MOD) % MOD;
g[rt] = 1LL * g[rt] * INV2 % MOD;
sum = (sum + g[rt]) % MOD;
f[rt] = 1LL * f[rt] * INV2 % MOD;
pushdown(rt);
int mid = cl + cr >> 1;
modify(rt << 1, cl, mid, l, r, ccnt);
modify(rt << 1 | 1, mid + 1, cr, l, r, ccnt);
}
int main()
{
scanf("%d%d", &n, &m);
pwi2[0] = 1;
rep1(i, m) pwi2[i] = 1LL * pwi2[i - 1] * INV2 % MOD;
int cur = 1;
rep(i, m) {
int t, l, r;
scanf("%d", &t);
if(t == 1) {
scanf("%d%d", &l, &r);
modify(1, 1, n, l, r, 0);
cur = 2 * cur % MOD;
} else {
l = 1LL * cur * sum % MOD;
printf("%d\n", l);
}
}
return 0;
}
D1T3
2 * 2 矩乘的 1e5 n log^2 n,比想象中稳
设最终在根上的值为 。
我们不关心一个节点上的具体值;我们只关心它和 的大小关系。
考虑我们对于每个 计算 的叶子集合数量。
固定