codeforce#933 题解

E. Rudolf and k Bridges

题意不讲了,不如去题干看图。
传统dp,每个点有两个选择,那么建桥要么不建。需要注意的是在状态转移的时候,桥是有长度的,如果不建需要前d格中建桥花费最少的位置作为状态转移的初态。

#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <time.h>
#include <set>
#include <unordered_set>
#include <map>
#include <queue>#define IOS     ios::sync_with_stdio(0);cin.tie(0);
#define mem(A,B) memset(A,B,sizeof(A));
#define rep(index,start,end) for(int index = start;index < end; index ++)
#define drep(index,start,end) for(int index = start;index >= end; index --)using namespace std;typedef long long ll;const int maxn = 2e5+5;struct contianer {private:int step;int pos = 0;ll loop[maxn];multiset<ll> store;public:contianer(int step):step(step) {}void add(ll x) {int now = pos % step;// need to removeif (pos >= step) {store.erase(store.find(loop[now]));}loop[now] = x;store.insert(x);pos ++;}/*** get min number*/ll get() {return *store.begin();}void setStep(int s);void clear();
};void contianer::setStep(int s) {step = s;
}void contianer::clear() {store.clear();pos = 0;
}ll sum[128];
int store[maxn];
ll dp[maxn][2];
int main() {IOSint t;cin>>t;while(t--) {int n,m,k,d;cin>>n>>m>>k>>d;contianer heap(d);sum[0] = 0LL;// input and dprep(_,0,n) {// inputrep(i,0,m) cin>>store[i];// initheap.clear();heap.add(store[0] + 1);dp[0][0] = dp[0][1] = store[0] + 1;// dprep(i,1,m-1) {ll min_cost = heap.get();dp[i][0] = min_cost;dp[i][1] = min(dp[i-1][0], min_cost) + store[i] + 1;
//                cout<<"dp["<<i<<"][0]:"<<dp[i][0]<<" dp["<<i<<"][1]:"<<dp[i][1]<<endl;heap.add(dp[i][1]);}// costsum[_ + 1] = min(dp[m-2][1], dp[m-2][0]) + 1LL;
//            cout<<sum[_+1]<<endl;}// pre sumrep(i,1,n+1) sum[i] += sum[i-1];// the k minll ans = sum[k] - sum[0];rep(i,k+1,n+1) {ans = min(ans, sum[i] - sum[i-k]);}// coutcout<<ans<<endl;}return 0;
}

F. Rudolf and Imbalance

求两数和的plus版本。给出数组a,现在要分别从d和f挑选一个数相加后放入a,使得所有 a i + 1 − a i a_{i+1} - a_i ai+1ai中最大值尽可能小。
显然,我们只要找到在没有挑选插入前 a i + 1 − a i a_{i+1} - a_i ai+1ai的最大值以及 i i i的值,然后构造 a i + 1 > d + f > a i a_{i+1} > d+f > a_i ai+1>d+f>ai,就可以破坏最大值。且 d + f = a i + 1 + a i 2 d+f = \frac {a_{i+1} + a_i}{2} d+f=2ai+1+ai时,能将最大值分割的尽可能小。
其中,如果最大值和第二大值一样,那么无论怎么分割都改变不了最大值,可以直接输出。
至于怎么让 d + f d+f d+f尽可能靠近中点就不细说了,固定d然后二分搜索f。这里我脑干缺失写了个int target = abs(aim - commonA);我是真的睿智

#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <time.h>
#include <set>
#include <map>
#include <queue>#define IOS     ios::sync_with_stdio(0);cin.tie(0);
#define mem(A,B) memset(A,B,sizeof(A));
#define rep(index,start,end) for(int index = start;index < end; index ++)
#define drep(index,start,end) for(int index = start;index >= end; index --)using namespace std;typedef long long ll;const int maxn = 2e5+5;struct record{int val;int ind;
};int store[maxn/2];
record dif[maxn/2];
int d[maxn], f[maxn];
bool cmp(const record& a, const record& b) {return a.val < b.val;
}
int abs(int a) {if (a<0) return -a;else return a;
}
int main() {IOSint t;cin>>t;while(t--) {int n,m,k;cin>>n>>m>>k;int pos = 0;cin>>store[0];rep(i,1,n) {cin>>store[i];dif[pos].ind = i;dif[pos ++].val = store[i] - store[i-1];}sort(dif, dif+pos,cmp);
//        rep(i,0,pos) cout<<dif[i].val<<endl;int len_d , len_f;if (m < k) {rep(i,0,m) cin>>d[i];sort(d, d+m);len_d = m;rep(i,0,k) cin>>f[i];sort(f, f+k);len_f = k;} else {rep(i,0,m) cin>>f[i];sort(f,f+m);len_f = m;rep(i,0,k) cin>>d[i];sort(d,d+k);len_d = k;}if (pos > 2 && dif[pos-1].val == dif[pos-2].val) {cout<<dif[pos-1].val<<endl;continue;}int sup = store[dif[pos-1].ind];int inf = store[dif[pos-1].ind - 1];int aim = inf + (sup - inf)/2;int minn = dif[pos-1].val;rep(i,0,len_d) {int commonA = d[i];if (commonA >= sup) break;int target = aim - commonA;
//            cout<<"d[i]:"<<d[i]<<" target:"<<target<<endl;auto it = upper_bound(f, f+len_f-1, target);
//            cout<<"it:"<<it<<endl;int commonB = *it;
//            cout<<"find:"<<commonB<<endl;int num = commonA + commonB;if (inf<num && num<sup)minn = min(minn, max(sup - num ,num - inf));if (it != f) {commonB = *(it-1);num = commonA + commonB;if (inf<num && num<sup)minn = min(minn, max(sup - num ,num - inf));}}/*if (d[0] + f[0] < store[0]) {aim = store[0];rep(i,0,len_d) {int commonA = d[i];if (commonA >= aim) break;int target = abs(aim - commonA);auto it = lower_bound(f, f+len_f-1, target-1);int commonB = *it;cout<<"commonA:"<<commonA<<" commonB:"<<commonB<<" target:"<<target<<endl;int num = commonA + commonB;if (num < store[0])minn = min(minn, store[0] - num);if (it != f) {commonB = *(it-1);num = commonA + commonB;if (num < store[0])minn = min(minn, store[0] - num);}}}aim = store[n-1];if (d[len_d-1] + f[len_f-1] > aim)rep(i,0,len_d) {int commonA = d[i];int target = abs(aim - commonA);auto it = upper_bound(f, f+len_f-1, target+1);int commonB = *it;int num = commonA + commonB;if (num > aim) {minn = min(minn, num - aim);}if(it == f) break;}*/cout<<max(minn, pos>=2? dif[pos-2].val : 0)<<endl;}return 0;
}

G. Rudolf and Subway

很好的图论使我小脑萎缩
边染色,求A->B最少经过几种颜色。其中相同颜色的边一定构成连通图。
机智如我并没有按照题解中加边的思路,而是采用合并点的方式,从颜色的维度处理。将相同颜色的边视为从同一个点出发(因为相同颜色内移动不会影响结果,只有移动到新的颜色上才会影响结果),从而将问题转化为最短路。采用bfs那么首先经过的颜色一定是最短路,从而可以作为优化的条件。
此外由于是边染色,所有可能一个点会被多个颜色所合并。如果在颜色A的合并点里走到了点v,同时v又连接B、C等颜色的边,虽然后续B、C颜色的合并也会重新遍历v的边,但是由于bfs的特性此时的遍历不会影响已经过的颜色A,也不会加入新的颜色(因为v涉及的所有颜色都在颜色A的合并点中加入到了队列),所以图中的每个点只需要访问一次,不需要重复访问。
没有这个优化会T 嘤嘤嘤

#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <time.h>
#include <set>
#include <map>
#include <queue>#define IOS     ios::sync_with_stdio(0);cin.tie(0);
#define mem(A,B) memset(A,B,sizeof(A));
#define rep(index,start,end) for(int index = start;index < end; index ++)
#define drep(index,start,end) for(int index = start;index >= end; index --)using namespace std;typedef long long ll;const int maxn = 2e5+5;struct node{int to;int color;
};queue<int> Q;
bool vis[maxn],visNode[maxn];
int dis[maxn];
set<int> colors;
set<int> colorSet[maxn];
vector<node> adj[maxn];
int main() {IOScout.tie(0);int t;cin>>t;while(t--) {for(auto it=colors.begin();it!=colors.end();it++){vis[*it] = false;colorSet[*it].clear();}colors.clear();int n,m;cin>>n>>m;rep(i,0,n+1) {adj[i].clear();visNode[i] = false;}rep(i,0,m) {int commonA,commonB,color;cin>>commonA>>commonB>>color;adj[commonA].push_back({commonB, color});adj[commonB].push_back({commonA, color});colorSet[color].insert(commonA);colorSet[color].insert(commonB);colors.insert(color);}int commonA,commonB;cin>>commonA>>commonB;if (commonA==commonB) {cout<<0<<endl;continue;}for(auto it=colors.begin();it!=colors.end();it++)dis[*it] = INT_MAX;visNode[commonA] = true;rep(i,0,adj[commonA].size()) {node edge = adj[commonA][i];if (!vis[edge.color]) {Q.push(edge.color);
//                cout<<"push color:"<<edge.color<<endl;dis[edge.color] = 1;vis[edge.color] = true;}}while(!Q.empty()) {int now = Q.front();
//            cout<<"color:"<<now<<" dis:"<<dis[now]<<endl;Q.pop();for(int v : colorSet[now]) {if (visNode[v]) continue;visNode[v] = true;int len = adj[v].size();rep(i,0,len) {node next = adj[v][i];int next_color = next.color;if (vis[next_color] || visNode[next.to]) continue;dis[next_color] = dis[now]+1;Q.push(next_color);vis[next_color] = true;}}}int ans = INT_MAX;rep(i,0,adj[commonB].size()) {node edge =adj[commonB][i];int des_color = edge.color;ans = min(ans, dis[des_color]);}cout<<ans<<endl;}return 0;
}

官方题解则是通过加边的方法传送门
请添加图片描述将染色边转化为一个新的染色节点连接到原有边的端点。可能这样画体现不出这个方法精妙之处。请添加图片描述点多了就能看出来,这样形成一个星形的连接,相同颜色的点之间移动都只需要经过两条边。仍然还是bfs,只不过由于边多加了,所以需要最终结果/2

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

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

相关文章

与Apollo共创生态:Apollo7周年大会自动驾驶生态利剑出鞘

前言 4月22日&#xff0c;百度Apollo在北京车展前夕举办了以“破晓•拥抱智变时刻”为主题的智能汽车产品发布会&#xff0c;围绕汽车智能化&#xff0c;发布了智驾、智舱、智图等全新升级的“驾舱图”系列产品。 1、7周年大会 自2013年百度开始布局自动驾驶&#xff0c;201…

Axure RP 9中文激活版:专业原型设计工具mac/win

Axure RP 9是一款由美国Axure Software Solution公司开发的专业原型设计工具。它凭借强大的交互功能和丰富的设计素材&#xff0c;为产品经理、UI设计师、交互设计师等用户提供了高效、便捷的原型设计体验。 Axure RP 9支持快速创建线框图、流程图、原型和规格说明文档&#xf…

c++中的链表list的模拟实现

拖更了半个月&#xff0c;我终于来填c的坑啦。上次我们说的vetcor不知道小伙伴还记得多少呢&#xff1f;今天我们要讲list的模拟实现。 目录 架构结点list表的结构 构造函数尾插push_back()尾删pop_back()计算个数&#xff1a;size()判断空empty()※迭代器问题普通迭代器迭代器…

vue2[黑马笔记]

vue基础 是什么—javascript框架 构建用户界面的前端框架 1.构建用户界面用vue往html页面中填充数据 2.框架现成的解决方案&#xff0c;遵守框架的规范去实现自己的业务功能学习vue 就是学习vue框架中规定的用法vue的指令组件&#xff08;对ul结构的复用&#xff09;&#x…

windows服务启动提示‘服务没有响应控制功能’(mysql启动报错)

在安装mysql的时候&#xff0c;在windows服务项启动 或 使用命令net start mysql 时启动是报错&#xff0c;提示 服务没有响应控制功能 发生原因&#xff1a; Windows10 x64 或 更高的操作系统&#xff0c;有些系统缺少一些组件 解决办法&#xff1a; 1、下载最新的 Microsoft …

CSS详解(一)

1、css工作中使用场景 美化网页&#xff08;文字样式、背景样式、边框样式、盒子模型、定位、动画、&#xff09;&#xff0c;布局页面&#xff08;flex布局、响应式布局、媒体查询&#xff09; 2、CSS 规则 通常由两个主要部分组成选择器和样式声明 2.1选择器 选择器指定了…

制作自己的YOLOv8数据集

制作自己的YOLO8数据集 前言 该数据集的格式参照于coco数据集结构✨ 步骤一&#xff1a;收集图像数据 从互联网上下载公开的数据集&#xff0c;也可以使用摄像头或其他设备自行采集图像&#xff0c;确保你的图像数据覆盖了你感兴趣的目标和场景 步骤二&#xff1a;安装Labe…

正点原子[第二期]ARM(I.MX6U)裸机篇学习笔记-1.2

前言&#xff1a; 本文是来自哔哩哔哩网站上视频“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”的学习笔记&#xff0c;在这里会记录下正点原子Linux ARM MX6ULL 开发板根据配套的哔哩哔哩学习视频所作的实验和笔记内容。本文大量的引用了正点原子哔哔哩网…

[论文笔记] EcomGPT:COT扩充数据的电商大模型

社区供稿 | EcomGPT:基于任务链数据的电商大模型(附魔搭推理实践) - 知乎 https://arxiv.org/pdf/2312.15696.pdf EcomInstruct指令数据集构建 数据集组成 COT方式构造垂域训练数据:把原本的垂域任务分解成了原子任务,构造了基于解决原子任务的数据。这样能用类似…

网页模版如何用

现在的网页模版已经得到了许多人的喜爱和使用。随着人们对互联网的需求不断增加&#xff0c;更多的公司和组织需要拥有自己的网站&#xff0c;以推广他们的品牌和服务。而网页模版为他们提供了一个简单而高效的方法来创建自己的网站。 网页模版是预先设计好的网站模板&#xff…

人工智能技术在教育中的潜力有多大

原文&#xff1a;人工智能技术在教育中的潜力有多大&#xff1f; - 知乎 作者&#xff1a;大全Prompt 链接&#xff1a;https://www.zhihu.com/question/637034129/answer/3346272227 来源&#xff1a;知乎 谢邀&#xff1a;在技术快速发展的今天&#xff0c;人工智能&#x…

炒股自动化:券商官方,散户可用,查询订单状态API如何用?

券商官方的接口&#xff0c;个人账户可申请&#xff0c;入金门槛低&#xff0c;接入文档完善&#xff0c;技术支持好的&#xff0c;经过我们筛选后&#xff0c;只有一家符合 会编程&#xff0c;有基础&#xff0c;只是需要API接口的朋友不用看这些&#xff0c;不会写程序的朋友…

【vue2】实现微信截图(复制图片)在项目内可粘贴

需求 后台管理在上传图片地方需要将复制的图片粘贴上传 一、添加事件 在原有上传组件的基础上添加 paste事件 二、方法 onPaste(e) {const items (e.clipboardData || window.clipboardData).items;let blob null;for (let i 0; i < items.length; i) {if (items[i].ty…

设计模式:单例、原型和生成器

在这篇文章中&#xff0c;我们将重点介绍其余的创建模式&#xff1a;Singleton&#xff0c;Builder和Prototype。 在我看来&#xff0c;这些模式不如工厂重要。然而&#xff0c;了解它们仍然很有用。我将提供UML描述&#xff0c;简单的java示例&#xff08;这样即使你不了解jav…

[linux网络编程]UDP协议和TCP协议的使用

目录 看以下内容前&#xff0c;你要先了解main函数带参数有什么用、 了解socket的相关函数接口 如果不了解socket的相关函数接口请先看我这篇文章 main函数带参数有什么用 UDP udp_server 1.生成socket文件描述符 2.填充sockaddr_in信息 3.bind 4.发&#xff08;收&…

渗透之sql注入练气篇

sql注入产生的原因&#xff1a; 由于程序过滤不严谨&#xff0c;导致用户有一些异常输入&#xff0c;最终触发数据库的查询。所以会出现sql注入这个问题。有些恶意的人就会利用这些信息导致数据库泄露。 注意&#xff1a;一般我们存在注入点我们会查询管理员的账号和密码&#…

如何30天快速掌握键盘盲打

失业后在家备考公务员&#xff0c;发现了自己不正确的打字方式&#xff0c;决定每天抽出一点时间练习打字。在抖音上看到一些高手的飞速盲打键盘后&#xff0c;觉得使用正确的指法打字是很必要的。 练习打字&#xff0c;掌握正确的键盘指法十分关键。 练习打字的第一步是找到…

ElasticSearch批处理

在刚才的新增当中&#xff0c;我们是一次新增一条数据。那么如果你将来的数据库里有数千上万的数据&#xff0c;你一次新增一个&#xff0c;那得多麻烦。所以我们还要学习一下批量导入功能。 也就是说批量的把数据库的数据写入索引库。那这里的需求是&#xff0c;首先利用mybat…

C++中布隆过滤器

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

【单链表专题】

单链表专题 1.引入2.链表2.1链表的关系2.2链表的结构 3.代码实现链表 1.引入 对于顺序表而言 中间/头部的插⼊删除&#xff0c;时间复杂度为O(N)增容需要申请新空间&#xff0c;拷⻉数据&#xff0c;释放旧空间。会有不小的消耗。增容⼀般是呈2倍的增⻓&#xff0c;势必会有⼀…