首页 > 其他分享 >学校训练赛的一些题解

学校训练赛的一些题解

时间:2024-08-31 19:48:25浏览次数:13  
标签:val int 题解 mid 学校 训练赛 lz ql dp

第二十一届宁波大学程序设计竞赛(重现赛链接

C 游戏开发部的小游戏 (C)

赛时并没有写出来,果然dp还得多练)

将所有石头视为容量为 \(n\) 的背包,每堆石头的数量即背包中物品的质量,对于 \(a_i \leq f_i\leq b_i\),由于 \(f_i\) 最终取值唯一,可当作分组背包处理。将大小为 \(i\) 的 \(t\) 组石子装入剩余容量为 \(j - i\times t\) 的背包,由组合数公式,\(dp[j]\) 方案总数增加 \(dp[j - i\times t] * {{n - j + i\times t}\choose i\times t}/ (i!)^t/(t!)\).

G 黑天鹅的记忆解析 (G)

又是dp题,首先排除 \(s\) 的前 \(m\) 个元素无法组成 \(t\) 的显然不合法情况,设 \(dp[i][j][k]\) 表示考虑到 \(s\) 的第 \(i\) 位、\(t\) 的 \(j\) 至 \(k\) 位已经匹配完成的情况,\(s_i = t_j\) 时即可从 \(j\) 或 \(k\) 端点转移,复杂度 \(O(m^3)\).

    for(int i = 0; i < m; i++) {
        for(int j = 0; j < m; j++) {
            if(s[i] == t[j]) {
                for(int k = 0; k < j; k++) {
                    dp[i + 1][k][j] += dp[i][k][j - 1];
                }
                for(int k = j + 1; k < m; k++) {
                    dp[i + 1][j][k] += dp[i][j + 1][k];
                }
                dp[i + 1][j][j] += 2;
            }
        }
    }
    printf("%lld", dp[m][0][m - 1]);

另有:xht说可以暴力dfs,由于每次只能将字符放在开头或结尾处,状态不会超过 \(2^{20}\) 种,想了想挺有道理的,太有实力了)

I 小 Y.的魔法书 (I)

设 \(dp[i][j][k]\) 表示目前考虑到 \(t\) 的第 \(i\) 位、\(s\) 的第 \(j\) 位(怎么和上题有某种类似之处),待匹配的左括号数量为 \(k\) 的方案数。数据范围允许 \(n^2m\) 暴力转移,但不同的匹配过程可能得到相同结果,可以规定额外加入字符时 \(s'\) 不等于 \(s_j\),避免重复情况出现。

    dp[0][0][0] = 1;
    for(int i = 1; i <= n; i++) {
        for(int j = 0; j <= min(i, m); j++) {
            for(int k = 0; k <= i; k++) {
                if(j) {
                    if(s[j] == '(') {
                        if(k) add(dp[i][j][k], dp[i - 1][j - 1][k - 1]); // add取模加法
                        if(k < i) add(dp[i][j][k], dp[i - 1][j][k + 1]);
                        add(dp[i][j][k], dp[i - 1][j][k] * 26 % mo);
                    }
                    else if(s[j] == ')') {
                        if(k < i) add(dp[i][j][k], dp[i - 1][j - 1][k + 1]);
                        if(k) add(dp[i][j][k], dp[i - 1][j][k - 1]);
                        add(dp[i][j][k], dp[i - 1][j][k] * 26 % mo);
                    }
                    else {
                        if(k) add(dp[i][j][k], dp[i - 1][j][k - 1]);
                        if(k < i) add(dp[i][j][k], dp[i - 1][j][k + 1]);
                        add(dp[i][j][k], dp[i - 1][j - 1][k]);
                        add(dp[i][j][k], dp[i - 1][j][k] * 25 % mo);
                    }
                } else {
                    if(k < i) add(dp[i][j][k], dp[i - 1][j][k + 1]);
                    if(k) add(dp[i][j][k], dp[i - 1][j][k - 1]);
                    add(dp[i][j][k], dp[i - 1][j][k] * 26 % mo);
                }
            }
        }
    }
    printf("%lld\n", dp[n][m][0]);

K 五彩斑斓的世界 (K)

若某种颜色出现次数多于4,两两相连后一定会出现交点,可直接判断Yes输出;对于 \(cnt \leq 3\) 的情况,每种颜色的连线将多边形分成2或3个区间,随机生成哈希值作为不同区间的权值,使用线段树区间修改权值、单点查询相同颜色顶点的权值,若权值不相等,则说明该连线至少跨越一个区间,即存在相交情况。

ll val[N * 4], lz[N * 4];
void build(int i, int l, int r) {
    val[i] = lz[i] = 0;
    if(l >= r) return;
    int mid = (l + r) / 2;
    build(i * 2, l, mid);
    build(i * 2 + 1, mid + 1, r);
}
void pushdown(int i) {
    if(lz[i]) {
        val[i * 2] ^= lz[i];
        val[i * 2 + 1] ^= lz[i];
        lz[i * 2] ^= lz[i];
        lz[i * 2 + 1] ^= lz[i];
        lz[i] = 0;
    }
}
void modify(int i, int l, int r, int ql, int qr, ll d) {
    if(ql <= l && qr >= r) {
        val[i] ^= d;
        lz[i] ^= d;
        return;
    }
    pushdown(i);
    int mid = (l + r) / 2;
    if(ql <= mid) modify(i * 2, l, mid, ql, qr, d);
    if(qr > mid) modify(i * 2 + 1, mid + 1, r, ql, qr, d);
}
ll query(int i, int l, int r, int q) {
    if(l == r) return val[i];
    pushdown(i);
    int mid = (l + r) / 2;
    if(q <= mid) return query(i * 2, l, mid, q);
    return query(i * 2 + 1, mid + 1, r, q);
}

由于维护的有效值为单点权值,甚至不需要pushup操作,非常的好写。

标签:val,int,题解,mid,学校,训练赛,lz,ql,dp
From: https://www.cnblogs.com/meowqwq/p/18389428

相关文章

  • 孤独症寄宿学校比较好的学校有哪些?
    在探讨孤独症寄宿学校的选择时,我们不难发现,市场上涌现出了一批专业且富有成效的机构,它们为孤独症儿童提供了全方位的支持与帮助。其中,星贝育园康复中心以其独特的优势脱颖而出,成为众多家庭信赖的选择。星贝育园康复中心是目前全国规模较大的自闭症全托寄宿制儿童康复训练机构......
  • CCF-CSP 2024 --重塑矩阵1,2c语言题解
     创作想法是因为像我当初大一时候想参加一些比赛但是奈何只学了c和c相关数据结构,但是对于许多竞赛的题目的题解往往都是c++或者其他面向对象的编程语言,让我们难以在c语言基础上入手这些比较复杂的题目。 创造的目的是为了帮助各位同时提高我对c语言编程的理解和锻炼个人......
  • 基于ssm+vue基于Android的大学校园车辆管理系统前【开题+程序+论文】
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高校规模的不断扩大和师生人数的持续增长,大学校园内的车辆管理成为了一个日益严峻的问题。传统的人工管理方式不仅效率低下,而且难以应对日益复杂......
  • CSP-J 2020 初赛试题解析(第一部分:单项选择题(5-10))
    ......
  • 【秋招笔试】8.30饿了么秋招(算法岗)-三语言题解
    ......
  • Leetcode 第 408 场周赛题解
    Leetcode第408场周赛题解Leetcode第408场周赛题解题目1:3232.判断是否可以赢得数字游戏思路代码复杂度分析题目2:3233.统计不是特殊数字的数字数量思路代码复杂度分析题目3:3234.统计1显著的字符串的数量思路代码复杂度分析题目4:3235.判断矩形的两个角落是否......
  • 【C语言进阶】C语言指针进阶实战:优化与难题解析
    ......
  • 【题解】拆分
    题目描述【题目描述】鸡尾酒又带着大家学习新定义啦!今天要学习的内容是集合的mex,集合的mex指的是一个集合没有出现过的最小自然数。例如,mex({1,2})=0、mex({0,1,2,3})=4。现在你有一个包含n个元素的集合,你可以将它分成任意个数量的新集合,使得所有新集合......
  • 题解:CF916D Jamie and To-do List
    题意维护一个数据结构,支持以下几种操作:setaixi:设置任务\(a_i\)的优先级为\(x_i\),如果该列表中没有出现则加入该任务。removea_i:删除该任务。querya_i:求优先级比\(a_i\)小的任务个数,如果没有则输出\(-1\)。undosum:删除此次操作之前的\(sum\)次操作。分析前......
  • 题解:CF916B Jamie and Binary Sequence (changed after round)
    题意把一个数分解成恰好\(k\)个\(2^{a_i}\)次方的和,可以重复,要求保证最大的\(a_i\)要尽可能的小时,\(a\)的字典序尽可能大,输出序列\(a\)。分析首先我们借助二进制拆出一个满足\(n=\sum2^{a_i}\)序列\(a\),满足\(a\)的长度最小。若此时\(a\)的长度大于\(k\),显......