Codeforces Round 910 (Div. 2)(D~F)

1898D - Absolute Beauty 

        题意:给定长度为n的数组a和b,定义b数组的价值为\sum _{i = 1}^{n}|a_{i} - b_{i}|,现可以交换一次b数组中的任意两个元素,求b数组的价值最大值。

        思路:绝对值问题可以放在数轴上去解决。绝对值即为区间长度

观察上述三种情况,发现当且仅当第二种情况,即原本两段区间不重合的条件下,其b数组的价值才会增加,增加的值为他们两段区间相隔的距离乘2。手画一下后发现交换a、b不会对结果造成任何影响,因此本题转换为给定若干区间,求区间间隔最大。只需要记录一下一个区间的最小右端点和区间的最大左端点,然后他们之间的差就是最大区间间隔。

        

// Problem: D. Absolute Beauty
// Contest: Codeforces - Codeforces Round 910 (Div. 2)
// URL: https://codeforces.com/contest/1898/problem/D
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define x first
#define y second 
#define endl '\n'
const LL maxn = 4e05+7;
const LL N=2e05+10;
const LL mod=1e09+7;
typedef pair<int,int>pl;
priority_queue<LL , vector<LL>, greater<LL> >t;
priority_queue<LL> q;
LL gcd(LL a, LL b){return b > 0 ? gcd(b , a % b) : a;
}LL lcm(LL a , LL b){return a / gcd(a , b) * b;
}
int n , m;
int a[N] , b[N];
void init(int n){for(int i = 0 ; i <= n ; i ++){a[i] = 0;}
}
void solve() 
{cin >> n;pair<int,int>p[n + 1];for(int i = 1 ; i <= n ; i ++){cin >> a[i];}for(int i = 1 ; i <= n ; i ++){cin >> b[i];}LL ans = 0;int r_min = 1e9 , l_max = 0;for(int i = 1 ; i <= n ; i ++){if(a[i] > b[i])swap(a[i] , b[i]);r_min = min(r_min , b[i]);l_max = max(l_max , a[i]);ans += abs(b[i] - a[i]);}if(r_min < l_max){ans += 2 * (l_max - r_min);}cout << ans<<endl;
}            
int main() 
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cout.precision(10);int t=1;cin>>t;while(t--){solve();}return 0;
}

1898E - Sofia and Strings 

        题意:给定两个字符串S和T,现可以对S进行操作:

1、删除S中某个字母。

2、选中S中[L,R]范围内字符,使其按照字典序大小重新升序排列。

        要求若干次操作后S是否能等于T。

        思路:首先通过预处理将每个字符在S中的位置全部都找出来。对于操作2而言,我们可以每次固定范围为2,那么操作2就转化成了交换相邻字符(若前者字典序大于后者)。接下来我们从前往后逐个匹配T中的字符,对于T当中的每个字符,我们尽可能的去用操作2来实现匹配,因为操作2不会删除字母,这样会为之后的字符匹配提供帮助。对于字符T_{i}而言,假如说找到了S中S_{j} = T_{i} , 那么S中第 j 位以前的,比T_{i}小的字符在之后都是无法被找到的。因此T_{i}所在的位置必须在T_{i}之前,比它字典序大的字符的位置之后。因此每一轮需要记录一下当前字符在S中的最后匹配的位置。

        

// Problem: E. Sofia and Strings
// Contest: Codeforces - Codeforces Round 910 (Div. 2)
// URL: https://codeforces.com/contest/1898/problem/E
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define x first
#define y second 
#define endl '\n'
const LL maxn = 4e05+7;
const LL N=1e05+10;
const LL mod=1e09+7;
typedef pair<int,int>pl;
priority_queue<LL , vector<LL>, greater<LL> >t;
priority_queue<LL> q;
LL gcd(LL a, LL b){return b > 0 ? gcd(b , a % b) : a;
}LL lcm(LL a , LL b){return a / gcd(a , b) * b;
}
int n , m;
int a[N];
void init(int n){for(int i = 0 ; i <= n ; i ++){a[i] = 0;}
}
void solve() 
{cin >> n >> m;string s , t;cin >> s >> t;vector<int>pos[26];for(int i = 0 ; i < n ; i ++){pos[s[i] - 'a'].pb(i);}vector<int>max_id(26 , -1);for(int i = 0 ; i < m ; i ++){int op = t[i] - 'a';int maxx = -1;for(int i = op ; i < 26 ; i ++){maxx = max(maxx , max_id[i]);}auto it = upper_bound(pos[op].begin() , pos[op].end() , maxx);if(it == pos[op].end()){cout <<"NO\n";return;}max_id[op] = *it;}cout <<"YES\n";
}            
int main() 
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cout.precision(10);int t=1;cin>>t;while(t--){solve();}return 0;
}

1898F - Vova Escapes the Matrix 

        题意:迷宫问题,给定一个迷宫和一个起点,迷宫分为空格子和有遮挡物的格子。若从起点顺着空格子走到边缘则能够走出,接下来迷宫分为三种类型:

1、无法被走出。

2、只有一个出口能走出。

3、有两个及以上出口能走出。

接下来可以选择堵住迷宫的一些格子,但是要求堵住以后的迷宫不改变其类型,求最多能堵住多少格子。

        思路:对于类型1,将迷宫中所有空格子全部堵住即可。对于类型2而言,将迷宫起点到出口最短路留下,其余全部堵住即可。最短路可以跑一边BFS求得。而对于类型3,需要保留两个出口,其余的全部都填满。即两个出口到起点的最短路保留,其余全部填满,但是需要注意的是可能两个出口到起点的最短路有重复点,需要特别处理。

对于起点到任意一点的最短路我们可以直接一遍BFS求得,但是如何求起点到两个出口的最短路,我们可以通过逆向思维,从每个终点出发开始BFS,然后任意一个空格子可以被走过最多两次,这样能保证有两个终点走到该点上。因为是BFS,所以最先走到某个格子的两个终点必然是最短的,然后再记录一下终点到该格子的距离。最终求答案的过程我们可以遍历每一个空格子,然后假设起点到这个格子是两个最短路的重合段,用起点到该格子的距离加上两个终点到该格子的距离就是两个最短路的非重复的格子数。最后用总空格子数减去最小的非重复格子数就是答案。

        

// Problem: F. Vova Escapes the Matrix
// Contest: Codeforces - Codeforces Round 910 (Div. 2)
// URL: https://codeforces.com/contest/1898/problem/F
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define x first
#define y second 
#define endl '\n'
const LL maxn = 4e05+7;
const LL N=1e05+10;
const LL mod=1e09+7;
typedef pair<int,int>pl;
priority_queue<LL , vector<LL>, greater<LL> >t;
priority_queue<LL> q;
LL gcd(LL a, LL b){return b > 0 ? gcd(b , a % b) : a;
}LL lcm(LL a , LL b){return a / gcd(a , b) * b;
}
int n , m;
int a[N];
void init(int n){for(int i = 0 ; i <= n ; i ++){a[i] = 0;}
}
int tx[4] = {0 , 1 , 0 , -1};
int ty[4] = {1 , 0 , -1 , 0};
struct Node{int x , y;int stx , sty;int d;
};
void solve() 
{cin >> n >> m;string str[n + 5];queue<Node>q;//存放终点for(int i = 0 ; i < n ; i ++){cin >> str[i];}int sx = -1, sy = -1;for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (str[i][j] == 'V') {sx = i, sy = j;}}}vector<vector<vector<Node> > >mp(n, vector<vector<Node>>(m));auto check = [&] (int x , int y){return x >= 0 && x < n && y >= 0 && y < m && str[x][y] != '#';};auto add = [&](int x , int y){if(check(x , y)){q.push({x , y , x , y , 0});	mp[x][y].pb({x , y , x , y , 0});}};for(int i = 0 ; i < n ; i ++){add(i , 0);add(i , m - 1);}for(int i = 0 ; i < m ;i ++){add(0 , i);add(n - 1 , i);}while(!q.empty()){auto tmp = q.front();q.pop();for(int i = 0 ; i < 4; i ++){int nx = tmp.x + tx[i];int ny = tmp.y + ty[i];if(check(nx , ny)){if(mp[nx][ny].size() == 0 || (mp[nx][ny].size() == 1 && (tmp.stx != mp[nx][ny][0].stx || tmp.sty != mp[nx][ny][0].sty))){mp[nx][ny].pb({nx , ny , tmp.stx , tmp.sty , tmp.d + 1});q.push({nx , ny , tmp.stx , tmp.sty , tmp.d + 1});}}}}int ans = 0;for(int i = 0 ; i < n ; i ++){for(int j = 0 ; j < m ; j ++){if(str[i][j] == '.'){ans++;//空格子数量}}}if(mp[sx][sy].size() == 0){//无终点到达cout << ans << endl;}else if(mp[sx][sy].size() == 1){//只有1个终点能到达cout << ans - mp[sx][sy][0].d<<endl;}else{int vis[n][m];memset(vis , 0 , sizeof vis);queue<array<int,3>>q;int mi = 1e9;q.push({sx , sy , 0});vis[sx][sy] = 1;if(mp[sx][sy].size() == 2){mi =  mp[sx][sy][0].d + mp[sx][sy][1].d;}while(!q.empty()){auto tmp = q.front();q.pop();for(int i = 0 ; i < 4 ; i ++){int nx = tmp[0] + tx[i];int ny = tmp[1] + ty[i];if(check(nx , ny) && !vis[nx][ny]){if(mp[nx][ny].size() == 2){mi = min(mi , mp[nx][ny][0].d + mp[nx][ny][1].d + tmp[2] + 1);}q.push({nx , ny , tmp[2] + 1});vis[nx][ny] = 1;}}}cout << ans - mi << endl;}
}            
int main() 
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cout.precision(10);int t=1;cin>>t;while(t--){solve();}return 0;
}

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

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

相关文章

计算机毕业设计选题推荐-点餐微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

【c++随笔13】多态

【c随笔13】多态 多态性&#xff08;Polymorphism&#xff09;在面向对象编程中是一个重要概念&#xff0c;它允许以统一的方式处理不同类型的对象&#xff0c;并在运行时动态确定实际执行的方法或函数。一、什么是多态性&#xff1f;1、关键概念&#xff1a;C的多态性2、多态定…

SpringCloud微服务注册中心:Nacos介绍,微服务注册,Ribbon通信,Ribbon负载均衡,Nacos配置管理详细介绍

微服务注册中心 注册中心可以说是微服务架构中的”通讯录“&#xff0c;它记录了服务和服务地址的映射关系。在分布式架构中&#xff0c;服务会注册到这里&#xff0c;当服务需要调用其它服务时&#xff0c;就这里找到服务的地址&#xff0c;进行调用。 微服务注册中心 服务注…

OpenGL_Learn13(材质)

1. 材质 cube.vs #version 330 core layout (location 0) in vec3 aPos; layout (location 0 ) in vec3 aNormal;out vec3 FragPos; out vec3 Normal;uniform mat4 model; uniform mat4 view; uniform mat4 projection;void main() {FragPosvec3(model*vec4(aPos,1.0));Norma…

从零开始:Rust环境搭建指南

大家好&#xff01;我是lincyang。 今天&#xff0c;我们将一起探讨如何从零开始搭建Rust开发环境。 Rust环境搭建概览 Rust是一种系统编程语言&#xff0c;以其安全性、并发性和性能闻名。搭建Rust环境是学习和使用这一语言的第一步。 第一步&#xff1a;安装Rust Rust的…

3-docker安装centos7

CentOS7.9下安装完成docker后&#xff0c;后续我们可以在其上安装centos7系统。具体操作如下&#xff1a; 1.以root用户登录CentOS7.9服务器&#xff0c;拉取centos7 images 命令&#xff1a; docker pull centos:centos7 2.加载centos7 images并登录验证 命令&#xff1a;…

Activiti7工作流

文章目录 一、工作流介绍1.1 概念1.2 适用行业1.3 应用领域1.4 传统实现方式1.5 什么是工作流引擎 二、什么是Activiti7&#xff1f;2.1 概述2.2 Activiti7内部核心机制2.3 BPMN2.4 Activiti如何使用2.4.1 整合Activiti2.4.2 业务流程建模2.4.3 部署业务流程2.4.4 启动流程实例…

WPF中行为与触发器的概念及用法

完全来源于十月的寒流&#xff0c;感谢大佬讲解 一、行为 (Behaviors) behaviors的简单测试 <Window x:Class"Test_05.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winf…

DevToys:开发者的多功能瑞士军刀,让编程更高效!

DevToys&#xff1a;开发者的多功能瑞士军刀&#xff0c;让编程更高效&#xff01; DevToys 是一款专为开发者设计的实用工具&#xff0c;它能够帮助用户完成日常的开发任务&#xff0c;如格式化 JSON、比较文本和测试正则表达式&#xff08;RegExp&#xff09;。它的优势在于…

Selenium UI 自动化

一、Selenium 自动化 1、什么是Selenium&#xff1f; Selenium是web应用中基于UI的自动化测试框架。 2、Selenium的特点&#xff1f; 支持多平台、多浏览器、多语言。 3、自动化工作原理&#xff1f; 通过上图&#xff0c;我们可以注意到3个角色&#xff0c;下面具体讲解一…

VBA之Word应用:文档(Document)的书签

《VBA之Word应用》&#xff08;版权10178982&#xff09;&#xff0c;是我推出第八套教程&#xff0c;教程是专门讲解VBA在Word中的应用&#xff0c;围绕“面向对象编程”讲解&#xff0c;首先让大家认识Word中VBA的对象&#xff0c;以及对象的属性、方法&#xff0c;然后通过实…

数据结构之链表练习与习题详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.习题解…

CICD 持续集成与持续交付——git

git使用 [rootcicd1 ~]# yum install -y git[rootcicd1 ~]# mkdir demo[rootcicd1 ~]# cd demo/ 初始化版本库 [rootcicd1 demo]# git init 查看状态 [rootcicd1 demo]# git status[rootcicd1 demo]# git status -s #简化输出 [rootcicd1 demo]# echo test > README.md[roo…

python自动化标注工具+自定义目标P图替换+深度学习大模型(代码+教程+告别手动标注)

省流建议 本文针对以下需求&#xff1a; 想自动化标注一些目标不再想使用yolo想在目标检测/语意分割有所建树计算机视觉项目想玩一玩大模型了解自动化工具了解最前沿模型自定义目标P图替换… 确定好需求&#xff0c;那么我们发车&#xff01; 实现功能与结果 该模型将首先…

6 Redis的慢查询配置原理

1、redis的命令执行流程 redis的慢查询只针对步骤3 默认情况下&#xff0c;慢查询的阈值是10ms

基于PHP+MySql的酒店信息管理系统的设计与实现

一、系统开发环境 运行环境&#xff1a;phpstudy或者wampserver&#xff0c; 开发工具&#xff1a;vscodephpstorm 数据库&#xff1a;mysql 二、酒店管理系统功能 1.前台功能&#xff1a; 首页客房推荐&#xff0c;周边特色介绍 酒店在线预订 订单查询&#xff0c;可以…

C++各种字符转换

C各种字符转换 一.如何将char数组转化为string类型二. string转char数组&#xff1a;参考 一.如何将char数组转化为string类型 在C中&#xff0c;可以使用string的构造函数或者赋值操作符来将char数组转换为string类型。 方法1&#xff1a;使用string的构造函数 const char* c…

【Web】Ctfshow SSTI刷题记录1

目录 ①web361 362-无过滤 ②web363-过滤单双引号 ③web364-过滤单双引号和args ④web365-过滤中括号[]、单双引号、args ⑤web366-过滤单双引号、args、中括号[]、下划线 ⑦web367-过滤单双引号、args、中括号[]、下划线、os ⑧web368-过滤单双引号、args、中括号[]、下…

原理Redis-动态字符串SDS

动态字符串SDS Redis中保存的Key是字符串&#xff0c;value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串&#xff0c;因为C语言字符串存在很多问题&#xff1a; 获取字符串长度的需要通过运算非二进制安全…

qt-C++笔记之两个窗口ui的交互

qt-C笔记之两个窗口ui的交互 code review! 文章目录 qt-C笔记之两个窗口ui的交互0.运行1.文件结构2.先创建widget项目&#xff0c;搞一个窗口ui出来3.项目添加第二个widget窗口出来4.补充代码4.1.qt_widget_interaction.pro4.2.main.cpp4.3.widget.h4.4.widget.cpp4.5.second…