比赛链接

A

题解

知识点:枚举。

只要一个Q后面有一个A对应即可,从后往前遍历,记录A的数量,遇到Q则数量减一,如果某次Q计数为0则NO。

时间复杂度 \(O(n)\)

空间复杂度 \(O(1)\)

代码

#include <bits/stdc++.h>
#define ll long long using namespace std; bool solve() {
int n;
cin >> n;
string s;
cin >> s;
s = "?" + s;
int cnt = 0;
for (int i = n;i >= 1;i--) {
if (s[i] == 'Q') {
if (cnt == 0) return false;
cnt--;
}
else cnt++;
}
cout << "YES" << '\n';
return true;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << "NO" << '\n';
}
return 0;
}

B

题解

知识点:构造。

可以证明 \(\lfloor \frac{n}{2} \rfloor\) 是最优答案。交错构造, \(i+\lfloor \frac{n}{2} \rfloor\) 和 \(i\) ,注意 \(i\) 从 \(1\) 到 \(\lfloor \frac{n}{2} \rfloor\) ,在最后如果 \(n\) 是奇数则补一个 \(n\) 。

时间复杂度 \(O(n)\)

空间复杂度 \(O(1)\)

代码

#include <bits/stdc++.h>
#define ll long long using namespace std; bool solve() {
int n;
cin >> n;
for (int i = 1;i <= n / 2;i++) {
cout << i + n / 2 << ' ' << i << ' ';
}
if (n & 1) cout << n << ' ';
cout << '\n';
return true;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}

C

题解

知识点:构造。

可以两两构造。找到一对非 \(0\) 数 \(a[i],a[j]\) ,当 \(a[i] = a[j]\),如果 \(i,j\) 奇偶性相同则 \([i,i],[i+1,j]\) ,否则分段 \([i,j]\) ;当 \(a[i] \neq a[j]\) ,如果 \(i,j\) 奇偶性相同则 \([i,j]\) ,否则 \([i,i],[i+1,j]\) 。

注意两对之间以及首尾可能会存在空隙,最后要把上面答案遍历一遍,填补空隙。

时间复杂度 \(O(n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define ll long long using namespace std; int a[200007];
bool solve() {
int n;
cin >> n;
vector<int> pos;
for (int i = 1;i <= n;i++) cin >> a[i];
for (int i = 1;i <= n;i++) {
if (a[i]) pos.push_back(i);
}
if (pos.size() & 1) return false;
if (!pos.size()) {
cout << 1 << '\n';
cout << 1 << ' ' << n << '\n';
return true;
}
vector<pair<int, int>> v;
for (int i = 0;i < pos.size();i += 2) {
if (a[pos[i]] == a[pos[i + 1]]) {
if ((pos[i] & 1) == (pos[i + 1] & 1)) {
v.push_back({ pos[i], pos[i] });
v.push_back({ pos[i] + 1,pos[i + 1] });
}
else v.push_back({ pos[i],pos[i + 1] });
}
else {
if ((pos[i] & 1) != (pos[i + 1] & 1)) {
v.push_back({ pos[i], pos[i] });
v.push_back({ pos[i] + 1,pos[i + 1] });
}
else v.push_back({ pos[i],pos[i + 1] });
}
}
vector<pair<int, int>> ans;
int prer = 0;
for (auto [i, j] : v) {
if (i != prer + 1) ans.push_back({ prer + 1, i - 1 });
ans.push_back({ i,j });
prer = j;
}
if (ans.back().second != n) ans.push_back({ ans.back().second + 1,n });
cout << ans.size() << '\n';
for (auto [i, j] : ans) {
cout << i << ' ' << j << '\n';
}
return true;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}

D

题解

知识点:数论,贪心。

记录每个数字出现的次数,尝试从小到大合成出 \(x\) 。从 \(1\) 开始往后遍历,每次将 \(i\) 合成 \(i+1\) ,显然 \(i+1\) 个 \(i\) 将产生 \(1\) 个 \(i+1\) 。如果出现非 \(x\) 的数 \(i\) 不能全部使用 ,那么整个式子就无法被 \(x!\) 整除。

时间复杂度 \(O(n)\)

空间复杂度 \(O(1)\)

代码

#include <bits/stdc++.h>

using namespace std;

int cnt[500007];
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, x;
cin >> n >> x;
for (int i = 1;i <= n;i++) {
int tmp;
cin >> tmp;
cnt[tmp]++;
}
for (int i = 1;i < x;i++) {
if (cnt[i] % (i + 1)) {
cout << "NO" << '\n';
return 0;
}
cnt[i + 1] += cnt[i] / (i + 1);
}
cout << "YES" << '\n';
return 0;
}

E

题解

知识点:概率dp。

设 \(f[i]\) 代表将 \(i\) 个还没排好的 \(1\) (如 1100101 有 \(2\) 个 \(1\) 没排好)排好的期望步数。

对于 \(f[i]\) ,下一步排好一个 \(1\) (即到达 \(i-1\) 状态)的概率是 \(\dfrac{i^2}{C_n^2}\) ,下一步啥都没变的概率就是 \(1-\dfrac{i^2}{C_n^2}\),于是有:

\[\begin{aligned}
f[i] &= (f[i-1]+1) \cdot \dfrac{i^2}{C_n^2} + (f[i]+1) \cdot (1-\dfrac{i^2}{C_n^2})\\
\dfrac{i^2}{C_n^2} \cdot f[i] &= \dfrac{i^2}{C_n^2} \cdot f[i-1] + 1\\
f[i] &= f[i-1] + \dfrac{C_n^2}{i^2}
\end{aligned}
\]

一步到达 \(i-1\) 后再排完的期望这步的概率一步啥也没干的期望这步的概率就是 \(f[i]\) 。

于是可以递推,\(f[0] = 0\) ,求的是 \(f[cnt1]\) ,\(cnt1\) 是初始没排好 \(1\) 的个数。

这里其实有个概率论的定理:如果一个事件的结果A发生的概率是 \(P\) ,则一直做这件事直到第一次发生结果A的期望 \(X\) 是 \(\dfrac{1}{P}\) 。

证明:

\[\begin{aligned}
X &= 1\cdot P+(X+1)\cdot (1-P)\\
P\cdot X &= 1\\
X &= \frac{1}{P}
\end{aligned}
\]

时间复杂度 \(O(n\log n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>
#define ll long long using namespace std; const int mod = 998244353; int a[200007];
ll qpow(ll a, ll k) {
ll ans = 1;
while (k) {
if (k & 1) ans = (ans * a) % mod;
k >>= 1;
a = (a * a) % mod;
}
return ans;
} bool solve() {
int n;
cin >> n;
for (int i = 1;i <= n;i++) cin >> a[i];
int cnt0 = count(a + 1, a + n + 1, 0);
int cnt1 = count(a + 1, a + cnt0 + 1, 1);
int c2 = 1LL * n * (n - 1) / 2 % mod;
int ans = 0;
for (int i = 1;i <= cnt1;i++) {
ans = (ans + 1LL * c2 * qpow(1LL * i * i % mod, mod - 2) % mod) % mod;
}
cout << ans << '\n';
return true;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
while (t--) {
if (!solve()) cout << -1 << '\n';
}
return 0;
}

Codeforces Round #829 (Div. 2) A-E的更多相关文章

  1. Codeforces Round #829 (Div. 1/Div. 2) 1753 A B C D 题解

    Div1A / 2C. Make Nonzero Sum 令最后每个\(a_i\)的系数为\(c_i\)(\(c_i=1/-1\)),发现只要满足\(c_1=1\)(下标从1开始),且c中没有两个-1 ...

  2. Codeforces Round #829 (Div. 2)/CodeForces1754

    CodeForces1754 注:所有代码均为场上所书 Technical Support 解析: 题目大意 给定一个只包含大写字母 \(\texttt{Q}\) 和 \(\texttt{A}\) 的 ...

  3. Codeforces Round #829 (Div. 2) D. Factorial Divisibility(数学)

    题目链接 题目大意: \(~~\)给定n个正整数和一个数k,问这n个数的阶乘之和能不能被k的阶乘整除 既:(a\(_{1}\)!+a\(_{2}\)!+a\(_{3}\)!+....+a\(_{n}\ ...

  4. 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 ...

  5. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  6. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  7. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  8. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  9. 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 ...

随机推荐

  1. 【ARK UI】HarmonyOS ETS如何创建PixeMap并显示Image组件上

    ​参考资料 图片处理 Context模块 api讲解 image.createPixelMap createPixelMap(number: fd, options: InitializationOp ...

  2. Word 段前分页是什么?怎么设置?

    描述 这两个标题在第一个标题的页中,且两个标题都没有独立分页.要让每一个标题独立分页,需要对标题的格式进行修改. 段前分页指的是标题与标题之间不在同一个页中,每一个标题都在独立的页中. 设置段前分页 ...

  3. 2020牛客NOIP赛前集训营-提高组(第三场) C - 牛半仙的妹子Tree (树链剖分)

    昨天教练问我:你用树剖做这道题,怎么全部清空状态呢?    我:???不是懒标记就完了???    教练:树剖不是要建很多棵线段树吗,不止log个,你要一个一个清?    我:为什么要建很多棵线段树? ...

  4. 【Java】学习路径59-多个连接的服务器端

    ServerSocket可以对接多个Socket对象,利用这点,就可以实现:一台服务器对多个客户端. import java.io.IOException; import java.net.*; pu ...

  5. 【读书笔记】15《The Bridge of Madison County》

    廊桥遗梦(梅丽尔·斯特里普主演) 罗伯特·詹姆斯·沃勒 99个笔记 The Beginning   美[|diˈklainz]v 辞谢,谢绝(邀请等)( decline的第三人称单数 );(道路.物体 ...

  6. c语言_二叉树的建立以及3种递归

    二叉树c语言的实现 二叉树的建立 二叉树的数据结构 typedef struct node{    int data;    struct node* left;    struct node* ri ...

  7. KingbaseES V8R3集群维护案例之---在线添加备库管理节点

    案例说明: 在KingbaseES V8R3主备流复制的集群中 ,一般有两个节点是集群的管理节点,分为master和standby:如对于一主二备的架构,其中有两个节点是管理节点,三个数据节点:管理节 ...

  8. 一文带你体验MRS HetuEngine如何实现跨源跨域分析

    摘要: HetuEngine作为MRS服务中交互式分析&多源统一SQL引擎,亲自全程体验其如何实现多数据源的跨源跨域分析能力. 本文分享自华为云社区<MRS HetuEngine体验跨源 ...

  9. Docker 数据共享与持久化

  10. CentOS7部署FastDFS+nginx模块

    软件下载 # 已经事先把所需软件下载好并上传到/usr/local/src目录了 https://github.com/happyfish100/libfastcommon/archive/V1.0. ...