AtCoder Beginner Contest 362

🚀欢迎来到本文🚀
🍉个人简介:陈童学哦,彩笔ACMer一枚。
🏀所属专栏:Codeforces
本文用于记录回顾总结本彩笔的解题思路便于加深理解。

比赛题目地址:AtCoder Beginner Contest 362

📢📢📢传送门

  • A - Buy a Pen
    • 解题思路
    • AC代码
  • B - Right Triangle
    • 解题思路
    • AC代码
  • C - Sum = 0
    • 解题思路
    • AC代码
  • D - Shortest Path 3
    • 解题思路
    • AC代码
  • E - Count Arithmetic Subsequences
    • 解题思路
    • AC代码
  • F - Perfect Matching on a Tree
    • 解题思路
    • AC代码
  • G - Count Substring Query
    • 解题思路
    • AC代码

A - Buy a Pen

Problem Statement

Takahashi came to a store to buy a pen. Here, a red pen costs R R R yen, a green pen costs G G G yen, and a blue pen costs B B B yen.

Takahashi dislikes the color C C C. If C C C is Red, he cannot buy a red pen; if C C C is Green, he cannot buy a green pen; and if C C C is Blue, he cannot buy a blue pen.

Determine the minimum amount of money he needs to buy one pen.

在这里插入图片描述

解题思路

模拟即可。输出另外两只笔的最小值即可。

AC代码

#include<bits/stdc++.h>
#define look(x) cout << #x << " ==  " << x << "\n"
using namespace std;
using i64 = long long;
const int N = 2e3 + 10;
const int MOD1 = 1e9 + 7;
const int MOD2 = 998244353;
void solve(){int a,b,c;cin >> a >> b >> c;string s;cin >> s;if(s[0] == 'R'){cout << min(b,c);}else if(s[0] == 'G'){cout << min(a,c);}else{cout << min(a,b);}
}int main(){	ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1;
//	cin >> t;while(t --){solve();}return 0;

B - Right Triangle

Problem Statement

In the x y xy xy-plane, there are three points A ( x A , y A ) A(x_A, y_A) A(xA,yA), B ( x B , y B ) B(x_B, y_B) B(xB,yB), and C ( x C , y C ) C(x_C, y_C) C(xC,yC) that are not collinear. Determine whether the triangle A B C ABC ABC is a right triangle.

在这里插入图片描述

解题思路

判断是否存在任意两边平方和等于第三条边的平方和即可(直角三角形的判定条件)或判断向量叉积。

AC代码

#include<bits/stdc++.h>
#define look(x) cout << #x << " ==  " << x << "\n"
using namespace std;
using i64 = long long;
const int N = 2e3 + 10;
const int MOD1 = 1e9 + 7;
const int MOD2 = 998244353;
void solve(){int a1,b1,a2,b2,a3,b3;cin >> a1 >> b1;cin >> a2 >> b2;cin >> a3 >> b3;string ans;if(pow(a1 - a2,2) + pow(b1 - b2,2) + pow(a1 - a3,2) + pow(b1 - b3,2) == pow(a2 - a3,2) + pow(b2 - b3,2)){ans = "Yes";}else if(pow(a3 - a2,2) + pow(b3 - b2,2) + pow(a1 - a3,2) + pow(b1 - b3,2) == pow(a2 - a1,2) + pow(b2 - b1,2)){ans = "Yes"; }else if(pow(a1 - a2,2) + pow(b1 - b2,2) + pow(a2 - a3,2) + pow(b2 - b3,2) == pow(a1 - a3,2) + pow(b1 - b3,2)){ans = "Yes";}else{ans = "No";}cout << ans << "\n";
}int main(){	ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1;
//	cin >> t;while(t --){solve();}return 0;
}

C - Sum = 0

Problem Statement

You are given N N N pairs of integers ( L 1 , R 1 ) , ( L 2 , R 2 ) , … , ( L N , R N ) (L_1, R_1), (L_2, R_2), \ldots, (L_N, R_N) (L1,R1),(L2,R2),,(LN,RN).

Determine whether there exists a sequence of N N N integers X = ( X 1 , X 2 , … , X N ) X = (X_1, X_2, \ldots, X_N) X=(X1,X2,,XN) that satisfies the following conditions, and print one such sequence if it exists.

  • L i ≤ X i ≤ R i L_i \leq X_i \leq R_i LiXiRi for each i = 1 , 2 , … , N i = 1, 2, \ldots, N i=1,2,,N.
  • ∑ i = 1 N X i = 0 \displaystyle \sum_{i=1}^N X_i = 0 i=1NXi=0.

在这里插入图片描述

解题思路

首先我们先考虑什么情况下不存在这样的一个序列呢?
求所有区间的左边界值的总和 s u m 1 sum1 sum1,如果 s u m 1 > 0 sum1 > 0 sum1>0的话必然不存在这样的一个序列。
因为在每个区间都取最小值的情况下都只大于0的情况下无论怎么样取每个区间的值都只会大于等于 s u m 1 sum1 sum1
否则 s u m 1 < = 0 sum1 <= 0 sum1<=0的情况下肯定存在一个序列的总和为0。
然后我们就可以依次遍历每个区间让在这个区间的所取得那个数去动态变化保证总和为0。
我们开始可以设置一个 a n s ans ans数组依次取值区间得左边界 l [ i ] l[i] l[i],然后每次加 a n s [ i ] ans[i] ans[i]加上一个 m i n ( − s u m 1 , r [ i ] − l [ i ] ) min(-sum1,r[i] - l[i]) min(sum1,r[i]l[i])即可。

AC代码

#include<bits/stdc++.h>
#define look(x) cout << #x << " ==  " << x << "\n"
using namespace std;
using i64 = long long;
const int N = 2e5 + 10;
const int MOD1 = 1e9 + 7;
const int MOD2 = 998244353;
i64 l[N],r[N];
i64 ans[N];
i64 sum1 = 0,sum2 = 0;
void solve(){int n;cin >> n;for(int i = 1;i <= n;i ++){cin >> l[i] >> r[i];sum1 += l[i];sum2 += r[i];ans[i] = l[i];  //ans数组记录每个区间所取得数值}if(sum1 > 0 || sum2 < 0){cout << "No\n";return;}else{cout << "Yes\n";for(int i = 1;i <= n;i ++){//加上使得sum1靠近0得值(不能大于区间的差值也不需要大于sum1的绝对值)int t = min(-sum1,r[i] - l[i]);sum1 += t;ans[i] += t;if(sum1 == 0){break;}}}for(int i = 1;i <= n;i ++){cout << ans[i] << " ";}
}int main(){	ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1;
//	cin >> t;while(t --){solve();}return 0;
}

D - Shortest Path 3

Problem Statement

You are given a simple connected undirected graph with N N N vertices and M M M edges. Each vertex i ( 1 ≤ i ≤ N ) i\,(1\leq i \leq N) i(1iN) has a weight A i A_i Ai. Each edge j ( 1 ≤ j ≤ M ) j\,(1\leq j \leq M) j(1jM) connects vertices U j U_j Uj and V j V_j Vj bidirectionally and has a weight B j B_j Bj.

The weight of a path in this graph is defined as the sum of the weights of the vertices and edges that appear on the path.

For each i = 2 , 3 , … , N i=2,3,\dots,N i=2,3,,N, solve the following problem:

  • Find the minimum weight of a path from vertex 1 1 1 to vertex i i i.

在这里插入图片描述

解题思路

跑个 D i j k s t r a Dijkstra Dijkstra的堆优化即可,复杂度为 O ( n l o g n ) O(n logn) O(nlogn)

AC代码

#include<bits/stdc++.h>
#define look(x) cout << #x << " ==  " << x << "\n"
using namespace std;
using i64 = long long;
const int N = 2e5 + 10;
const int MOD1 = 1e9 + 7;
const int MOD2 = 998244353;
//存图,pair存与之相连的点和两点之间边的权值
vector<pair<int,int>> g[N];
//每个点的权值
int a[N];
//起点1到其他点的最小权值
i64 dis[N];
//判断该点是否跑过
bool st[N];
void solve(){int n,m;cin >> n >> m;for(int i = 1;i <= n;i ++){cin >> a[i];}for(int i = 1;i <= m;i ++){int u,v,w;cin >> u >> v >> w;g[u].push_back({v,w});g[v].push_back({u,w});}dis[1] = a[1];//优先队列,按权值小的优先来排序priority_queue<pair<i64,i64>,vector<pair<i64,i64>>,greater<pair<i64,i64>>> q;q.push({a[1],1});for(int i = 2;i <= n;i ++){dis[i] = 1e18;}//跑Dijkstrawhile(!q.empty()){auto [x,y] = q.top();q.pop();if(st[y]){continue;}st[y] = true;for(auto [k1,k2] : g[y]){//如果权值更小就更新if(dis[k1] > x + k2 + a[k1]){dis[k1] = x + k2 + a[k1];q.push({dis[k1],k1});}}}//输出每个点距离起点的最小权值for(int i = 2;i <= n;i ++){cout << dis[i] << " ";}		
}int main(){	ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1;
//	cin >> t;while(t --){solve();}return 0;
}

E - Count Arithmetic Subsequences

Problem Statement

You are given a sequence A = ( A 1 , A 2 , … , A N ) A = (A_1, A_2, \dots, A_N) A=(A1,A2,,AN) of length N N N. For each k = 1 , 2 , … , N k = 1, 2, \dots, N k=1,2,,N, find the number, modulo 998244353 998244353 998244353, of (not necessarily contiguous) subsequences of A A A of length k k k that are arithmetic sequences. Two subsequences are distinguished if they are taken from different positions, even if they are equal as sequences.

What is a subsequence? A subsequence of a sequence A A A is a sequence obtained by deleting zero or more elements from A A A and arranging the remaining elements without changing the order.

在这里插入图片描述

解题思路

要求所有长度为 1 到 N 1 到 N 1N的等差数列各有多少个。
首先我们可以发现N很小,所以其实我们考虑枚举所有的公差,然后考虑dp推出状态转移方程。
首先考虑第一个维度为 i i i代表第i个数,第二个维度 j j j代表第j个数,但是由于直接枚举出来的公差可能会重复且数值很大,所以我们需要排序去重然后二分求出公差的位置 x x x 代表这个公差。
所以第二个维度应该为 x x x,最后还需要一个维度 k k k来表示这个序列的长度。
最后的dp数组就可表示为这样 d p [ i ] [ k ] [ x ] dp[i][k][x] dp[i][k][x]

AC代码

#include<bits/stdc++.h>
#define look(x) cout << #x << " ==  " << x << "\n"
using namespace std;
using i64 = long long;
const int N = 2e5 + 10;
const int MOD1 = 1e9 + 7;
const int MOD2 = 998244353;
int a[100];
//dp数组
i64 dp[81][81][81 * 81];
i64 ans[100];
void solve(){int n;cin >> n;for(int i = 1;i <= n;i ++){cin >> a[i];}vector<int> f;//枚举所有的公差for(int i = 1;i <= n;i ++){for(int j = 1;j < i;j ++){f.push_back(a[i] - a[j]);}}//排序去重sort(f.begin(),f.end());f.erase(unique(f.begin(),f.end()),f.end());//i代表第i个数现在进行到for(int i = 1;i <= n;i ++){//j代表在i个数的情况下往前枚举公差for(int j = 1;j < i;j ++){//k代表序列长度for(int k = 1;k <= j;k ++){//二分在f中找出a[i]-a[j]公差的位置int x = lower_bound(f.begin(),f.end(),a[i] - a[j]) - f.begin() + 1;//长度为1就直接加1if(k + 1 == 2){dp[i][k + 1][x] ++;}else{//否则就加上没算第i个数是的dp,公差都是x,只不过没算第i个数时长度就是//算了第i个数时的k+1减去1也就是k了。dp[i][k + 1][x] += dp[j][k][x];}dp[i][k + 1][x] %= MOD2;}}}//将所有公差下长度为k的序列答案累加。for(int i = 1;i <= n;i ++){for(int j = 1;j <= f.size();j ++){for(int k = 1;k <= n;k ++){ans[k] += dp[i][k][j];ans[k] %= MOD2;}}}//长度为1的序列就是所有完整序列的大小cout << n << " ";for(int i = 2;i <= n;i ++){cout << ans[i] << " ";}}
int main(){	ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1;
//	cin >> t;while(t --){solve();}return 0;
}

F - Perfect Matching on a Tree

Problem Statement

You are given a tree T T T with N N N vertices. The vertices are numbered 1 1 1 to N N N, and the i i i-th edge ( 1 ≤ i ≤ N − 1 ) (1 \leq i \leq N-1) (1iN1) connects vertices u i u_i ui and v i v_i vi bidirectionally.

Using T T T, define a complete graph G G G with N N N vertices as follows:

  • The weight w ( x , y ) w(x,y) w(x,y) of the edge between vertices x x x and y y y in G G G is the shortest distance between vertices x x x and y y y in T T T.

Find one maximum weight maximum matching in G G G. That is, find a set of ⌊ N / 2 ⌋ \lfloor N/2 \rfloor N/2 pairs of vertices M = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x ⌊ N / 2 ⌋ , y ⌊ N / 2 ⌋ ) } M=\{(x_1,y_1),(x_2,y_2),\dots,(x_{\lfloor N/2 \rfloor},y_{\lfloor N/2 \rfloor})\} M={(x1,y1),(x2,y2),,(xN/2,yN/2)} such that each vertex 1 , 2 , … , N 1,2,\dots, N 1,2,,N appears in M M M at most once, and ∑ i = 1 ⌊ N / 2 ⌋ w ( x i , y i ) \displaystyle \sum_{i=1}^{\lfloor N/2 \rfloor} w(x_i,y_i) i=1N/2w(xi,yi) is maximized.

解题思路

待补 待补 待补

AC代码

G - Count Substring Query

Problem Statement

You are given a string S S S consisting of lowercase English letters.

You are also given Q Q Q queries to process sequentially. The i i i-th query is described as follows:

  • A string T i T_i Ti consisting of lowercase English letters is given. Print the number of substrings of S S S that equal T i T_i Ti. Two substrings are distinguished if they are taken from different positions, even if they are equal as strings.

在这里插入图片描述

解题思路

要找每个子串出现的次数,AC自动机。

AC代码

#include<bits/stdc++.h>
#define look(x) cout << #x << " ==  " << x << "\n"
using namespace std;
using i64 = long long;
const int N = 1e6 + 10;
const int MOD1 = 1e9 + 7;
const int MOD2 = 998244353;
int tire[N][26],cnt[N],idx;
int ne[N],q[N],f[N],id[N];
string s;
void insert1(string s){int p = 0;for(int i = 0;s[i];i ++){int u = s[i] - 'a';if(!tire[p][u]){tire[p][u] = ++ idx;}p = tire[p][u];f[p] ++;}
}
void insert2(int x){int p = 0;for(int i = 0;s[i];i ++){int u = s[i] - 'a';if(!tire[p][u]){tire[p][u] = ++ idx;}p = tire[p][u];}id[x] = p;
}
void build(){int hh = 0,tt = -1;for(int i = 0;i < 26;i ++){if(tire[0][i]){q[++ tt] = tire[0][i];}}while(hh <= tt){int k = q[hh ++];for(int i = 0;i < 26;i ++){int p = tire[k][i];if(!p){tire[k][i] = tire[ne[k]][i];}else{ne[p] = tire[ne[k]][i];q[++ tt] = p;}}}
}
void solve(){cin >> s;insert1(s);int n;cin >> n;for(int i = 1;i <= n;i ++){cin >> s;insert2(i);}build();for(int i = idx - 1;i >=0;i --){f[ne[q[i]]] += f[q[i]];}for(int i = 1;i <= n;i ++){cout << f[id[i]] << "\n";}
}int main(){	ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1;
//	cin >> t;while(t --){solve();}return 0;
}

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

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

相关文章

微服务实战系列之玩转Docker(五)

前言 在我们日常的工作生活中&#xff0c;经常听到的一句话&#xff1a;“是骡子是马拉出来遛遛”。目的是看一个人/物是不是名副其实。我们在使用docker时&#xff0c;也要看看它究竟是如何RUN起来的。当面试官问你的时候&#xff0c;可以如是回答&#xff0c;保你“一文通关…

OpenAI因限制举报人权利遭投诉,呼吁监管介入

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

在win10上通过WSL和docker安装Ubuntu子系统,并配置Ubuntu可成功使用宿主机GPU

本文主要记录win10系统上,通过WSL的Ubuntu系统以及Docker使用GPU的全部过程。 文章目录 1、 启用hyper-v2、 安装docker3、 安装WSL3.1 安装WSL23.1.1 检查是否安装了WSL23.1.1 安装和配置 WSL 23.2 安装Ubuntu 子系统3.3 检查并修改WSL版本4、docker配置ubuntu20.04 LTS5、下…

InfiniBand网络-赋能高性能计算的卓越引擎

InfiniBand&#xff1a;赋能高性能计算网络的卓越引擎 InfiniBand作为一种先进的内网计算平台&#xff0c;已成为驱动高性能计算&#xff08;HPC&#xff09;、人工智能&#xff08;AI&#xff09;以及超大规模云基础设施演进的核心力量&#xff0c;其展现出无可比拟的性能优势…

bs4模块使用(二)

遍历文档树 怎样从文档的一段内容找到另一段内容? html_doc """ <html><head><title>The Dormouses story</title></head><body> <p class"title"><b>The Dormouses story</b></p>&…

基于SpringBoot+Vue的财务管理系统(带1w+文档)

基于SpringBootVue的财务管理系统(带1w文档) 基于SpringBootVue的财务管理系统(带1w文档) 财务管理系统的开发运用java技术、springboot框架&#xff0c;MIS的总体思想&#xff0c;以及Mysql等技术的支持下共同完成了该系统的开发&#xff0c;实现了财务管理的信息化&#xff0…

ReLU-KAN:仅需要矩阵加法、点乘和ReLU*的新型Kolmogorov-Arnold网络

摘要 由于基函数&#xff08;B样条&#xff09;计算的复杂性&#xff0c;Kolmogorov-Arnold网络&#xff08;KAN&#xff09;在GPU上的并行计算能力受到限制。本文提出了一种新的ReLU-KAN实现方法&#xff0c;该方法继承了KAN的核心思想。通过采用ReLU&#xff08;修正线性单元…

运维团队如何高效监控容器化环境中的PID及其他关键指标

随着云计算和容器化技术的快速发展&#xff0c;越来越多的企业开始采用容器化技术来部署和管理应用程序。然而&#xff0c;容器化环境的复杂性和动态性给运维团队带来了前所未有的挑战。本文将从PID&#xff08;进程标识符&#xff09;监控入手&#xff0c;探讨运维团队如何高效…

【网络】socket和udp协议

socket 一、六个背景知识1、Q1&#xff1a;在进行网络通信时&#xff0c;是不是两台机器在进行通信&#xff1f;2、端口号3、端口号vs进程PID4、目的端口怎么跟客户端绑定的呢&#xff1f;也就是怎么通过目的端口去找到对应的进程的呢&#xff1f;5、我们的客户端&#xff0c;怎…

区间加减使得数组变成指定类型

这个问题要怎么去考虑呢&#xff0c;首先我们将两个数组做差得到相对大小&#xff0c;问题就变成了把我们构造的数组通过区间加一或者区间减一变成全部都是0的最小次数 这里就涉及到我们的一个技巧&#xff0c;我们需要把负数序列和正数序列分开处理&#xff0c;如何能得到最小…

【C++】一、Visual Studio 2017使用教程:内存窗口、预处理文件、obj文件,调试优化

文章目录 概述编译期&#xff08;Compile&#xff09;查看预处理后的文件查看obj文件开启编译器调试优化 链接期&#xff08;Linking&#xff09;报错信息概述自定义入口点 调试内存窗口值转16进制查看查看汇编代码 注意 概述 记录一下Cherno的vs配置下载地址 https://thecher…

Unity 调试死循环程序

如果游戏出现死循环如何调试呢。 测试脚本 我们来做一个测试。 首先写一个死循环代码&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;public class dead : MonoBehaviour {void Start(){while (true){int a 1;}}}Unity对象设…

Qt 4.8.7 + MSVC 中文乱码问题深入分析

此问题很常见&#xff0c;然而网上关于此问题的分析大多不够深刻&#xff0c;甚至有错误&#xff1b;加之Qt5又更改了一些编码策略&#xff0c;而很多文章并未提及版本问题&#xff0c;或是就算提了&#xff0c;读者也不重视。这些因素很容易让读者产生误导。今日我彻底研究透了…

html5——CSS背景属性设置

目录 背景颜色 background-color 背景图像 背景定位 背景样式简写 背景尺寸 ​编辑渐变属性 背景颜色 background-color 背景图像 background-image background-image:url(图片路径); 背景重复方式&#xff1a; background-repeat 属性&#xff1a; repeat&#…

Qt中在pro中实现一些宏定义

在pro文件中利用 DEFINES 定义一些宏定义供工程整体使用。&#xff08;和在cpp/h文件文件中定义使用有点类似&#xff09;可以利用pro的中的宏定义实现一些全局的判断 pro中实现 #自定义一个变量 DEFINES "PI\"3.1415926\"" #自定义宏 DEFINES "T…

Apache Flink 任务提交模式

Flink 任务提交模式 Flink可以基于多种模式部署&#xff1a;基于Standalone 部署模式&#xff0c;基于Yarn部署模式&#xff0c;基于Kubernetes部署模式以上不同集群部署模式下提交Flink任务会涉及申请资源&#xff0c;各角色交互过程&#xff0c;不同模式申请资源涉及到的角色…

2024信息创新与安全技术比赛规程及任务书

2024信息创新与安全技术比赛规程任务书 模块一&#xff1a;信创操作系统应用任务一&#xff1a;系统安装任务二&#xff1a;系统基本操作&#xff0c;以下操作都在Client-1进行。任务三&#xff1a;软件管理 模块二&#xff1a;办公软件技术应用任务一&#xff1a;文档编辑任务…

【栈和队列】算法题 ---- 力扣

通过前面栈和队列的学习&#xff0c;现在来看这些算法题目 一、有效的括号 本题让判断括号是否有效 第一眼看可能没一点思路&#xff0c;但仔细分析一下&#xff1b; 我们学习过栈数据结构&#xff0c;知道栈先进后出的原则&#xff0c;那我们就可以使用啊&#xff1b;把题目的…

MaxSite CMS v180 文件上传漏洞(CVE-2022-25411)

前言 CVE-2022-25411 是一个影响 Maxsite CMS v180 的远程代码执行漏洞。攻击者可以通过上传一个特制的 PHP 文件来利用这个漏洞&#xff0c;从而在受影响的系统上执行任意代码。 漏洞描述 该漏洞存在于 Maxsite CMS v180 的文件上传功能中。漏洞利用主要通过允许上传带有危…

嵌入式人工智能(10-基于树莓派4B的DS1302实时时钟RTC)

1、实时时钟&#xff08;Real Time Clock&#xff09; RTC&#xff0c;全称为实时时钟&#xff08;Real Time Clock&#xff09;&#xff0c;是一种能够提供实时时间信息的电子设备。RTC通常包括一个计时器和一个能够记录日期和时间的电池。它可以独立于主控芯片工作&#xff…