Codeforces Round 1006 (Div. 3) 比赛记录

比赛链接

这场的题目名称都很长啊~。

很简单的一场(毕竟是div3,能不简单嘛)赛时切掉了A - F,C题花的时间有点多,G题偶遇数学压轴拼尽全力无法战胜。

A. New World, New Me, New Array

由于取值范围是 \(-p\) 到 \(p\),所以很明显 \(k\) 的正负是无所谓的,所以只需要判断最大能取到的值能否大于等于 \(|k|\),然后用 \(|k|\) 除以 \(p\) 向下取整即可。

void solve()
{
int n, k, p;cin >> n >> k >> p; k = abs(k);
int mx = n * p; if(k == 0) {
cout << 0 << '\n';
return;
} if(k > mx) {
cout << -1 << '\n';
return;
} else {
cout << (k - 1) / p + 1 << '\n';
}
}

B. Having Been a Treasurer in the Past, I Help Goblins Deceive

组合数学问题,两个 - 和一个 _ 来组成一个表情,很明显,要最多的话,我们把所有的 _ 放在一起是最有的,因为此时他们可以共享所有的 -,然后再枚举一下左右两边 - 的数量乘一下取最大即可。

void solve()
{
int n;cin >> n;
string s;cin >> s; int cnt = 0;
int ck = 0;
for(auto &i : s) {
cnt += (i == '-');
ck += (i == '_');
} int ans = 0;
for(int i = 1;i <= cnt;i ++) {
ans = max(ans, i * (cnt - i) * ck);
} cout << ans << '\n';
}

C. Creating Keys for StORages Has Become My Main Skill

题目要我们构造出来的 \(MEX\) 值仅可能大,那就直接从 \(0\) 开始枚举呗,检验一下这个数字能否加入,能加入就加入,不能加入就停止循环,然后检验一下此时的前缀或和是否为 \(x\),如果不是,那么就把下一个数设置为 \(x\)(如果位置不够用了,就把当前最后一个设置为 \(x\)),然后继续往后填 \(0\)。

赛后在群里看到了其他大佬更优雅的做法:先把 \(0\) 到 \(n - 1\) 全部加入,然后逐个检测是否合法,不合法就换为 \(x\),然后再前缀或和算一下,如果不是 \(x\) 就把最后一个换为 \(x\)。

//其实这个check可以直接用 x | i == i来替换,赛时铸币了
bool check(int x, int y) {
for(int i = 0;i <= 31;i ++) {
if(!(x & (1ll << i)) && (y & (1ll << i))) {
return false;
}
}
return true;
} void solve()
{
int n, x;cin >> n >> x; int ix = 0; for(int i = 0;ix < n;i ++) {
if(check(x, i)) {
a[++ ix] = i;
} else break;
} int pre = 0;
for(int i = 1;i <= ix;i ++) {
pre |= a[i];
} if(pre != x) {
if(ix == n)a[ix] = x;
else a[++ ix] = x;
} while(ix <= n) {
a[++ ix] = 0;
} for(int i = 1;i <= n;i ++) {
cout << a[i] << " \n"[i == n];
} }

D. For Wizards, the Exam Is Easy, but I Couldn't Handle It

选择一个子区间,把区间头移动到尾部,使得改动后逆序对尽可能少。

看到逆序对,首先想到了树状数组,然后一看数据范围:\(1000\)?!

直接 \(n ^ 2\) 暴力启动。

枚举每一个点 \(i\) 作为起点,往后搜索 \(j\),如果 \(a_j > a_i\),移动后会让逆序对增加 \(1\),如果 \(a_j < a_i\),移动后会让逆序对减少 \(1\),时时更新当前逆序对的减少数,一旦减得更多了,就更新答案区间。

void solve()
{
int n;cin >> n;
for(int i = 1;i <= n;i ++)cin >> a[i]; pair<int, int> ans = {1, 1};
int mx = 0;
int sum[2] = {0};
for(int i = 1;i <= n;i ++) {
sum[1] = 0;
sum[0] = 0; for(int j = i + 1;j <= n;j ++) {
if(a[j] < a[i])sum[1] ++;
if(a[j] > a[i])sum[0] ++;
int now = sum[1] - sum[0];
if(now > mx) {
ans = {i, j};
mx = now;
}
}
} cout << ans.first << ' ' << ans.second << '\n';
}

E. Do You Love Your Hero and His Two-Hit Multi-Target Attacks?

这个题可以用类似倍增的想法来做。

如果一堆点 \(x\) 坐标相同,那么这一堆点里面可以选出来的对数是 \(C(n, 2)\)。

那么我们可以先预处理 \(1\) 到 \(500\) 的 \(C(n, 2)\) 的值,然后每次挑尽可能大的满足小于等于当前剩余值的 \(n\)来连成一条线,这个可以二分实现。

为了节约,我们可以一条竖着一条横着这么放,这样每次都可以省下来一个(但其实是不需要的,只需要每次结束时 \(x\) 和 \(y\) 都加一就能和上一条断开了,数量也是足够的,并不需要省)。

void init() {
for(int i = 1;i <= 500;i ++) {
a[i] = i * (i - 1) / 2;
}
} void solve()
{
int k;cin >> k;
int ix = upper_bound(a + 1, a + 500 + 1, k) - a; int sum = k;
int cnt = 0;
int x = 0;
int y = 0; vector<pair<int, int> > ans;
ans.push_back({0, 0}); while(sum) {
cnt ++;
int ix = upper_bound(a + 1, a + 500 + 1, sum) - a - 1;
sum -= a[ix];
if(cnt & 1) {
x ++;
for(int i = 1;i < ix;i ++) {
ans.push_back({x, y});
x ++;
}
x --;
} else {
y ++;
for(int i = 1;i < ix;i ++) {
ans.push_back({x, y});
y ++;
}
y --;
}
} cout << ans.size() << '\n';
for(auto &[u, v ] : ans) {
cout << u << ' ' << v << '\n';
}
}

F. Goodbye, Banker Life

手玩几个样例后发现和 \(k\) 根本没有任何关系。

打表可以发现,如果 \(x\) 是偶数的话,这一行的构造就相当于 \(x / 2\) 行的构造每个数字相邻出现两次。

因此选择递归实现:

  • 如果 \(x\) 是偶数,那就往 \(x / 2\) 递归,传递时把每个值相邻堆叠两次。
  • 如果 \(x\) 是奇数,那么 \(x - 1\) 就是偶数,向 \(x - 1\) 递归,然后按题目规则算 \(x\) 行即可。

但实际上这个做法是复杂了的,因为其实每一个位置异或上 \(1\) 的次数,就是这个位置的杨辉三角值,题目的传递方式也是按杨辉三角的规则进行传递的。

所以只需要计算这个位置的组合数是奇数还是偶数,就知道这个位置是 \(0\) 还是 \(1\) 了。

最后全部乘上 \(k\) 就行。

(不过我觉得递归做法也还是蛮巧妙的)

void get(int x) {
if(x == 1) {
a[1] = 1;
return;
} if(x & 1) {
get(x - 1);
for(int i = 1;i <= x;i ++) {
if(i == 1) {
tmp[i] = a[i];
} else if(i == x) {
tmp[i] = a[1];
} else {
tmp[i] = a[i - 1] ^ a[i];
}
}
for(int i = 1;i <= x;i ++) {
a[i] = tmp[i];
}
} else {
get(x / 2);
for(int i = 1;i <= x / 2;i ++) {
tmp[i * 2] = tmp[i * 2 - 1] = a[i];
}
for(int i = 1;i <= x;i ++) {
a[i] = tmp[i];
}
}
} void solve()
{
int n, k;cin >> n >> k;
get(n); for(int i = 1;i <= n;i ++) {
cout << a[i] * k << " \n"[i == n];
}
}

离 AK 最近的一次,希望有朝一日能 AK div3!

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

  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. 大文件传输与断点续传实现(极简Demo: React+Node.js)

    大文件传输与断点续传实现(极简Demo:React+Node.js) 简述 使用React前端和Node.js后端实现大文件传输和断点续传的功能.通过分片上传技术,可以有效地解决网络不稳定带来的传输中 ...

  2. GraphQL Part V: 字段,参数和变量

    字段 我们对字段已经有了好的起点,我们在 HelloWorldQuery 中有两个字段:hello 和 world.他们都是单值字段. 现在我们可以扩展应用来支持复杂类型.例如,我们想象一下,我们在创 ...

  3. gitlab-runner register

    [root@g ~]# gitlab-runner register Runtime platform arch=amd64 os=linux pid=23614 revision=ac8e767a ...

  4. SpringBoot重点详解--使用Actuator进行健康监控

    目录 添加依赖与配置 Actuator监控项 Actuator监控管理 打开或关闭 端口与地址 Actuator是Springboot提供的用来对应用系统进行自省和监控的功能模块,借助于Actuato ...

  5. Qt音视频开发26-ffmpeg播放器

    一.前言 用ffmpeg来实现自己的播放器,这是一直以来的一个目标,之前的难点卡在音视频同步以及如何播放声音这两点(尽管之前已经进行过不少的尝试和探索,但是问题还是挺多,比如音视频同步不完美,有些文件 ...

  6. pitch、yaw、roll三个角的区别

    Z轴正方向为前进方向 pitch():俯仰,将物体绕X轴旋转(localRotationX) yaw():航向,将物体绕Y轴旋转(localRotationY) roll():横滚,将物体绕Z轴旋转( ...

  7. TypeScript学习(二) - TypeScript的接口(interface)和类(class)

    1. 对象的类型--接口 1.1 什么是接口 1.2 简单的例子 1.3 可选属性 1.4 任意属性 1.5 只读属性 2. 类 2.1 类的概念 2.2 ES6 中类的用法 属性和方法 类的继承 存 ...

  8. 【问题解决记录】vue解决低版本安卓与ios10以下系统兼容性问题

    问题描述: 项目中的企业微信内部应用,使用Vue-cli搭建的H5页面web,在低版本的安卓手机或ios8.0.9.0中出现接口数据访问失败,HTTP状态码返回0的问题,无法正常使用系统.安卓手机主要 ...

  9. Mongodb使用手册-文档存储

    简介 MongoDB 是一个基于分布式文件存储的NoSQL数据库 由C++语言编写,运行稳定,性能高 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案 查看官方网站 MongoDB特点 模式自由 ...

  10. 高性能的RTC服务器OpenFire

    <高性能的RTC服务器OpenFire>-第一章部署与源码调试 前言 OpenFire是什么,以及它能做什么?或许这是许多开发人员最关心的一个话题.简单来说,OpenFire是一个采用纯J ...