Codeforces Round 995 (Div. 3)【题解】D ~ G

比赛地址传送门

D.Counting Pairs

在这里插入图片描述

  1. 注意到确定一个数后,第二个数可以一个范围内任选。
  2. 故排序+二分查找上下界后计数
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 4e5 + 10;int n, x, y;
int a[N];void solve() {cin >> n >> x >> y;for (int i = 1; i <= n; i ++)cin >> a[i];sort(a + 1, a + 1 + n);long long sum = 0;for (int i = 1; i <= n; i ++) {sum += a[i];}long long ans = 0;for (int i = 1; i <= n; i ++) {int l1 = 1, r1 = n;while (l1 != r1) {int mid = l1 + r1 >> 1;if (sum - (a[mid] + a[i]) <= y) {r1 = mid;} elsel1 = mid + 1;}int l2 = 1, r2 = n;while (l2 != r2) {int mid = l2 + r2 + 1 >> 1;if (sum - (a[mid] + a[i]) >= x) {l2 = mid;} elser2 = mid - 1;}if (sum - a[l1] - a[i] >= x && sum - a[l1] - a[i] <= y&& sum - a[l2] - a[i] >= x && sum - a[l2] - a[i] <= y) {if (l1 <= l2) {ans += l2 - l1 + 1;if (i <= l2 && i >= l1)ans --;}}}cout << ans / 2 << '\n';
}signed main() {ios::sync_with_stdio(false);cin.tie(0);int t = 1;cin >> t;while (t --) {solve();}return 0;
}

E.Counting Pairs

在这里插入图片描述

  1. 如果只有1件物品,设定的价格只可能是 a1、b1
  2. 所以,虽然价格设定的范围为1~1e9,但并不是每一个价格都有可能(PS:有点离散化的意思在)
  3. 故从最终答案考虑,我们只需要枚举 全部ai和bi即可。但是为了判断印象不好的顾客是否不超过k,和统计当前可购买的人数,还需要额外枚举ai+1和bi+1以更新上述两个数据
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 2e5 + 10;int n, k;
int a[N], b[N];
int st[N];
long long ans;void solve() {ans = 0;cin >> n >> k;for (int i = 1; i <= n; i ++)cin >> a[i];for (int i = 1; i <= n; i ++)cin >> b[i];priority_queue<PII, vector<PII>, greater<PII>> heap;int mi = 1e18;for (int i = 1; i <= n; i ++) {heap.push({a[i], i});st[i] = -1;}int cnt = n, neg = 0;while (!heap.empty()) {auto t = heap.top();int price = t.first;int negadd = 0;while (!heap.empty() && heap.top().first == price) {auto i = heap.top();heap.pop();int k = i.second;if (st[k] == -1) {st[k] ++;heap.push({a[k] + 1, k});} else if (st[k] == 0) {st[k] ++;neg ++;heap.push({b[k], k});} else if (st[k] == 1) {st[k] ++;heap.push({b[k] + 1, k});} else {neg --;cnt --;}}if (neg <= k) {ans = max(ans, cnt * price);}}cout << ans << '\n';
}signed main() {ios::sync_with_stdio(false);cin.tie(0);int t = 1;cin >> t;while (t --) {solve();}return 0;
}

F. Joker

在这里插入图片描述

  1. 鬼牌最终可能在的位置是三段连续区间,看出这个这题有了。
  2. 三段分别是,中间一段、顶部一段、底部一段。
  3. 观察一组例子,发现如果抽的牌在鬼牌的下方,那么放回下方时,鬼牌位置不变;放回上方时,鬼牌位置向下移动一位。同理,鬼牌在上方类似。但是如果被抽走的牌是鬼牌,鬼牌就要么去排顶要么去排底。
  4. 那么,既然是三段连续区间,统计鬼牌可能区间的长度即是答案。
  5. 用四个变量分别维护,排顶、排底、中段上、中段下即可。统计答案时注意区间的重合问题。
  6. 有一个特例是,第一次就抽走鬼牌,那么中间段将消失。
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 2e5 + 10;int n, m, q;void solve() {cin >> n >> m >> q;long long ans = 0;int top = -1, bottom = -1;bool flag = false, flag2 = false;;int l = m, r = m;while (q --) {int x;cin >> x;if (!flag2 && x <= r && x >= l) {if (!flag) {flag = 1;top = 1, bottom = n;if (l == r) {flag2 = 1;}} else {if (x < bottom) {bottom --;}if (x > top) {top ++;}}} else {if (flag) {if (x < bottom) {bottom --;}if (x > top) {top ++;}}if (!flag2) {if (x < l) {l --;}if (x > r) {r ++;}}}if (!flag) {ans = r - l + 1;} else {if (flag2) {if (bottom <= top) {ans = n;} elseans = top + n - bottom + 1;} else {if (bottom <= r && top >= l) {ans = n;} else if (bottom <= r && top < l) {ans = n - l + 1 + top;} else if (bottom > r && top >= l) {ans = r + n - bottom + 1;} else {ans = r - l + 1 + top + n - bottom + 1;}}}cout << ans << ' ';}cout << '\n';
}signed main() {ios::sync_with_stdio(false);cin.tie(0);int t = 1;cin >> t;while (t --) {solve();}return 0;
}

G.Snakes

在这里插入图片描述

  1. n <= 20, 很特殊的数据范围,这个范围的典型算法就是爆搜和状压dp。
  2. 蛇之间越紧密越好,不犯规的情况下空隙尽量小。
  3. 定义dp[i][j],n位二进制数 i 表示当前状态,i 的第 k 位为 1 表示该状态使用了第 k 条蛇,为 0 表示不使用。再增开一个状态表示当前结尾的是第 i 条蛇。
  4. 转移就是枚举下一条蛇,用二者之间的最短距离更新。如下:
   //i为当前状态,ne为下一状态//j为当前结尾的蛇的编,k是下一条蛇的编号,dist[i][j]为二者最短距离int ne = i + (1ll << (k - 1));dp[ne][k] = min(dp[ne][k], dp[i][j] + dist[j][k] + 1);
  1. 此dp时间复杂度为 o ( 2 n n 2 ) o(2^nn^2) o(2nn2) 略高,带值后达4e8,但时限3s且dp的常数较小,2906 ms 极限通过。
  2. dist[i][j] 可预处理出,枚举两条蛇后遍历整个操作序列处理即可。
#include <bits/stdc++.h>
#define int long longusing namespace std;typedef pair<int, int> PII;
const int N = 22, M = 1024 * 1024 + 10;int dist[N][N];
int dp[M][N];
int a[200010], b[200010];
int n, q;void solve() {cin >> n >> q;for (int i = 1; i <= q; i ++) {int x;char y;cin >> x >> y;a[i] = x, b[i] = y;}for (int i = 0; i <= n; i ++)for (int j = 0; j <= n; j ++) {if (i == j)continue;int d = 0;for (int k = 1; k <= q; k ++) {if (a[k] == i) {if (b[k] == '+')d ++;} else if (a[k] == j) {if (b[k] == '-')d --;}dist[i][j] = max(dist[i][j], d);}}int mx = (1 << n) - 1;for (int i = 0; i <= mx; i ++) {for (int j = 0; j <= n; j ++) {dp[i][j] = 1e18;}}dp[0][0] = 0;for (int j = 1; j <= n; j ++) {int ne = 1ll << (j - 1);dp[ne][j] = dist[0][j] + 1;}for (int i = 1; i <= mx; i ++) {for (int j = 1; j <= n; j ++) {for (int k = 1; k <= n; k ++) {if ((i >> (k - 1)) & 1)continue;//i为当前状态,ne为下一状态,dist为二者最短距离int ne = i + (1ll << (k - 1));dp[ne][k] = min(dp[ne][k], dp[i][j] + dist[j][k] + 1);}}}long long ans = 1e18;for (int i = 1; i <= n; i ++) {ans = min(ans, dp[mx][i] + dist[i][0]);}cout << ans << '\n';
}signed main() {ios::sync_with_stdio(false);cin.tie(0);int t = 1;//cin >> t;while (t --) {solve();}return 0;
}

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

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

相关文章

【Linux】Linux基础命令(二)

locate命令 locate命令可以用于快速查找文件的路径&#xff0c;比如我要查找所有.cpp文件的路径&#xff1a; sudo locate *.cppless 命令 less命令和more命令类似&#xff0c;都是查看文件内容&#xff0c;但less命令更强大 可以使用光标上下&#xff08;左右&#xff09;…

自动化构音障碍严重程度分类:基于声学特征与深度学习的研究 学习技术

自动化构音障碍严重程度分类 原文名称&#xff1a;Automated Dysarthria Severity Classification:A Study on Acoustic Features and Deep Learning Techniques 摘要 本文比较了不同深度学习技术和声学特征在构音障碍严重程度分类中的应用。研究评估了深度神经网络&#xff0…

【NLP】ELMO、GPT、BERT、BART模型解读及对比分析

文章目录 一、基础知识1.1 Word Embedding&#xff08;词嵌入&#xff09;1.2 词嵌入模型1.3 神经网络语言模型NNLM 二、ELMO2.1 ELMO的提出2.2 ELMO核心思想2.3 ELMO的优缺点 三、GPT3.1 Transformer3.2 GPT简介3.3 GPT模型架构3.4 预训练及微调3.5 GPT和ELMO对比 四、BERT4.1…

EasyExcel(二)导出Excel表自动换行和样式设置

EasyExcel(一)导出Excel表列宽自适应 背景 在上一篇文章中解决导出列宽自适应,然后也解决了导出列宽不可超过255的问题。但是实际应用场景中仍然会有导出数据的长度超过列宽255。这时导出效果就会出现如下现象: 多出列宽宽度的内容会浮出来,影响后边列数据的显示。 解决…

【深度学习】多目标融合算法(二):底部共享多任务模型(Shared-Bottom Multi-task Model)

目录 一、引言 1.1 往期回顾 1.2 本期概要 二、Shared-Bottom Multi-task Model&#xff08;SBMM&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 三、总结 一、引言 在朴素的深度学习ctr预估模型中&#xff08;如DNN&#xff09;&#xff0c;通常以一个行…

分类模型为什么使用交叉熵作为损失函数

推导过程 让推理更有体感&#xff0c;进行下面假设&#xff1a; 假设要对猫、狗进行图片识别分类假设模型输出 y y y&#xff0c;是一个几率&#xff0c;表示是猫的概率 训练资料如下&#xff1a; x n x^n xn类别 y ^ n \widehat{y}^n y ​n x 1 x^1 x1猫1 x 2 x^2 x2猫1 x …

快速导入请求到postman

1.确定请求&#xff0c;右键复制为cURL(bash) 2.postman菜单栏Import-Raw text&#xff0c;粘贴复制的内容保存&#xff0c;请求添加成功

第432场周赛:跳过交替单元格的之字形遍历、机器人可以获得的最大金币数、图的最大边权的最小值、统计 K 次操作以内得到非递减子数组的数目

Q1、跳过交替单元格的之字形遍历 1、题目描述 给你一个 m x n 的二维数组 grid&#xff0c;数组由 正整数 组成。 你的任务是以 之字形 遍历 grid&#xff0c;同时跳过每个 交替 的单元格。 之字形遍历的定义如下&#xff1a; 从左上角的单元格 (0, 0) 开始。在当前行中向…

专题 - STM32

基础 基础知识 STM所有产品线&#xff08;列举型号&#xff09;&#xff1a; STM产品的3内核架构&#xff08;列举ARM芯片架构&#xff09;&#xff1a; STM32的3开发方式&#xff1a; STM32的5开发工具和套件&#xff1a; 若要在电脑上直接硬件级调试STM32设备&#xff0c;则…

基于Django的个性化餐饮管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 该系统的研发对于餐饮行业具有重要意义。首先&#xff0c;通过个性化餐饮管理系统的应用&#xff0c;餐饮企业能够精准把握顾客需求&#xff0c;提供定制化服务&#xff0c;从而增强顾客粘性&#xff0c;提升顾客满意度。其次&a…

scala代码打包配置(maven)

目录 mavenpom.xml打包配置项&#xff08;非完整版&#xff0c;仅含打包的内容< build>&#xff09;pom.xml完整示例&#xff08;需要修改参数&#xff09;效果说明 maven 最主要的方式还是maven进行打包&#xff0c;也好进行配置项的管理 以下为pom文件&#xff08;不要…

plane开源的自托管项目

Plane 是一个开源的自托管项目规划解决方案&#xff0c;专注于问题管理、里程碑跟踪以及产品路线图的设计。作为一款开源软件&#xff0c;Plane 的代码托管在 GitHub 平台上&#xff0c;允许任何人查看和贡献代码。它为用户提供了便捷的项目创建与管理手段&#xff0c;并配备了…

wireshark排除私接小路由

1.wireshark打开&#xff0c;发现了可疑地址&#xff0c;合法的地址段DHCP是192.168.100.0段的&#xff0c;打开后查看发现可疑地址段&#xff0c;分别是&#xff0c;192.168.0.1 192.168.1.174 192.168.1.1。查找到它对应的MAC地址。 ip.src192.168.1.1 2.通过show fdb p…

Elasticsearch:使用 Playground 与你的 PDF 聊天

LLMs作者&#xff1a;来自 Elastic Toms Mura 了解如何将 PDF 文件上传到 Kibana 并使用 Elastic Playground 与它们交互。本博客展示了在 Playground 中与 PDF 聊天的实用示例。 Elasticsearch 8.16 具有一项新功能&#xff0c;可让你将 PDF 文件直接上传到 Kibana 并使用 Pla…

【C++】深入理解string相关函数:实现和分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;1. 使用 stoi 和 stol 函数1.1 stoi 和 stol 的基本概述参数说明进制支持示例代码与解析运行结果解析 异常处理 &#x1f4af;2. 使用 stod 和 stof 函数2.1 stod 和 stof …

“AI智能服务平台系统,让生活更便捷、更智能

大家好&#xff0c;我是资深产品经理老王&#xff0c;今天咱们来聊聊一个让生活变得越来越方便的高科技产品——AI智能服务平台系统。这个系统可是现代服务业的一颗璀璨明珠&#xff0c;它究竟有哪些魅力呢&#xff1f;下面我就跟大家伙儿闲聊一下。 一、什么是AI智能服务平台系…

回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测

回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测 目录 回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测。 程序设计 完整代码&#xff1a;回…

页面滚动下拉时,元素变为fixed浮动,上拉到顶部时恢复原状,js代码以视频示例

页面滚动下拉时,元素变为fixed浮动js代码 以视频示例 <style>video{width:100%;height:auto}.div2,#float1{position:fixed;_position:absolute;top:45px;right:0; z-index:250;}button{float:right;display:block;margin:5px} </style><section id"abou…

【Vim Masterclass 笔记09】S06L22:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第一部分)

文章目录 S06L22 Search, Find, and Replace - Part One1 从光标位置起&#xff0c;正向定位到当前行的首个字符 b2 从光标位置起&#xff0c;反向查找某个字符3 重复上一次字符查找操作4 定位到目标字符的前一个字符5 单字符查找与 Vim 命令的组合6 跨行查找某字符串7 Vim 的增…

力扣 岛屿数量

从某个点找&#xff0c;不断找相邻位置。 题目 岛屿中被“0”隔开后 &#xff0c;是每一小块状的“1”&#xff0c;本题在问有多少块。可以用dfs进行搜索&#xff0c;遍历每一个点&#xff0c;把每一个点的上下左右做搜索检测&#xff0c;当检测到就标记为“0”表示已访问过&a…