Codeforces Round 1007 (Div. 2) 比赛记录

比赛链接

很喜欢的一场比赛,题目质量很高,不是手速场,做出题超级有成就感,赛时切掉了 A - D1,上大分了。

B卡得有点久,其实是一个很常用的构造手法但一开始没想到。

过题记录:

A. The Play Never Ends

题意大概就是,每场两个人打,一个人观战。如果有一个人以及连续打了两场,则这场无论如何这个人都要下去,否则输的那个下去,问第 \(k\) 场的时候第一场观战的人能否观战。

假设第一场打的人分别是 A 和 B,A 获胜,观战者是 C,手玩一下小一点的样例发现,第二场 C 一定上场,此时 A 已经打了一场,那么 A 和 C 打完后,无论如何,下的都是 A,再打一场后,由于 C 已经打了两场了,所以无论如何,下的都是 C,如此进行下去可以发现,输赢无所谓,因为总有一方连续打了两场,必须下,因此实际上就是三个人轮换,所以 C 观战的时候就是 \(k \bmod 3 = 1\) 的时候

void solve()
{
int n;cin >> n; if(n % 3 == 1)cout << "YES\n";
else cout << "NO\n";
}

B. Perfecto

我愿称之为本场前四题最难题,因为我好友列表都被卡了。

一开始我天真地以为只有 \(1\) 是不可能的,因为公差为 \(1\) 的等差数列求和公式,一个奇数一个偶数,偶数除以 \(2\) 后一定不和这个奇数相等,除了 \(1\),但是,有没有可能,他们乘起来还是一个平方数,比如:\(8\)。

因此首先判断 \(-1\) 的情况,也就是总和为平方数的情况,此时无论如何都无解因为总和是平方数。

然后再看如何构造,这里用到了一个构造题很常用的手法,就是先把一般的搞出来,再去修。

我们先初始化答案排列为 \(1 - n\) 升序排列。

然后依次遍历,并且记录前缀和,一旦当前 \(i\) 的前缀和是平方数,那就交换 \(a_i\) 和 \(a_{i + 1}\),为什么?因为 \(a_{i + 1} = a_i + 1\),一个平方数 \(+1\) 一定不是一个平方数。

然后再来证一个事情,就是交换的时候 \(a_{i + 1} = a_i + 1\)。

假设当前为第 \(i\),因为前 \(i\) 项和为 \((1 + i) \times i / 2\),那么前 \(i + 1\) 项的和为 \((1 + i) \times (2 + i) / 2\),我们通过打表可以发现,平方数一定不会在相邻两项连续出现,因此若前 \(i\) 项是平方数,交换后,前 \(i + 1\) 项的值不会改变,仍然不是平方数,因此不会进行交换,也就不会影响后续相邻两项的 \(a_{i + 1} = a_i + 1\)。

const int N = 5e5 + 9;
map<int, bool> vis;
int a[N]; void solve()
{
int pre = 0;
int n;cin >> n; if(vis.count((n + 1) * n / 2)) {
cout << -1 << '\n';
return;
} for(int i = 1;i <= n;i ++) {
a[i] = i;
} for(int i = 1;i <= n;i ++) {
if(vis.count(pre + a[i])) {
swap(a[i], a[i + 1]);
}
pre += a[i];
} for(int i = 1;i <= n;i ++) {
cout << a[i] << " \n"[i == n];
}
} void init() {
for(int i = 1;i < N;i ++) {
vis[i * i] = true;
}
} signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); init(); int t = 1;cin >> t;
while(t --)solve(); return 0;
}

C. Trapmigiano Reggiano

本场最有趣最好玩的题出现了!

题意大概就是,一只老鼠,在树上一个起点,要去树上一个终点,现在要你构造出一个长度为 \(n\) 的排列,逐一进行,每次老鼠都会朝着排列中这一位的数的结点的方向走去,让老鼠最后能抵达终点。

手玩了好多样例后发现一定有解,以下是我的见解:

我们以起点作为根,对于每一个结点,它至多有一个子结点的子树是包含终点的,因此我们要让老鼠先把非终点的子树走完。对于非终点的子树,我们从下往上选,一定是可以回到当前结点的,因为我们选的数是从下往上走的,我们的老鼠是从上往下走的,那么二者一定会相遇,而后就一起往上走回去。把非终点的子树选完后,再选择当前这个结点,把老鼠引回来,而后往终点子树走,继续按照上述流程递归下去,最后一定会到达终点。

因此我的代码思路就是:先以起点为根 DFS 一次,标记一下每一棵子树是否有终点,然后再来一次 DFS,按照上述流程加点形成答案序列。

赛后看了群里面大佬的解析并细细品味了一下我的代码,这不就是拓扑排序嘛,我们每次选择度为 \(1\) 的非终点结点加进来,最后加终点,一定有解,或者是以终点为起点 BFS,按深度倒序输出。

const int N = 1e5 + 9;
vector<int> g[N];
bool dp[N];
int n, st, ed;
vector<int> ans; void dfs(int now, int pre) {
dp[now] = (now == ed); for(auto &i : g[now]) {
if(i == pre) {
continue;
}
dfs(i, now);
dp[now] = (dp[now] || dp[i]);
} sort(g[now].begin(), g[now].end(), [] (const int &u, const int &v) {
return dp[u] < dp[v];
});
} void dfs1(int now, int pre) {
for(auto &i : g[now]) {
if(i == pre) {
continue;
}
if(dp[i])ans.push_back(now);
dfs1(i, now);
}
if(!dp[now])ans.push_back(now);
} void init(int n) {
for(int i = 1;i <= n;i ++) {
g[i].clear();
dp[i] = 0;
}
ans.clear();
} void solve()
{
cin >> n >> st >> ed;
init(n); for(int i = 1;i < n;i ++) {
int u, v;cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
} dfs(st, 0);
dfs1(st, 0); ans.push_back(ed); for(auto &i : ans) {
cout << i << ' ';
} cout << '\n';
}

D1. Infinite Sequence (Easy Version)

思维难度远小于 C 题,我们可以发现,对于一个偶数 \(x\) 和一个奇数 \(x + 1\),一定有 \(\lfloor x / 2 \rfloor = \lfloor x / 2 \rfloor\),若 \(n\) 为偶数,我们先多算一项把 \(n\) 变成奇数,因此在第 \(n\) 项后,相邻两项的值一定是相同的,又根据异或的性质,相同的数异或后的值为 \(0\),因此后面看似一段连续的序列,实则是离散的,有效点很少。

我们采取递归实现,使用一个 \(get(x)\) 函数来获取一个数 \(x\) 的前缀异或和,如果 \(x\) 为奇数,直接返回 \(pre_n\),因为 \(n\) 之后全是 \(0\),如果 \(x\) 为偶数,则用这个偶数的单点值,异或上 \(pre_n\),因为这个偶数之前到 \(n\) 也全是 \(0\)。

int get(int x) {
if(x <= n)return pre[x]; if(x & 1) {
return pre[n];
} else {
return get(x / 2) ^ pre[n];
}
} void solve()
{
cin >> n >> l >> r;
for(int i = 1;i <= n;i ++)cin >> a[i];
for(int i = 1;i <= n;i ++)pre[i] = pre[i - 1] ^ a[i]; if(n % 2 == 0) {
n ++;
a[n] = pre[n / 2];
pre[n] = pre[n - 1] ^ a[n];
} if(l <= n) {
cout << a[l] << '\n';
return;
} cout << get(l / 2) << '\n';
}

Codeforces Round 1007 (Div. 2) 比赛记录的更多相关文章

  1. Codeforces Round #606 Div. 2 比赛总结

    比赛情况 bq. A题 Wrong Answer on test 2 , E题sb题没切.bqbqbq. 比赛总结 bq. 那就直接上题解吧!^-^ A 数位dp,分类讨论,注意细节. Talk is ...

  2. Codeforces Round #605 (Div. 3) 比赛总结

    比赛情况 2h才刀了A,B,C,D.E题的套路做的少,不过ygt大佬给我讲完思路后赛后2min就AC了这题. 比赛总结 比赛时不用担心"时间短,要做多快",这样会匆匆忙忙,反而会做 ...

  3. 【cf比赛记录】Codeforces Round #601 (Div. 2)

    Codeforces Round #601 (Div. 2) ---- 比赛传送门 周二晚因为身体不适鸽了,补题补题 A // http://codeforces.com/contest/1255/p ...

  4. 【cf比赛记录】Codeforces Round #600 (Div. 2)

    Codeforces Round #600 (Div. 2) ---- 比赛传送门 昨晚成绩还好,AC A,B题,还能上分(到底有多菜) 补了C.D题,因为昨晚对C.D题已经有想法了,所以补起题来也快 ...

  5. Codeforces Round #713 (Div. 3)AB题

    Codeforces Round #713 (Div. 3) Editorial 记录一下自己写的前二题本人比较菜 A. Spy Detected! You are given an array a ...

  6. 刷题记录:Codeforces Round #734 (Div. 3)

    Codeforces Round #734 (Div. 3) 20210920.网址:https://codeforces.com/contest/1551. 编程细节:下标定义不要一会[1,n]一会 ...

  7. 刷题记录:Codeforces Round #739 (Div. 3)

    Codeforces Round #739 (Div. 3) 20210907.网址:https://codeforces.com/contest/1560. --(叹). A 不希望出现带" ...

  8. 刷题记录:Codeforces Round #724 (Div. 2)

    Codeforces Round #724 (Div. 2) 20210713.网址:https://codeforces.com/contest/1536. div2明显比div3难多了啊-只做了前 ...

  9. 刷题记录:Codeforces Round #725 (Div. 3)

    Codeforces Round #725 (Div. 3) 20210704.网址:https://codeforces.com/contest/1538. 感觉这个比上一个要难. A 有一个n个数 ...

  10. 刷题记录:Codeforces Round #719 (Div. 3)

    Codeforces Round #719 (Div. 3) 20210703.网址:https://codeforces.com/contest/1520. 没错,我是个做div3的蒟蒻-- A 大 ...

随机推荐

  1. [.NET Blog] .NET Aspire 测试入门

    https://devblogs.microsoft.com/dotnet/getting-started-with-testing-and-dotnet-aspire/ 自动化测试是软件开发的重要一 ...

  2. 【爬虫】XPath实例

    题目要求我们用XPATH去爬某个网站并且保存为CSV文件 代码如下,仅供参考 # -*- coding: UTF-8 -*- # 开发人员:萌狼蓝天 # 博客:Https://mllt.cc # 笔记 ...

  3. 【报错解决】【人工智能】【深度学习】验证cuda和tensorflow之间的版本对应关系时遇到的问题

    验证环境B 验证成功,没有问题 验证环境A 得到结果false 检查是否与CUDA关联成功 tf.test.is_built_with_cuda() 发现没有关联成功 根据查询可知道,失败的原因是1. ...

  4. 爬虫自动化脚本+AI赋能

    简介 估计大家对网页爬取和数据抓取已经有所了解,市面上也有许多现成的软件可供使用.例如,前几天群里有位朋友利用爬虫技术抓取了AV网站,并搭建了一个磁力链接站点. 本文将介绍如何模拟手动操作,将一些繁琐 ...

  5. Qt编写本地摄像头综合应用示例(qcamera/ffmpeg/v4l2等)

    一.功能特点 同时支持 qcamera.ffmpeg.v4l2 三种内核解析本地摄像头. 提供函数 findCamera 自动搜索环境中的所有本地摄像头设备,搜索结果信号发出. 支持自动搜索和指定设备 ...

  6. 记一次语音合成遇到的坑:PCM音频流转WAV

    需求内容: 预合成音:支持将固定音合成并完成上传操作 解决思路: 调用公有云识别引擎,获取识别引擎合成的音频流, 然后将音频流转成wav文件, 最后将文件上传到oss服务器上. 遇到的问题 问题主要在 ...

  7. Javascript中不同的<script.../>元素中变量或函数的作用范围的说明

    在同一个<script.../>元素中,Javascript允许先调用函数,然后再定义该函数:但是在不同的<script.../>元素中,必须先定义函数,再调用该函数,也就是说 ...

  8. 展锐SE8451E 开启硬件流控

    Dear Customer:  如电话沟通,若将uart0配置成3M波特率,需进行如下更改:  1.时钟源更改为96M/sprdroid10_trunk_19c_rls1/bsp/kernel/ker ...

  9. python SQLAlchemy ORM——从零开始学习03 如何针对数据库信息进行排序

    03 如何进行排序 3-1准备工作: 因为要排序,所以需要随机多谢数据,model见后文.也需要random进行随机 from model import User, Engine from sqlal ...

  10. Java接口-详解

    一.基本概念 接口(Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合.接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 如果一个类只由 ...