闲话

这个

?突然没什么好说的了
今天模拟赛让我体验了别人 csp 的四分之三
别人:看T2。哦,会了。看T1。哦,会了。看T3。哦,会了。看T4。哦,会了。好像 AK 了,非常感动。
我今天:看T2。哦,会了。看T4。哦,会了。看T3。……哦,会了。看T1。……好像 AK ,不是很感动。
于是是四分之三(

今天 221122 ,是回文!

杂题

ARC146C

请输出满足下述条件的集合 \(S \in \{0,1,2,\ldots,2^n-1\}\) 的个数对 \(998244353\) 取模后的结果。

  • 对于所有 \(S\) 的非空子集 \(T\),均满足下列条件之一:
    • \(\lvert T \rvert\) 为奇数;
    • \(T\)中所有元素的异或和不为 \(0\)

\(1 \le n \le 2 \times 10^5\)

考虑向已经满足条件的集合中加入元素得到新的集合。设 \(f_i\) 为大小为 \(i\) 的满足条件的集合。根据定义有 \(f_0 = 1,\ f_1 = 2^n\)

设一个满足条件的集合为 \(S\)\(S\) 的一个大小为奇数的子集为 \(T\)\(T\) 内元素的异或和为 \(x\)。如果我们将 \(x\) 加入了集合 \(S\) 得到 \(S’\),则 \(T\cup \{x\} \subseteq S’\),而 \(2\mid |T\cup \{x\} |\),因此 \(S’\) 不满足条件。
由此可以看到,对于一个满足条件的集合 \(S\),向其中加入任意一个奇大小子集的异或和会使得其不再满足条件。同时,由于 \(S\) 是满足条件的集合,任意两个奇大小子集的异或和都不同,因为反之可以取这两个子集中只出现过一次的元素作为一个偶大小子集,而这个子集的异或和为 \(0\)

因此我们可以发现,大小为 \(i\) 的集合可以加入 \([总元素数量] – [大小为\ i\ 的集合中奇大小子集的数量] = 2^n – 2^{i-1}\) 种互不相同的元素得到大小为 \(i + 1\) 的集合。而每个 \(i + 1\) 大小集合通过此方法都被计数了 \(i + 1\) 次,因此有转移

\[f_{i+1} = \frac 1{i+1} \left(f_{i} \times (2^n – 2^{i-1})\right) \]

预处理 \(2\) 的幂次与逆元后复杂度为 \(O(n)\)

推一下 APJifengc 的线代版题解
\疾风c/\疾风c/\疾风c/\疾风c/

code
#include <bits/stdc++.h>
using namespace std; 
#define rep(i,s,t) for (register int i = (s), i##_ = (t) + 1; i < i##_; ++ i)
const int N = 2e5 + 10, mod = 998244353;
int n, f[N], inv[N], pw[N], ans;
signed main() {
    cin >> n; 
    pw[0] = 1; rep(i,1,n + 1) { pw[i] = (pw[i - 1] << 1); if (pw[i] >= mod) pw[i] -= mod; }
    f[0] = 1; f[1] = pw[n];
    inv[0] = inv[1] = 1; rep(i,2,n+1) inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod;
    rep(i,2,n + 1) f[i] = 1ll * f[i - 1] * (pw[n] - pw[i - 2] + mod) % mod * inv[i] % mod;
    rep(i,0,n + 1) { ans += f[i]; if (ans >= mod) ans -= mod; };
    cout << ans << '\n';
}



ARC087E

对于两个字符串 \(s, t\) , 如果 \(s\) 不是 \(t\) 的前缀且 \(t\) 不是 \(s\) 的前缀,则称他们前缀互不包含。

给定一个正整数 \(L\),如果一个字符串集合 \(S\) 符合下列条件,则我们称他为好的集合:

  • \(S\) 中的每个字符串的长度都在 \(1\)\(L\) 之间(包括),并且只包含字符 01
  • \(S\) 中的每两个的字符串都前缀互不包含

我们有一个好的集合 \(S = {s_1, s_2 … , s_n}\),Alice 和 Bob 在玩一个游戏,他们轮流做下列操作:

  • \(S\) 中添加一个新字符串,并使 \(S\) 仍是好的集合

无法进行这个操作的人输掉游戏。假设二人都按最优策略进行游戏,求谁会赢。

\(1 \leq N \leq 10^5, \ 1 \leq L \leq 10^{18},\ \sum |s_i| \le 10^5\)

首先建出一棵深度为 \(L\) 的 Trie,其是一棵满二叉树。(不用真建)
然后我们能发现,假如我们选了这上面的一条链,那链尾的子树上节点和链上节点都是不能选的。容易发现这样的一条链把原树划分成了更多更小的满二叉树。这就是 ICG 图上由大到小的一系列边。
观察这些二叉树。假设我们选了根节点,则无法再选择,该局面必败。假设我们选了深度为 \(i\) 的节点,那么会剩余 \(i\) 棵深度为 \(x – j\text{ s.t. } 1\le j \le i\) 的满二叉树。

则有

\[SG(x) = \mathop{\text{mex}}_{i=1}^x\left(\bigoplus_{j=1}^i SG(x – j) \right) \]

我们断言,\(SG(x) = \text{lowbit }x\)。证明考虑数学归纳法(
于是可以直接把 \(S\) 建成 Trie ,然后在 Trie 上 dp。
总时间复杂度 \(O( \sum |s_i| )\)

code
#include <bits/stdc++.h>
using namespace std; 
#define rep(i,s,t) for (register int i = (s), i##_ = (t) + 1; i < i##_; ++ i)
const int N = 1e5 + 100;
int n, trie[N][2], ed[N], mlc = 1;
long long l, ans;
char ch[N];
#define lowbit(x) ((x) & -(x))
queue<pair<int,int> > que;
signed main() {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); 
    cin >> n >> l; 
    rep(i,1,n) {
        cin >> ch + 1;
        int len = strlen(ch + 1), ptr = 1;
        rep(j,1,len) {
            if (!trie[ptr][ch[j] - '0']) trie[ptr][ch[j] - '0'] = ++ mlc;
            ptr = trie[ptr][ch[j] - '0'];
        } ed[ptr] = 1;
    }
    que.emplace(1, 0);
    while (que.size()) {
        auto [u, dep] = que.front(); que.pop();
        if (ed[u]) continue ;
        if (trie[u][0]) que.emplace(trie[u][0], dep + 1);
        else ans ^= lowbit(l - dep);
        if (trie[u][1]) que.emplace(trie[u][1], dep + 1);
        else ans ^= lowbit(l - dep);
    }
    puts(ans ? "Alice" : "Bob");
}



CF1000F

给定一个长度为 \(n\) 的序列 \(a\)。有 \(m\) 个询问,每次询问给定一个区间 \([l,r]\),如果这个区间里存在只出现一次的数,输出这个数(有多个输出任意一个即可),没有就输出0。

\(n,m\le 5\times 10^5\)

\(i\) 左侧第一个与 \(a_i\) 相同的位置为 \(l_i\),右侧第一个位置为 \(r_i\)
容易发现一次询问 \((l,r)\) 如果满足 \(l_i < l\le i\le r < r_i\) 则输出 \(i\) 即可。

询问离线。首先在全局维护一个 bool 数组 \(b\)\(b_i\) 表示 \(i\) 是否仍然可以作为答案。
一次询问 \((l,r)\)\(r\) 位置的询问桶里插入 \(l\)。一次修改在 \(i\) 位置的修改桶里插入 \([l_i + 1,i]\) 的加入 \(i\),在 \(r_i\) 位置的修改桶里插入 \([l_i + 1,i]\) 的删除 \(i\)

在线段树的每个节点维护一个链表,标记永久化。区间加入 \(i\) 时正常加入 \(O(\log n)\) 个节点,并将 \(b_i\) 置为 \(\text{true}\)。区间删除时懒惰删除,将 \(b_i\) 标记为 \(\text{false}\) 即可。
查询时顺着从根查到叶子,过程中顺序扫描路径上每个链表,并将不合法节点删除。查到后即可直接返回。

根据均摊,总时间复杂度 \(O(n\log n)\)

没写代码。

原文地址:http://www.cnblogs.com/joke3579/p/chitchat221122.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性