2024.1.31 寒假训练记录(14)

文章目录

  • CF 1918C XOR-distance
  • CF 1918D Blocking Elements
  • CF 1918E ace5 and Task Order

CF 1918C XOR-distance

题目链接

这题出思路还挺快的,就是考虑二进制每一位的贡献,可惜写了个假的贪心

正确贪心是,考虑两种情况,第一种情况是当处理结束时,a ^ x比b ^ x大,另一种情况是a ^ x比b ^ x小

当结束时前面比后面大,遍历每一位中 a是1 b是0 的位置就要尽可能让 a 变成 0 b变成 1,这样需要的代价是2的位数的次方,可以减少的差值是两倍的次方

当结束时前面比后面小,遍历每一位中 a是0 b是1 的位置就要尽可能让 a 变成 1 b变成 0,这样需要的代价是2的位数的次方,可以减少的差值是两倍的次方

有个需要注意的点是,要单独处理一下ab第一个不同的数,如果结束a大于b,那第一个不同的数一定要是a为1 b为0,如果不是就要调整成这样,调整不了就不考虑这种情况,a小于b也是类似的

下面是我很啰嗦的代码,可以把后面类似的两部分写成一个函数

#include <bits/stdc++.h>using namespace std;#define int long longtypedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;const int N = 1000010;int cf[63];void init()
{cf[0] = 1;for (int i = 1; i <= 61; i ++ ) cf[i] = 2 * cf[i - 1];
}void solve()
{int a, b, r;cin >> a >> b >> r;if (a < b) swap(a, b);int ans = a - b;int res = ans;vector<int> aa, bb;if (a == 0) aa.push_back(0);if (b == 0) bb.push_back(0);int at = a, bt = b;while (at){aa.push_back(at & 1);at >>= 1;}while (bt){bb.push_back(bt & 1);bt >>= 1;}while (bb.size() < aa.size()) bb.push_back(0);int i = bb.size() - 1;int tmp = r;bool flag = false;while (i >= 0){if (!flag && aa[i] != bb[i]){flag = true;if (aa[i] == 0){if (cf[i] > r) break;else{r -= cf[i];ans -= 2 * cf[i];res = min(res, abs(ans));i -- ;continue;}}i -- ;continue;}if (r < cf[i] || aa[i] == bb[i]){i -- ;continue;}if (!flag && aa[i] == 0 && cf[i] >= r) break;if (aa[i] == 1 && bb[i] == 0 && flag){r -= cf[i];ans -= cf[i] * 2;res = min(abs(ans), res);}i -- ;}r = tmp;i = bb.size() - 1;ans = b - a;flag = false;while (i >= 0){if (!flag && aa[i] != bb[i]){flag = true;if (aa[i] == 1){if (cf[i] > r) break;else{r -= cf[i];ans -= 2 * cf[i];res = min(res, abs(ans));i -- ;continue;}}i -- ;continue;	}if (r < cf[i] || aa[i] == bb[i]){i -- ;continue;}if (!flag && aa[i] == 0 && cf[i] >= r) break;if (bb[i] == 1 && aa[i] == 0 && flag){r -= cf[i];ans -= cf[i] * 2;res = min(abs(ans), res);}i -- ;}cout << res << '\n';
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);init();int t = 1;cin >> t;while (t -- ){solve();}
}

CF 1918D Blocking Elements

题目链接

这题只能想到二分了,后面的单调队列没用过(极大可能是用过没总结就忘记了)

二分最终答案,然后让区间和都满足条件去判断端点和是否满足条件

dp[i]表示以i为最后一个分割点,最小的端点和是多少

j表示以i为最后一个端点,它前面能取到的最大的端点序号值

sum记录当前区间和,每当区间和超过mid了就把最前面一个值删掉,更新j

然后用单调队列维护以i为最后一个端点能取到的端点中端点和最小的序号,所以转移方程为dp[i] = dp[q.front()] + a[i]

关于单调队列总结在这

#include <bits/stdc++.h>using namespace std;#define int long longtypedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef pair<int, PII> PIII;const int N = 1000010;void solve()
{int n;cin >> n;vector<int> a(n + 2);for (int i = 1; i <= n; i ++ ) cin >> a[i];auto check = [&](int mid){vector<int> dp(n + 2);deque<int> q;int sum = 0;int j = 0;q.push_front(0);for (int i = 1; i <= n + 1; i ++ ){while (sum > mid) sum -= a[ ++ j];while (q.size() && q.front() < j) q.pop_front();if (!q.size()) return false;dp[i] = dp[q.front()] + a[i];while (q.size() && dp[q.back()] > dp[i]) q.pop_back();q.push_back(i);sum += a[i];}return dp[n + 1] <= mid;};int l = 0, r = 1e15;while (l < r){int mid = l + r >> 1;if (check(mid)) r = mid;else l = mid + 1;}cout << r << '\n';
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;cin >> t;while (t -- ){solve();}
}

CF 1918E ace5 and Task Order

题目链接

这题还是挺妙的

目标是给数组排序,还有个用于比较的元素 x,通过这个想到题目的交互可能是利用快排的思想,小于x的丢到左边,大于丢到右边,然后左右两边再递归排序

数据已经有序的时候快排会退化到 O ( n 2 ) O(n^2) O(n2),所以做之前先打乱顺序

#include <bits/stdc++.h>using namespace std;#define int long longvoid solve()
{mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());int n;cin >> n;vector<int> pos(n); // 存储值i的位置for (int i = 0; i < n; i ++ ) pos[i] = i;shuffle(pos.begin(), pos.end(), rnd);auto ask = [&](int x){cout << "? " << x + 1 << endl;char nn;cin >> nn;return nn;};function<void(int, int)> qsort = [&](int l, int r){if (l >= r) return;int mid = pos[l + r >> 1];while (ask(mid) != '=') ;vector<int> a, b, c; // = > <for (int i = l; i <= r; i ++ ){if (pos[i] == mid) a.push_back(pos[i]);else{char t = ask(pos[i]);ask(mid);if (t == '<') c.push_back(pos[i]);else b.push_back(pos[i]);}}copy(c.begin(), c.end(), pos.begin() + l);copy(b.begin(), b.end(), pos.begin() + c.size() + l + 1);pos[l + c.size()] = mid;qsort(l, l + c.size() - 1);qsort(l + c.size() + 1, r);};qsort(0, n - 1);vector<int> ans(n);for (int i = 0; i < n; i ++ ) ans[pos[i]] = i;cout << "!";for (int i = 0; i < n; i ++ ) cout << ' ' << ans[i] + 1;cout << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);int t = 1;cin >> t;while (t -- ){solve();}
}

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

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

相关文章

Quartus生成烧录到FPGA板载Flash的jic文件

简要说明&#xff1a; Altera的FPGA芯片有两种基本分类&#xff0c;一类是纯FPGA&#xff0c;另一类是FPGASoc&#xff08;System on chip)&#xff0c;也就是FPGAHPS&#xff08;Hard Processor System&#xff0c;硬核处理器&#xff09;&#xff0c;对应两种Flash烧录方式&a…

【HTML】自定义属性(data)

自定义属性 data: 的用法&#xff08;如何设置,如何获取) &#xff0c;有何优势&#xff1f; data-* 的值的获取和设置&#xff0c;2种方法: 传统方法 getAttribute() 获取 data- 属性值; setAttribute() 设置 data- 属性值getAttribute() 获取 data- 属性值; setAttribute()…

什么是自动化测试分层?3个层次从高到低又是哪些?

自动化测试分层&#xff0c;可以理解为将测试任务分解为多个层次&#xff0c;并在每个层次中定义特定的测试任务和测试范围&#xff0c;通过这种方式&#xff0c;测试人员可以更好地管理和组织测试工作&#xff0c;确保测试的全面性和准确性。 自动化测试可以分解为3个层次&am…

@ControllerAdvice(实现全局异常、全局参数、请求参数预处理)

近期看到了ControllerAdvice这个注解&#xff0c;本身只是为了看下全局异常处理的&#xff0c;简单了解后发现可以分别与ExceptionHandler、ModelAttribute、InitBinder实现 全局异常、全局参数、请求参数预处理 的功能。 目录 一、全局异常处理二、全局参数处理三、请求参数预…

LPC804开发(11.ADC使用)

1.前言 刚刚研究ADC的时候发现芯片里面还有应该mrt 16位的定时器没有搞&#xff0c;那回头补上吧。下午研究了一下ADC的使用&#xff0c;我也只是能用上&#xff0c;这里我只是抛砖引玉一下吧&#xff0c;有需要的还请各位自行深入探究&#xff0c;我这里讲解的是软件触发模式…

一部分cpp的新特性:左右值的深入理解、函数返回引用报错详解以及在此过程中涉及到的指针和引用的部分区别和一点点关于std::array的简单介绍

目录 写在前面 explicit 关键字 左值&#xff08;left value&#xff09;和右值&#xff08;left value&#xff09; 引用类型作为函数的返回值 std::array 总结 致谢 写在前面 昨天博主完成了cpp基础的学习的最后一部分&#xff0c;cpp新特性&#xff0c;今天开始来逐一…

AI工具【OCR 01】Java可使用的OCR工具Tess4J使用举例(身份证信息识别核心代码及信息提取方法分享)

Java可使用的OCR工具Tess4J使用举例 1.简介1.1 简单介绍1.2 官方说明 2.使用举例2.1 依赖及语言数据包2.2 核心代码2.3 识别身份证信息2.3.1 核心代码2.3.2 截取指定字符2.3.3 去掉字符串里的非中文字符2.3.4 提取出生日期&#xff08;待优化&#xff09;2.3.5 实测 3.总结 1.简…

Unity SRP 管线【第九讲:URP 点光源与聚光灯】

文章目录 CPU数据搜集GPU数据使用光照计算 CPU数据搜集 我们只能支持有限数量的其他灯。并将这些灯光数据&#xff08;位置、颜色、阴影强度、方向光光源、灯光遮蔽Probe、灯光层级Mask&#xff09;发送到GPU以供场景中所有物体渲染使用。 //ForwardLights.cs 额外光源数量与…

字符串string详细使用(计算机考研复试上机知识点)

字符串去重&#xff1a; 字符串去重 #include <bits/stdc.h> using namespace std;int main() { a"11322";sort(a.begin(),a.end());a.erase(unique(a.begin(),a.end()),a.end());cout<<a<<endl;return 0; } //unique函数返回没有重复区间的区间…

uniform initialization(一致化初始化)

目录 std::initializer_list 和 std::array std::initializer_list 的作用&#xff1a; std::array 的作用&#xff1a; std::initializer_list 和 std::array 使用联系 标准库里面的initializer_list 使用 vector std::initializer_list 和 std::array std::initializer_…

RabbitMQ实战指南(二)—— 基本概念

RabbitMQ实战指南&#xff08;二&#xff09;—— 基本概念 RabbitMQ是一个开源的消息中间件&#xff0c;用于在应用程序之间进行可靠的消息传递。它遵循AMQP&#xff08;高级消息队列协议&#xff09;标准&#xff0c;支持多种编程语言和平台。 下面是RabbitMQ的基本概念&…

qt内存自动释放的两种情况

qt内存管理机制 QObject的parent 我们时常能看到QWidget或者其他的控件的构造函数中有一项参数parent&#xff0c;默认值都为NULL&#xff0c;例如&#xff1a; QLineEdit(const QString &contents, QWidget *parent nullptr); QWidget(QWidget *parent nullptr, Qt::…

vue3学习——初始化项目及配置

初始化项目 环境 node 16pnpm 8.0.0 命令 pnpm create vite进行以下选择 &#x1f447; – 项目名 – VUe – Ts – cd/目录 – pnpm run dev 浏览器自动打开 package.json 配置eslint 安装依赖包 pnpm i eslint -D npx eslint --init // 生成配置文件进行以下选择 &a…

【2024】大三寒假再回首:缺乏自我意识是毒药,反思和回顾是解药

2024年初&#xff0c;学习状态回顾 开稿时间&#xff1a;2024-1-23 归家百里去&#xff0c;飘雪送客迟。 搁笔日又久&#xff0c;一顾迷惘时。 我们饱含着过去的习惯&#xff0c;缺乏自我意识是毒药&#xff0c;反思和回顾是解药。 文章目录 2024年初&#xff0c;学习状态回顾一…

vue——实现多行粘贴到table事件——技能提升

最近在写后台管理系统时&#xff0c;遇到一个需求&#xff0c;就是要从excel表格中复制多行内容&#xff0c;然后粘贴到后台系统中的table表格中。 如下图所示&#xff1a;一次性复制三行内容&#xff0c;光标放在红框中的第一个框中&#xff0c;然后按ctrlv粘贴事件&#xff0…

掌上医院预约挂号缴费系统源码,与医院信息系统共享数据,实现在线预约挂号、移动支付、医保支付、检验检查报告查看、门诊病历查询等功能。

随着信息技术的发展和互联网的普及&#xff0c;越来越多的患者开始习惯于通过互联网获取医疗服务。网上预约挂号是近年来开展的一项便民就医服务&#xff0c;旨在缓解看病难、挂号难的就医难题&#xff0c;许多患者为看一次病要跑很多次医院&#xff0c;最终还不一定能保证看得…

MySQL数据控制语言DCL

MySQL数据控制语言DCL 目录 MySQL数据控制语言DCLDCL关键字1.事务事务的四大特性START TRANSACTION&#xff1a;开始事务ROLLBACK&#xff1a;回滚COMMIT&#xff1a;提交事务 2.用户权限CREATE USER&#xff1a;创建新的用户并指定权限DROP USER&#xff1a;删除用户ALTER USE…

深度强化学习(王树森)笔记10

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

LeetCode —— 17. 电话号码的字母组合

&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️Take your time ! &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️…

基于人体姿态的目标追踪实现

文章目录 概要人体姿态识别人体关键点转检测框实时跟踪器概要 这篇博文简单介绍了如何实现基于人体姿态的多目标跟踪算法。主要分为以下几个步骤: 基于FastDeploy实现人体姿态识别;将人体姿态转化为检测框;基于SORT算法实现目标跟踪。人体姿态识别 参考Fastdeploy实现。 模…