abc 264 E
并查集倒着合并
abc 263 E
和 382 E一样,是个概率与期望的DP题,暂时跳过
abc 262 E
图论 + 组合数
两个红点之间的边可以看作考虑了两次,是一个偶数,结果想要红蓝交接边数为偶数的方法个数
枚举偶数 a 个奇数出边节点的组合和若干个k - a个偶数出边的节点组合相乘
找规律的题,写错了一个地方导致RE
最多选k个,而不是最多选奇数节点的个数,这样不仅不符合题意,并且会使 C 函数内出现负数
abc 261 E
利用了一种按位的思想
由于每位只有 0 和 1 两种情况,可以对所有操作来前缀和,得到一个真值表
这样时间复杂度只有 T(n) = 2 * 31 * n
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, c;
cin >> n >> c;
vector<array<int, 2>> a(n);
for (int i = 0; i < n; i ++) cin >> a[i][0] >> a[i][1];
vector<array<array<int, 2>, 31>> truth_table(n + 1);
for (int i = 0; i < 31; i ++) truth_table[0][i] = {0, 1};
for (int i = 0; i < n; i ++) {
for (int j = 0; j < 31; j ++) {
int k = a[i][1] >> j & 1;
if (a[i][0] == 1) {
truth_table[i + 1][j][0] = truth_table[i][j][0] & k;
truth_table[i + 1][j][1] = truth_table[i][j][1] & k;
} else if (a[i][0] == 2) {
truth_table[i + 1][j][0] = truth_table[i][j][0] | k;
truth_table[i + 1][j][1] = truth_table[i][j][1] | k;
} else {
truth_table[i + 1][j][0] = truth_table[i][j][0] ^ k;
truth_table[i + 1][j][1] = truth_table[i][j][1] ^ k;
}
}
}
for (int i = 1; i <= n; i ++) {
int k = 0;
for (int j = 0; j < 31; j ++) {
if (truth_table[i][j][c >> j & 1]) k |= 1 << j;
}
c = k;
cout << c << '\n';
}
return 0;
}
abc 260 E
读题有问题,s 是一个至少包括 $A_i$ 和 $B_i$ 一个的连续序列,不是由 $A_i$ $B_i$ 构成的序列
用双指针 + 差分,得到合法序列的数量