首页 > 其他分享 >闲话 22.11.22

闲话 22.11.22

时间:2022-11-22 17:36:52浏览次数:72  
标签:le pw 22 trie 闲话 rep 22.11 集合 mod

闲话

这个

?突然没什么好说的了
今天模拟赛让我体验了别人 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)\)。

没写代码。

标签:le,pw,22,trie,闲话,rep,22.11,集合,mod
From: https://www.cnblogs.com/joke3579/p/chitchat221122.html

相关文章

  • 我国首个关保国家标准GB/T 39204-2022正式发布
    近日,市场监管总局(标准委)发布公告,正式批准包括《信息安全技术关键信息基础设施安全保护要求》在内的2项国家标准。据悉,此次发布的GB/T39204-2022《信息安全技术关键信息基......
  • NFC芯片DP1363F兼容LRC663/RC522支持18092/15693协议多设备读卡超高性价比
    DP1363是一款高度集成的非接触读写芯片,集强大的多协议支持、最高射频输出功率、以及突破性技术低功耗卡片检测等优势一身,满足市场对更高集成度、更小外壳和互操作性的需求,......
  • 知行之桥EDI系统2022版Tomcat部署
    1.首先需要下载Tomcat,可在Tomcat官网获取,本部署步骤以apache-tomcat-9.0.67.tar.gz为例,通过XFTP将该包放在服务器上的指定位置,如/opt/test进入/opt/test文件夹后,在命令行执......
  • HTAP 的下一步?SoTP 初探(上):从 “大” 数据到 “小” 而 “宽” 数据 —— 第七届中国开
    在今年的第七届中国开源年会上,StoneDB团队在大数据分论坛发表了《HTAP的下一步?SoTP初探》主题演讲,在本次演讲中,我们首次正式对外阐释了“SoTP数据库”的技术理念,本系列......
  • 20221122-Python格式化字符串
    1.格式化字符串       ......
  • # VS2022手动引入easyX绘制工具
    1.下载EasyX_20220901.exe安装包,手动修改后缀名为7z,解压2、找到vs的安装目录\MicrosoftVisualStudio\2022\Professional\VC\Auxiliary\VS3、把前面解压出来的include......
  • 20221121-Python-对象的方法
    1.对象方法的概念:               ......
  • csp2022游记
    Day1入住隔离酒店,进行复习Day2~6继续复习,打模拟赛打到吐,普及难度200~300(严重怀疑是否是普及难度),感觉自己今年要凉……Day7明天就要出发了,我妈信誓旦旦地给我说:“S......
  • 20221122 常用MySQL查询
    查询版本selectversion();查询表名和表注释selectTABLE_NAME,TABLE_COMMENTfromINFORMATION_SCHEMA.Tableswheretable_schema='daoancomp';查询表字段和注......
  • 2022-11-22 Acwing每日一题
    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我......