Codeforces Round 732 (Div
AquaMoon and Strange Sort
有 \(n\) 个人从左到右站成一排,从左数第 \(i\) 个人的衣服上印着 \(a_i\)。每个人的朝向可以是朝左、朝右。一开始所有人的方向都是朝右。
您可以对这些人做一些“操作”,每次操作允许您找两个相邻的人让他们交换顺序,但是在操作之后,两人都会掉头,也就是朝向都从朝右变成朝左或者相反。
现求是否存在一种操作方法使得操作完成后这 \(n\) 个人衣服上的数字 \(a_1, a_2, \ldots , a_n\) 从左往右读单调不减,并且最后所有人的方向都朝右。
题解:思维
容易发现:如果一个人在交换顺序后方向始终向右的话,那么我们必须保证其交换次数为偶数
同时题目限制我们只有相邻才能交换
所以我们发现,如果存在一种合法的操作方法使得\(n\)个人的顺序单调递增,那么原本在偶数位置上的数字仍然会在偶数位置,原本在奇数位置上的数字仍然会在奇数位置
所以我们不妨记录原本序列中偶数位置和奇数位置的状态,然后将该序列排序后,检查排序后偶数和奇数位置上的状态有没有变化即可
const int N = 2e5 + 10, M = 4e5 + 10;
int n;
int a[N], b[N];
int mp[N][2];
void solve()
{
cin >> n;
for (int i = 1; i <= 1e5; ++i)
mp[i][0] = mp[i][1] = 0;
for (int i = 1; i <= n; ++i)
{
cin >> a[i];
b[i] = a[i];
mp[a[i]][i % 2]++;
}
sort(b + 1, b + n + 1);
for (int i = 1; i <= n; ++i)
mp[b[i]][i % 2]--;
for (int i = 1; i <= n; ++i)
{
if (mp[a[i]][i % 2])
{
cout << "NO" << endl;
return;
}
}
cout << "YES" << endl;
}
AquaMoon and Chess
你有一个长为 \(n\) 的棋盘,这个棋盘上有一些棋子,你可以进行如下操作:
如果第 \(i + 2\) 个位置是空的,且第 \(i + 1\) 个位置非空,则可以将第 \(i\) 个位置的棋子挪到第 \(i + 2\) 个位置 (\(i + 2 \leq n\)).
如果第 \(i - 2\) 个位置是空的,且第 \(i - 1\) 个位置非空,则可以将第 \(i\) 个位置的棋子挪到第 \(i - 2\) 个位置 (\(i - 2 \geq 1\)).
现在将给出一个棋盘的初始状态,求可以通过上述操作可以到达的状态数,你可以进行任意次操作,答案对 \(998244353\) 取模.
题解:思维 + 组合计数
容易发现:如果现在棋盘为
0110
,那么最后能够到达的所有状态为0110
,1100
,0011
,我们发现如果我们把11
捆绑看成一个整体后,那么我们观察发现所有可以到达的状态就是11
和0
随意组合排序那么如果现在棋盘为
01110
,那么最后能够到达的所有状态为01110
,11010
,00111
,那么我们也可以发现,如果现在存在相邻的奇数个1的情况,但是我们发现,如果我们将11
看成整体的话,实际上另一个1
位置是随着11
和0
位置的变化而被动移动的所以影响这个棋盘状态变化的是
11
和0
之间的组合顺序,我们可以忽略单个1
对整体状态的影响假设
11
的个数为cnt2
,0
的个数为cnt0
,那么答案为\[C_{cnt0+cnt2}^{cnt2}
\]
const int N = 2e5 + 10, M = 4e5 + 10;
int n;
int qpow(int a, int b, int p)
{
int res = 1;
while (b)
{
if (b & 1)
res = res * a % p;
b >>= 1;
a = a * a % p;
}
return res % p;
}
int C(int a, int b, int p)
{
int res = 1;
for (int i = 1, j = a; i <= b; ++i, --j)
{
res = res * j % p;
res = res * qpow(i, p - 2, p) % p;
}
return res % p;
}
void solve()
{
cin >> n;
string s;
cin >> s;
int cnt0 = 0, cnt2 = 0;
for (int i = 0; i < n; ++i)
{
if (s[i] == '0')
cnt0++;
else if (s[i] == '1')
{
if (s[i + 1] == '1')
{
cnt2++;
i++;
}
}
}
cout << C(cnt0 + cnt2, cnt0, mod) << endl;
}
Codeforces Round 732 (Div的更多相关文章
- Codeforces Round #732 (Div. 2)【ABCD】
比赛链接:https://codeforces.com/contest/1546 A. AquaMoon and Two Arrays 题意 给出两个大小为 \(n\) 的数组 \(a, b\) ,每 ...
- Codeforces Round #732 (Div.1) 题解
实在是打击人信心的一场比赛啊--一不注意就掉了 50+ 分,rating 没了啊/ll/dk/wq/kk A Weak pretest!!!!!11 /fn/fn/fn 一个很显然的注意点是在交换前后 ...
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- Codeforces Round #279 (Div. 2) ABCDE
Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name A Team Olympiad standard input/outpu ...
- Codeforces Round #262 (Div. 2) 1003
Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...
- Codeforces Round #262 (Div. 2) 1004
Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...
- Codeforces Round #371 (Div. 1)
A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...
随机推荐
- python之re库,正则表达
一.前言 为什么要学re库呢?这里主要学他的正则表达,在编写安全脚本的时候肯定要遇到一些不规则的匹配规则,当然编写爬虫也少不了正则匹配去找到一些具有特殊特征的字符串.因此这是十分必要的,然而.re库使 ...
- 04. 寻找两个正序数组的中位数 Golang实现
题目: 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 算法的时间复杂度应该为 O(log (m+n)) . 示例 1: ...
- OData – Query to Expression
前言 EF Core 可以把 expression 转换成 string, 但没办法转回来. 想把 string 转成 expression, 目前最合适的工具是 OData. 虽然 Dynamic ...
- MySQL服务无法启动 服务没有报告任何错误
安装MYSQL后 启动服务 出现错误 在启动MySQL服务时 出现该报错 解决方法: 将原本在MySQL根目录下的my.ini文件移动到bin目录下(my.ini文件参考:这里) 删除根目录下的 ...
- Linux操作系统和文件系统、常见命令(下)
C语言的绝大部分内容应该记录在以.c作为拓展名的文件里,这种文件叫做C语言的源文件 C语言程序里还包括以.h作为拓展名的文件,这种文件叫头文件(只有极少数的内容可以记录在头文件里) C语言程序里可以使 ...
- 关于 B 先生
B 先生是不是要疯了,他今天说的都是他妈什么几把
- 使用MessagePipe实现进程间通信
1.MessagePipe介绍 可以用于.NET和Unity上面的高性能的内存/分布式消息传递管道.适用于发布/订阅模式.CQRS的中介模式.Prism中的EventAggregator.IPC(进程 ...
- Java日期时间API系列16-----Jdk8中java.time包中的新的日期时间API类,java日期计算3,日期中年月日时分秒的属性值修改等
通过Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析 ,可以看出java8设计非常好,实现接口Temporal, Tempora ...
- uniapp电子签名盖章实现详解
项目开发中用到了电子签名.签好名的图片需要手动实现横竖屏旋转.并将绘制的签名图片放到pdf转换后的base64的图片上,可以手动拖动签名到合适的位置,最后合成签名和合同图片并导出.和以往一样,先发一下 ...
- element 的 表单 搜索 和 重置按钮换行问题 ? inline
想要: 但是: 加上