Codeforces CodeTON Round 8(Div.1 + Div.2) A~E

A. Farmer John’s Challenge (模拟)

题意:

构造一个长度为 n n n的数组,将这些数组围成一个圈(顺时针)从任意一个位置打开,有且仅有 k k k个非降序排列的数组。

分析:

k = 1 k=1 k=1时,升序输出 1 − n 1-n 1n n = k n=k n=k时,全 1 1 1即可。其他情况都是 − 1 -1 1

代码:

#include <bits/stdc++.h>using namespace std;
const int mod = 1e9 + 7;int main() {int T;cin >> T;while (T--) {int n, k;cin >> n >> k;if (k == 1) {for (int i = 1; i <= n; i++)cout << i << " ";cout << endl;} else if (n == k) {for (int i = 1; i <= n; i++)cout << 1 << " ";cout << endl;} elsecout << -1 << endl;}return 0;
}

B.Bessie and MEX (思维)

题意:

给出一个长度为 n n n 的数组 a a a ,根据 a a a 构造出一个排列 p p p 。数组 a a a 的构造使得 a i a_i ai = MEX ( p 1 , p 2 , … , p i ) − p i \texttt{MEX}(p_1, p_2, \ldots, p_i) - p_i MEX(p1,p2,,pi)pi ,其中数组的 MEX \texttt{MEX} MEX 是该数组中没有出现的最小非负整数。

分析:

a i > 0 a_i>0 ai>0,填入当前的最小值,同时更新最小值, a i < 0 a_i<0 ai<0时, m e x mex mex没有更新,加上绝对值即可。

代码:

#include <bits/stdc++.h>using namespace std;
const int N = 2e5 + 10, mod = 1e9 + 7;
int a[N], p[N];int main() {int T;cin >> T;while (T--) {int n;cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];int minval = 0;for (int i = 1; i <= n; i++) {if (a[i] > 0) {p[i] = minval;minval = a[i] + minval;} else {p[i] = minval - a[i];}}for (int i = 1; i <= n; i++)cout << p[i] << " ";cout << endl;}return 0;
}

C1. Bessie’s Birthday Cake (Easy Version) (数学)

题意:

贝西从她最好的朋友埃尔西那里收到了一个生日蛋糕,它是一个边长为 n n n 的正多边形。蛋糕的顶点按顺时针方向从 1 1 1 排列到 n n n 。你和贝西将选择其中的一些顶点在蛋糕上切出不相交的对角线。换句话说,对角线的端点必须是所选顶点的一部分。
为了保持一致性,贝西只想分发三角形的蛋糕。蛋糕块的大小并不重要,整个蛋糕也不一定要分成三角形(蛋糕中可以有其他形状,但不计算在内)。
贝西已经选择了 x x x 个顶点,可以用来组成对角线。她希望你选择的其他顶点不超过 y y y ,这样她能分出的三角形蛋糕的数量就能达到最大。
贝西最多能分出多少块三角形蛋糕?
此题保证 y = 0 y=0 y=0

分析:

假设对答案有贡献的点叫有效点,可以发现如果两个点之间正好只有一个点,那么这个点也是有效的,答案是总的有效点数减 2 2 2.

代码:

#include <bits/stdc++.h>using namespace std;
const int N = 2e5 + 10, mod = 1e9 + 7;
int a[N];int main() {int T;cin >> T;while (T--) {int n, x, y, cnt;cin >> n >> x >> y;cnt = x - 2;for (int i = 1; i <= x; i++)cin >> a[i];sort(a + 1, a + x + 1);for (int i = 1; i < x; i++) {if (a[i] + 1 == a[i + 1] - 1) {cnt++;}}if (a[x] == n - 1 && a[1] == 1)cnt++;else if (a[x] == n && a[1] == 2)cnt++;cout << cnt << endl;}return 0;
}

C2.Bessie’s Birthday Cake (Hard Version) (数学)

题意:

贝西从她最好的朋友埃尔西那里收到了一个生日蛋糕,它是一个边长为 n n n 的正多边形。蛋糕的顶点按顺时针方向从 1 1 1 排列到 n n n 。你和贝西将选择其中的一些顶点在蛋糕上切出不相交的对角线。换句话说,对角线的端点必须是所选顶点的一部分。
为了保持一致性,贝西只想分发三角形的蛋糕。蛋糕块的大小并不重要,整个蛋糕也不一定要分成三角形(蛋糕中可以有其他形状,但不计算在内)。
贝西已经选择了 x x x 个顶点,可以用来组成对角线。她希望你选择的其他顶点不超过 y y y ,这样她能分出的三角形蛋糕的数量就能达到最大。
贝西最多能分出多少块三角形蛋糕?

分析:

通过简单版本发现,每次操作可以让有效点数加 2 2 2,但是如果一段只剩下 3 3 3个点,那么可以一次性操作让有效点数加 3 3 3。同时发现奇数间隔可以获得的贡献更大,所以优先操作间距短的奇数长度区间间隔,再操作偶数区间间隔。

代码:

#include <bits/stdc++.h>using namespace std;
const int N = 2e5 + 10, mod = 1e9 + 7;int main() {int T;cin >> T;while (T--) {int n, x, y;cin >> n >> x >> y;vector<int> a(x);for (int i = 0; i < x; i++)cin >> a[i];sort(a.begin(), a.end());int sum = x;vector<int> tmp[2];for (int i = 0; i < x; i++) {int len = a[(i + 1) % x] - a[i] - 1;if (len < 0)len += n;if (len == 1)sum += 1;if (len > 1) {tmp[len % 2].push_back(len);}}for (int i = 1; i >= 0; i--) {sort(tmp[i].begin(), tmp[i].end());for (auto u: tmp[i]) {if (u % 2 == 1) {int num2 = (u - 3) / 2;int t = min(y, num2);y -= t;sum += t * 2;int num3 = 1;t = min(y, num3);y -= t;sum += t * 3;} else {int num2 = u / 2;int t = min(y, num2);y -= t;sum += t * 2;}}}cout << sum - 2 << endl;}return 0;
}

D.Learning to Paint (dp)

题意:

艾尔西正在学习如何绘画。她的画布上有 n n n 个单元格,编号从 1 1 1 n n n ,她可以画任何(可能是空)单元格子集。
艾尔西有一个二维数组 a a a ,她将用这个数组来评估绘画作品。假设一幅画中绘画单元格的最大连续间隔为 [ l 1 , r 1 ] , [ l 2 , r 2 ] , … , [ l x , r x ] [l_1,r_1],[l_2,r_2],\ldots,[l_x,r_x] [l1,r1],[l2,r2],,[lx,rx] 。这幅画的美丽值是所有 1 ≤ i ≤ x 1 \le i \le x 1ix a l i , r i a_{l_i,r_i} ali,ri 的总和。
2 n 2^n 2n 种方法可以绘制条形图。请帮助艾尔西找出在所有这些方法中,前 k k k大的美丽值。这 k k k种美丽值可以相同,但要保证至少有 k k k种画法。

分析:

f f f表示使用前 i i i个位置的前 k k k大和,但是位置 i i i不一定要涂色。 g g g表示使用前 i i i个位置且以 i i i开头的前 k k k大和,保证位置 i i i为涂色开头。即 f [ i ] [ j ] f[i][j] f[i][j]表示使用前 i i i个位置,第 j j j大的和。 g [ i ] [ j ] g[i][j] g[i][j]表示 使用前 i i i个位置, i i i涂色 且 i − 1 i-1 i1不涂色 第 j j j大的和。
维护 f [ i ] f[i] f[i],可以用优先队列,从 g [ 1... i ] g[1...i] g[1...i]转移,同时维护 g [ 1... i ] g[1...i] g[1...i]最大的值,取前 k k k个用于更新 f [ i ] f[i] f[i]。在更新 g [ i + 1 ] g[i+1] g[i+1]时,因为 i i i不涂色,以 i − 1 i-1 i1及前面的位置结尾都可,因此就是 g [ i + 1 ] = f [ i − 1 ] ; g[i+1]=f[i-1]; g[i+1]=f[i1];

代码:

#include <bits/stdc++.h>using namespace std;
typedef long long LL;
#define PII pair<LL, LL>
const int mod = 1e9 + 7;
const int INF = 1e9;int main() {int T;cin >> T;while (T--) {int n, k;cin >> n >> k;vector<vector<int>> a(n + 1, vector<int>(n + 1));for (int i = 1; i <= n; i++) {for (int j = i; j <= n; j++) {cin >> a[i][j];}}vector<vector<int>> f(n + 1, vector<int>(k, -INF));vector<vector<int>> g(n + 2, vector<int>(k, -INF));g[1][0] = 0;f[0][0] = 0;vector<int> c(k);vector<int> p(n + 1);for (int i = 1; i <= n; i++) {priority_queue<PII > tmp;for (int j = 1; j <= i; j++) {tmp.push({g[j][0] + a[j][i], j});p[j] = 0;}for (int t = 0; t < k; t++) {auto [s, j] = tmp.top();tmp.pop();f[i][t] = s;p[j]++;tmp.push({g[j][p[j]] + a[j][i], j});}int l = 0, r = 0;for (int t = 0; t < k; t++) {c[t] = max(f[i - 1][l], f[i][r]);if (f[i - 1][l] > f[i][r])l++;elser++;}f[i] = c;g[i + 1] = f[i - 1];}for (int i = 0; i < k; i++) {cout << f[n][i] << " ";}cout << endl;}return 0;
}

E.Farm Game (组合数)

题意:

农夫 N h o j Nhoj Nhoj 带着他的奶牛来到农夫 J o h n John John 的农场玩游戏!农夫约翰的农场可以用一条在 0 0 0 l + 1 l + 1 l+1 点有墙的数线来模拟。农场里有 2 n 2n 2n 头奶牛,其中 n n n 头属于 F J FJ FJ,另外 n n n 头属于 F N FN FN。他们把每头牛都放在一个不同的点上, F J FJ FJ 的牛和 F N FN FN 的牛都不相邻。如果两头奶牛之间没有其他奶牛,它们就是相邻的。
在一次下棋中,农夫选择了 k k k ( 1 ≤ k ≤ n ) (1 \leq k \leq n) (1kn) 和一个方向(左或右)。然后,农夫选择 k k k 头奶牛,并将它们朝所选方向移动一个位置。农场主不能将自己的奶牛移动到墙上或其他农场主的奶牛上。如果一位农夫不能移动任何奶牛,那么他就输了。 F J FJ FJ先开始游戏,进行第一个回合。
给定 l l l n n n ,求如果两个农夫都以最佳方式下棋,农夫约翰可能获胜的棋局配置数。对局可能无限期地进行下去,在这种情况下没有农民获胜。如果有任何 i i i a i a_i ai b i b_i bi 不同,则该配置与另一种配置不同。输出答案,请将答案对 998244353 998244353 998244353取模。

分析:

首先发现 a [ i ] a[i] a[i] b [ i ] b[i] b[i]前面 和 a [ i ] a[i] a[i] b [ i ] b[i] b[i]后面这两种情况实际是一样,只需要计算其中一种情况,最后答案乘 2 2 2即可。
如果 b [ i ] − a [ i ] − 1 b[i]-a[i]-1 b[i]a[i]1 不全为偶数,那么就是 F J FJ FJ 必胜。因为全为偶数是必败态,又由于 k k k至少为 1 1 1,如果全是偶数, F J FJ FJ 转移一次后 F N FN FN 获得的是必胜态。如果不全是偶数, F J FJ FJ 可以转移一次全变成偶数, F N FN FN 获得的就是必败态了。
我们逆向考虑,用总答案数减去全为偶数的情况。总答案数为 C ( l , 2 × n ) C(l,2\times n) C(l,2×n)。当 ( b [ i ] − a [ i ] − 1 ) (b[i]-a[i]-1) (b[i]a[i]1)全为偶数时,考虑空地怎么插在牛之间, ( a , b ) (a,b) (a,b)内只能插偶数块空地,枚举插入 ( a , b ) (a,b) (a,b)内的空地对的个数为 m m m ( a , b ) (a,b) (a,b)一共有 n n n 组,答案为 C ( n + m − 1 , m − 1 ) C(n+m−1,m−1) C(n+m1,m1)
剩下的空地插在 ( b , a ) (b,a) (b,a) ( 0 , a [ 0 ] ) (0,a[0]) (0,a[0]), ( b [ n ] , l + 1 ) (b[n],l+1) (b[n],l+1)内,一共 n + 1 n+1 n+1组,用同样的方法计算。

代码:

#include <bits/stdc++.h>using namespace std;
const int N = 1e6 + 5;
const int mod = 998244353;template<const int T>
struct ModInt {const static int mod = T;int x;ModInt(int x = 0) : x(x % mod) {}ModInt(long long x) : x(int(x % mod)) {}int val() { return x; }ModInt operator+(const ModInt &a) const {int x0 = x + a.x;return ModInt(x0 < mod ? x0 : x0 - mod);}ModInt operator-(const ModInt &a) const {int x0 = x - a.x;return ModInt(x0 < 0 ? x0 + mod : x0);}ModInt operator*(const ModInt &a) const { return ModInt(1LL * x * a.x % mod); }ModInt operator/(const ModInt &a) const { return *this * a.inv(); }bool operator==(const ModInt &a) const { return x == a.x; };bool operator!=(const ModInt &a) const { return x != a.x; };void operator+=(const ModInt &a) {x += a.x;if (x >= mod)x -= mod;}void operator-=(const ModInt &a) {x -= a.x;if (x < 0)x += mod;}void operator*=(const ModInt &a) { x = 1LL * x * a.x % mod; }void operator/=(const ModInt &a) { *this = *this / a; }friend ModInt operator+(int y, const ModInt &a) {int x0 = y + a.x;return ModInt(x0 < mod ? x0 : x0 - mod);}friend ModInt operator-(int y, const ModInt &a) {int x0 = y - a.x;return ModInt(x0 < 0 ? x0 + mod : x0);}friend ModInt operator*(int y, const ModInt &a) { return ModInt(1LL * y * a.x % mod); }friend ModInt operator/(int y, const ModInt &a) { return ModInt(y) / a; }friend ostream &operator<<(ostream &os, const ModInt &a) { return os << a.x; }friend istream &operator>>(istream &is, ModInt &t) { return is >> t.x; }ModInt pow(int64_t n) const {ModInt res(1), mul(x);while (n) {if (n & 1)res *= mul;mul *= mul;n >>= 1;}return res;}ModInt inv() const {int a = x, b = mod, u = 1, v = 0;while (b) {int t = a / b;a -= t * b;swap(a, b);u -= t * v;swap(u, v);}if (u < 0)u += mod;return u;}
};using mint = ModInt<mod>;mint fact[N], invfact[N];void init() {fact[0] = invfact[0] = 1;for (int i = 1; i < N; i++)fact[i] = fact[i - 1] * i;invfact[N - 1] = fact[N - 1].inv();for (int i = N - 2; i; i--)invfact[i] = invfact[i + 1] * (i + 1);
}inline mint C(int a, int b) {if (a < 0 || b < 0 || a < b)return 0;return fact[a] * invfact[b] * invfact[a - b];
}int main() {init();int t;cin >> t;while (t--) {int l, n;cin >> l >> n;mint ans = C(l, 2 * n);int k = l - 2 * n;for (int m = 0; 2 * m <= k; m++) {mint res = C(n + m - 1, n - 1);res *= C((n + 1) + (k - 2 * m) - 1, (n + 1) - 1);ans -= res;}ans *= 2;cout << ans << endl;}return 0;
}

赛后交流

在比赛结束后,会在交流群中给出比赛题解,同学们可以在赛后查看题解进行补题。

群号: 704572101,赛后大家可以一起交流做题思路,分享做题技巧,欢迎大家的加入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/793426.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何删除 iPhone 上的 iCloud 激活锁

Apple 在 iPhone 上通过不同的安全屏障来保护您的数据。 iCloud 激活锁可阻止外部人员访问您的手机。您可以通过打开“查找我的 iPhone”功能来激活此锁。 使用安全协议似乎是无害的&#xff0c;直到你到达门的另一边。如果您购买了带有激活锁的二手 iPhone 或忘记了 iCloud 凭…

「精细化管理」某物业集团精细化管理咨询项目纪实

实现工作例行化、定时化、程序化与可视化企业重视绩效考核&#xff0c;却总感觉考核不到点上&#xff1b;企业重视规划职责&#xff0c;却总感觉部门间职责不清&#xff1b;企业重视激励&#xff0c;却总感觉难以真正激励员工。到底是哪里出了问题&#xff1f;华恒智信指出&…

win11安装WSL UbuntuTLS

win11安装WSL WSL 简介WSL 1 VS WSL 2先决要求安装方法一键安装通过「控制面板」安装 WSL 基本命令Linux发行版安装Ubuntu初始化相关设置root用户密码网络工具安装安装1panel面板指导 WSl可视化工具问题总结WSL更新命令错误Ubuntu 启动初始化错误未解决问题 WSL 简介 Windows …

【QT+QGIS跨平台编译】056:【pdal_kazhdan+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_kazhdan介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_kazhdan介绍 pdal_kazhdan 是 PDAL(Point Data Abstraction Library)相关的 Kazhdan 算法的实现。PDAL 是一个用于处理和分析点云数据的开源库,而 Kazhdan 算法通常…

C语言 | Leetcode C语言题解之第9题回文数

题目&#xff1a; 题解&#xff1a; bool isPalindrome(int x) {if(x < 0)return false;long int sum0;long int nx;while(n!0){sumsum*10n%10;nn/10;}if(sumx)return true;elsereturn false; }

LLaMA-Factory微调(sft)ChatGLM3-6B保姆教程

LLaMA-Factory微调&#xff08;sft&#xff09;ChatGLM3-6B保姆教程 准备 1、下载 下载LLaMA-Factory下载ChatGLM3-6B下载ChatGLM3windows下载CUDA ToolKit 12.1 &#xff08;本人是在windows进行训练的&#xff0c;显卡GTX 1660 Ti&#xff09; CUDA安装完毕后&#xff0c…

前端路径问题总结

1.相对路径 不以/开头 以当前资源的所在路径为出发点去找目标资源 语法: ./表示当前资源的路径 ../表示当前资源的上一层路径 缺点:不同位置,相对路径写法不同2.绝对路径 以固定的路径作为出发点作为目标资源,和当前资源所在路径没关系 语法:以/开头,不同的项目中,固定的路径…

【Godot4自学手册】第三十四节来回无限滚动的伤害铁刺球

本节主要学习给地宫添加来回滚动的铁刺球&#xff0c;铁刺球共有两个方向&#xff0c;一个是左右方向&#xff1b;另一个是上下方向。如果主人公不小心碰到球&#xff0c;就会收到伤害。这是地宫的第一个机关。 一、新建场景并布局节点 把我们准备好的铁球图片素材拖入到文件…

基于单片机的测时仪系统设计

**单片机设计介绍&#xff0c;基于单片机的测时仪系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的测时仪系统设计是一个结合了单片机技术与测时技术的综合性项目。该设计的目标是创建一款精度高、稳定性强且…

【数据结构】复杂度(长期维护)

本篇博客主要是浅谈数据结构概念及时间复杂度&#xff0c;并做长期的维护更新&#xff0c;有需要借鉴即可。 复杂度目录 一、初识数据结构1.基础概念2.如何学好数据结构 二、复杂度1.复杂度2.时间复杂度①有限数的时间复杂度②函数的时间复杂度③二分查找时间复杂度④递归拓展练…

汇编语言作业(二)

目录 一、实验目的 二、实验内容 三、实验步骤以及结果 四、实验结果与分析 五、实验总结 一、实验目的 1、巩固debug命令 2、使用 debug 来进行寄存器、内存中内容的查看和修改 3、使用 debug 来进行程序的调试 二、实验内容 上图是一段指令代码 &#xff0c;机器码和汇编…

ubuntu更换国内镜像源,下载增速

方法一&#xff1a;通过脚本更换源 1.备份原来的源 sudo cp /etc/apt/sources.list /etc/apt/sources_init.list 将原来的源保留一下&#xff0c;以后想用还可以继续用 2.更换源 sudo gedit /etc/apt/sources.list 使用gedit打开文档&#xff0c;将下面的阿里源复制进去&am…

Java零基础入门-java8新特性(完结篇)

一、概述 ​上几期&#xff0c;我们是完整的学完了java异常类的学习及实战演示、以及学习了线程进程等基础概念&#xff0c;而这一期&#xff0c;我们要来玩点好的东西&#xff0c;那就是java8&#xff0c;我们都知道java8是自2004年发布java5之后最重要且一次重大的版本更新&a…

走进车厂 | 移远通信以前沿车载技术,照亮智能网联汽车产业创新发展之路

无钥匙自动解锁方便快捷、实时路况导航精准高效、语音指令轻松控制车辆、车载娱乐系统丰富多样……随着智能化、数字化浪潮的不断推进&#xff0c;现如今的汽车出行焕然一新。 正如我们所见&#xff0c;汽车产业正在经历前所未有的变革。物联网、车联网等前沿技术的发展和应用&…

idea Springboot校园新闻系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 校园新闻发布系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&a…

ubuntu无法粘贴复制windows中的内容,分辨率无法自适应电脑自带系统

1、直接在命令行执行以下命令 sudo apt-get autoremove open-vm-tools //卸载已有的工具 sudo apt-get install open-vm-tools //安装工具open-vm-tools sudo apt-get install open-vm-tools-desktop //安装open-vm-tools-desktop 2、重启Ubuntu系统即可 3.如果上述…

mbti,ESTP型人格的心理问题分析

什么是ESTP型人格 ESTP分别代表外向&#xff0c;实感&#xff0c;理智&#xff0c;依赖&#xff0c;而ESTP型人格则是一种性格上十分激进&#xff0c;喜欢冒险&#xff0c;并且总是因为情绪起伏过大&#xff0c;而一下子做出应激行为的相对冒险的人格。具有ESTP型人格的人一般…

蓝桥杯 --- 日期问题模板

目录 1.如何判断闰年 2.如何遍历当前年份的每一天 3.如果想要输出某一年某一天到某一年某一天之间一共有多少天。 4.精确到具体周几到周几的问题分析 5.如何直接通过一层for循环枚举年月日 习题&#xff1a; 蓝桥杯竞赛特别喜欢考日期问题&#xff0c;今天给大家分享一下…

EfficientVMamba实战:使用 EfficientVMamba实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

HarmonyOS(鸿蒙)——单击事件

2.4 实现ClickedListener接口并重写onClick方法 2.5 实现onClick方法中的具体逻辑&#xff0c;以此完成点击事件的相关业务操作 三、测试 3.1 登录远程模拟器 3.2 运行项目 四、精选好文 一、简介 1.1 什么是组件 组件就是文本、按钮、图片等元素的统称 1.2 什么是事件 …