santisify Site

Back

最大权独立集问题#

题目详情

题目描述

给定 nn 个点,每个点有一个整数权值 WiW_i

定义两点 iijj 之间存在一条无向边,当且仅当 WiWjW_i \oplus W_j(其中 \oplus 表示按位异或运算)的二进制表示中,11 的个数为奇数。

请你求出这个图的最大权独立集。即,选择一个点集满足集合内任意两点之间没有边,且集合内点的权值之和最大。定义空集的权值为 00。你只需要求出这个最大的权值之和。

输入格式

本题有多组数据。

输入一行一个正整数 tt1t1051 \le t \le 10^5),表示测试数据组数。

每组数据中:

第一行一个正整数 nn1n5×1051 \le n \le 5 \times 10^5),表示点数。

第二行 nn 个正整数 W1,W2,,WnW_1,W_2,\cdots,W_n1Wi1091 \le W_i \le 10^9),表示点的权值。

保证 1n5×1051 \le \sum n \le 5 \times 10^5

输出格式

每组数据输出一行一个整数,表示最大权独立集的权值之和。

输入输出样例 #1

输入 #1

3
5
3 5 15 1 2
3
6 7 11
4
1 2 4 8
plaintext

输出 #1

23
18
15
plaintext

解题思路#

题目中给出WiW_iWjW_j二进制下异或结果的11个数为奇数代表之间有一条边.那我们可以假设一下,将数组AA中的数按照二进制下 11 的个数划分为奇数XX和偶数YY两个集合.

对于一个集合中两个数XiX_i(xx11), XjX_j(yy11), 其中两个数二进制下有kk11是同时出现的,那么这两个数异或后的结果就有x+y2kx+y-2*k11

通过x+y2kx+y-2*k可以发现无论xx, yy同为奇数或偶数结果都为偶数,可以证明同一个集合内的任意两个数不会有边.

参考代码#

那一天的回文字符串#

题目详情

题目描述

一天,面码和仁太遇到了一个由小写英文字母组成的字符串 ss

为了打发时间,他们发明了一个游戏:面码可以任意重排字符串中所有奇数下标位置上的字符,仁太可以任意重排字符串中所有偶数下标位置上的字符。

他们想知道,经过这样的重排后,是否可以把字符串变成一个回文串。请你帮助他们!

回文串指从前往后读和从后往前读都相同的字符串。例如,aa\mathtt{aa}aba\mathtt{aba}abccba\mathtt{abccba} 是回文串,而 sccpc\mathtt{sccpc}reality\mathtt{reality}ab\mathtt{ab} 不是回文串。

输入格式

第一行包含一个整数 tt1t1001 \le t \le 100),表示测试数据的组数。

对于每组测试数据,唯一一行包含一个由小写英文字母组成的字符串 ss1s1001 \le |s| \le 100)。

输出格式

对于每组测试数据,如果可以将 ss 变成回文串,输出一行 “YES”,否则输出一行 “NO”。

你可以以任意大小写形式输出答案。例如,“yEs”、“yes”、“Yes” 和 “YES” 都会被视为正确回答。

输入输出样例 #1

输入 #1

5
abba
abcd
aabb
abcba
abcde
plaintext

输出 #1

YES
NO
YES
YES
NO
plaintext

说明/提示

在第一组测试数据中,给定字符串本身已经是一个回文串。

在第三组测试数据中,可以重排奇数下标位置,使得下标 11 处为 a\mathtt{a},下标 33 处为 b\mathtt{b};同时重排偶数下标位置,使得下标 22 处为 b\mathtt{b},下标 44 处为 a\mathtt{a}。这样可以得到回文串 abba\mathtt{abba}

解题思路#

字符串中只能同奇偶性的下标的字母可交换,那么我们就需要根据字符串长度做分类讨论:

1.对于偶数长度的字符串,只有偶数下标与奇数下标的字母完全相等才能组成回文字符串.

2.对于奇数长度的字符串,只有不成对出现的个数ct1ct \le 1才能组成回文字符串.

参考代码#

禁忌教典的消失咒文#

题目详情

题目描述

阿尔扎诺帝国魔术学院中,格伦老师难得认真地研究起了一本古老的禁忌教典。教典中记载了一种特殊的法术序列。序列由 nn 道咒文组成,第 ii 道咒文的魔力值为 aia_i

一开始,希丝缇娜以为只要把所有咒文的魔力简单相加,就能得到整个法术的强度。但格伦老师很快发现,这种咒文并不是这样运作的。第一道咒文会正向释放魔力,第二道咒文会反向抵消魔力,第三道咒文又会正向释放魔力,第四道咒文再次反向抵消魔力,之后依次交替。形式化地,对于一个法术序列 b1,b2,...,bmb_1,b_2,...,b_m,定义它的能量值为 E(b)=i=1m(1)i+1biE(b)=\sum_{i=1}^{m}(-1)^{i+1}b_i。空序列的能量值定义为 00

在继续解析教典时,露米娅发现其中有一段连续咒文受到了异常魔力污染。如果直接吟唱,整个法术很可能会失控。于是格伦老师决定:必须恰好选择一段非空连续咒文,将它们从序列中抹去。也就是说,需要选择一个区间 [l,r][l,r],删除 al,al+1,...,ara_l,a_{l+1},...,a_r。被删除的咒文消失后,剩余咒文会按照原来的相对顺序自动连接成一个新的法术序列 a1,...,al1,ar+1,...,ana_1,...,a_{l-1},a_{r+1},...,a_n

格伦老师希望最终得到的法术序列能量值恰好等于 kk。请你帮助希丝缇娜和露米娅计算,有多少种不同的删除区间 [l,r][l,r] 可以满足这个要求。

输入格式

第一行包含一个整数 tt (1t1051 \le t \le 10^5),表示测试数据组数。

对于每组测试数据,第一行包含两个整数 n,kn,k (1n1061 \le n \le 10^6109k109-10^9 \le k \le 10^9),表示咒文数量和目标能量值。

第二行包含 nn 个整数 a1,a2,,ana_1,a_2,\ldots,a_n (109ai109-10^9 \le a_i \le 10^9),表示每道咒文的魔力值。

保证所有测试数据的 nn 之和不超过 10610^6

输出格式

对于每组测试数据,输出一个整数,表示满足要求的删除区间数量。

输入输出样例 #1

输入 #1

3
4 0
1 3 2 4
3 0
1 2 1
5 1
2 1 3 4 2
plaintext

输出 #1

2
2
3
plaintext

解题思路#

这道题的核心在于将原序列的交替符号特性吸收到前缀和中,然后通过分析删除区间长度奇偶性对剩余序列能量值的影响,把问题转化为对前缀和的等式计数。

记前缀和 Si=j=1iAjS_i = \sum_{j=1}^i A_j

删除区间 [l,r][l, r],剩余部分由 [1,l1][1, l-1][r+1,n][r+1, n] 拼接而成。前半部分能量为 Sl1S_{l-1}。 后半部分的元素在原序列中位置前移了 len=rl+1\text{len} = r-l+1 位。由于符号与位置的奇偶相关,移动 len\text{len} 位会导致后半部分每个元素的符号整体乘上 (1)len(-1)^{\text{len}}。因此后半部分能量为 (1)len(SnSr)(-1)^{\text{len}} (S_n - S_r)。 剩余序列总能量: E=Sl1+(1)rl+1(SnSr)E = S_{l-1} + (-1)^{r-l+1}(S_n - S_r) 要求 E=kE = k

  • 若区间长度为偶数rl+1r-l+1 为偶,即 rrl1l-1 同奇偶): E=Sl1+SnSr=kSr=Sl1+SnkE = S_{l-1} + S_n - S_r = k \quad \Rightarrow \quad S_r = S_{l-1} + S_n - k

  • 若区间长度为奇数rl+1r-l+1 为奇,即 rrl1l-1 不同奇偶): E=Sl1(SnSr)=kSr=k+SnSl1E = S_{l-1} - (S_n - S_r) = k \quad \Rightarrow \quad S_r = k + S_n - S_{l-1}

x=l1x = l-1,则 0x<rn0 \le x < r \le n。对于确定的右端点 rr,需要找满足等式的 xx。利用 xxrr 的奇偶关系,等式化为:

  • 同奇偶时:Sx=SrSn+kS_x = S_r - S_n + k (记为 v1v_1
  • 不同奇偶时:Sx=SnSr+kS_x = S_n - S_r + k (记为 v2v_2
  • 不同奇偶时:Sx=SnSr+kS_x = S_n - S_r + k (记为 v2v_2

我们可以遍历右端点 r=1nr = 1 \dots n,用两个哈希表分别维护已遍历的、下标为偶数SxS_x下标为奇数SxS_x 的出现次数。对于当前 rr

  • rr 为奇数:同奇偶的 xx 必为奇数,查奇数表找 v1v_1;不同奇偶的 xx 为偶数,查偶数表找 v2v_2
  • rr 为偶数:同奇偶的 xx 为偶数,查偶数表找 v1v_1;不同奇偶的 xx 为奇数,查奇数表找 v2v_2

查询后,再将 SrS_rrr 的奇偶性存入对应的哈希表(这样保证只匹配 x<rx < r)。最后累加结果。

初始时 x=0x=0(对应 l=1l=1)是偶数且 S0=0S_0=0,因此将 ct0[0] 初始化为 1。

参考代码#

永恒的奥古斯都#

题目详情

题目描述

有一棵 nn 个点的树 TT,树的根节点为 11。初始时点 ii 有颜色 cic_i0ci10 \le c_i \le 1)。

小 L 进行了若干次(可以为 00)操作,每次操作她会选择一个满足 cu=0c_u =0 的节点 uu,对 uu 子树内的所有点 vv 执行 cv1cvc_v \gets 1 - c_v。所有操作结束后得到树 TT',其中点 ii 的颜色变为了 cic'_i

现在给你最后得到的树 TT' 和每个点的颜色 cic'_i,你需要求出有多少种不同的可能初始状态 TT。答案对 998244353998244353 取模。

在此题中,我们认为两棵树 T1,T2T_1,T_2 不同,当且仅当存在点 1un1 \le u \le n,满足其在 T1T_1 中的颜色为 c1,uc_{1,u},在 T2T_2 中的颜色为 c2,uc_{2,u},且 c1,uc2,uc_{1,u} \neq c_{2,u}

输入格式

输入第一行一个正整数 nn1n2×1051 \le n \le 2 \times 10^5),表示 TT' 的点数。

第二行 nn 个整数 c1,c2,,cnc'_1,c'_2,\cdots,c'_n0ci10 \le c'_i \le 1),表示最终状态下每个点的颜色。

接下来 n1n-1 行,每行两个正整数 u,vu,v1u,vn1 \le u,v \le nuvu \neq v),表示 TT' 中存在一条边 (u,v)(u,v)。保证所有边构成一棵树。

输出格式

输出一行一个整数,表示可能的初始状态 TT 的个数对 998244353998244353 取模后的值。

输入输出样例 #1

输入 #1

3
0 0 1
1 2
1 3
plaintext

输出 #1

2
plaintext

输入输出样例 #2

输入 #2

5
1 0 0 1 1
1 2
1 3
2 4
2 5
plaintext

输出 #2

20
plaintext

解题思路#

题目要求:给定最终树 T' 每个点的颜色 cic'_i(0/1)和树的结构,问有多少种可能的初始颜色状态 cic_i,使得可以通过若干次“选择颜色为 0 的节点并翻转其子树”的操作变成 c'

设变量 xu0,1x_u ∈ {0, 1} 表示节点 u 是否被操作(奇偶性)。最终颜色与初始颜色、操作的关系为: cu=cuxvc'_u = c_u \oplus x_v ( vu 的祖先) 已知 c',计数初始 c 等价于计数合法的操作变量 x(两者一一对应)。合法指存在一个操作顺序,使得每次操作时该节点当前颜色为 0。

可以自底向上进行 DP,维护以 u 为根的子树在两种情形下的合法初始状态数:

  • dp0[u]u 不操作 (xu=0x_u = 0) 时子树内的方案数(实际上对于根,它包含了所有合法情况的答案)。
  • dp1[u]u 操作 (xu=1x_u = 1) 时子树内的方案数。

核心结论:若 u 被操作,则其子树内所有初始颜色都可以通过合法操作达到目标,方案数达到最大,即 dp1[u]=2size(u)dp1[u] = 2^{\text{size}(u)} 其中 size(u) 是以 u 为根的子树大小。该值与 c' 无关,可以通过归纳证明。

u 的子节点 v,设 v1=dp0[v]v1 = \prod dp0[v]v2=dp1[v]v2 = \prod dp1[v](代码中的记号)。

  • dp1[u]:无论 c'_u 为何,dp1[u] = 2 * v2。递归展开即 2size(u)2^{size(u)}
  • dp0[u]:根据 c'_u 分情况:
  • cu=0c'_u = 0u 必须不操作(否则最终颜色会变成 1),故 dp0[u] = v1
  • cu=1c'_u = 1u 可以不操作或操作。

不操作时贡献 v1;操作时贡献 v2(即 2size(u)12^{size(u)-1})。

因此 dp0[u] = v1 + v2

根节点 1 没有父节点限制,所有合法方案均已包含在 dp0[1] 中,直接输出即可。

参考代码#

四川省大学生程序设计竞赛2026个人题解
https://santisify.top/blog/other/sccpc2026
Author santisify
Published at June 8, 2026
Comment seems to stuck. Try to refresh?✨