AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

24/12/04 E题目总结

作者: 作者的头像   贺杰 ,  2024-12-04 16:50:39 ,  所有人可见 ,  阅读 9


0


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$ 构成的序列
用双指针 + 差分,得到合法序列的数量

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息