ICPC 2019-2020 North-Western Russia Regional Contest

A (codeforces.com)

这题在移动不被挡板挡住以及不超过边界的情况下,每次走的越多那么次数就越少

只要两个每次都走b-a步(已经是不被挡板挡住走的最多了),就不用考虑被挡板挡住的情况,只用单独考虑了,如果可以走b-a,就走b-a,不然就把剩下的走完,只要整除上取整即可

AC代码:

#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
int a,b,n;
void solve() {cin>>a>>b>>n;int d=b-a;int x=(n-b)/d+((n-b)%d!=0);int y=(n-a)/d+((n-a)%d!=0);cout<<x+y<<endl;
}
int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
//    cin>>t;while(t--) {solve();}return 0;
}

Problem - M - Codeforces

这题就是问有几个三元组(i,j,k)满足a[j]是a[i]和a[k]的平均数

做法是枚举j和k,然后看前面满足的i有几个

用unordered_map查找的平均时间复杂度是O(1),map查找的时间复杂度是O(logn)

AC代码:

#include<bits/stdc++.h>
#define endl '\n'
//#define int long long
using namespace std;
const int N=1010;
int a[N];
int n;
void solve() {cin>>n;unordered_map<int,int>mp;for(int i=1;i<=n;i++) cin>>a[i];int res=0;for(int j=1;j<n;j++){for(int k=j+1;k<=n;
k++){res+=mp[2*a[j]-a[k]];}mp[a[j]]++;}cout<<res<<endl;
}
int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--) {solve();}return 0;
}

Problem - I - Codeforces

法一:该题对于每一个柱子,以该柱子为顶点作金字塔,根据几何关系,底面是确定的,然后求最小的能包含所有小底面的大底面,然后根据几何关系确定顶点,由于顶点要求x,y,z是整数,所以大底面边长得是偶数,所以如果是奇数,就得加1

AC代码:

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
int n;
void solve() {cin>>n;int x1=2e9,x2=-2e9,y1=2e9,y2=-2e9;for(int i=0;i<n;i++){int x,y,h;cin>>x>>y>>h;x1=min(x1,x-h);x2=max(x2,x+h);y1=min(y1,y-h);y2=max(y2,y+h);}int h=max((x2-x1)/2+((x2-x1)%2!=0),(y2-y1)/2+((y2-y1)%2!=0));cout<<(x1+x2)/2<<' '<<(y1+y2)/2<<' '<<h<<endl;
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
//    cin>>t;while(t--) {solve();}return 0;
}

法二:

 一共四个面,然后每个面的朝向以及斜率都是固定的,我们只需要考虑对于一根柱子,我们分别让四个面往柱子靠近,刚好能够抵住,这样合成的金字塔是覆盖所有柱子的情况下最小的

就是刚好让柱子的顶点在这个面上,求出截距,然后取max(截距是在z轴上的截距)

然后两两相邻的面可以与z=0这个面进行联立,得到底面4个交点坐标,从而确定整个底面,如果底面边长为奇数,那么加1(确保顶点坐标为整数),从而确定顶点坐标

AC代码:

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
int n;
struct Point{
public:int x,y;Point(int x1,int y1):x(x1),y(y1){}
};
void solve() {cin>>n;int c1=-2e9,c2=-2e9,c3=-2e9,c4=-2e9;for(int i=0;i<n;i++){int x,y,h;cin>>x>>y>>h;//z=y+c1==>c1=z-yc1=max(c1,h-y);//z=x+c2==>c2=z-xc2=max(c2,h-x);//z=-y+c3==>c3=z+yc3=max(c3,h+y);//z=-x+c4==>c4=z+xc4=max(c4,h+x);}Point A(-c2,-c1),B(-c2,c3),C(c4,c3),D(c4,-c1);int h=max((D.x-A.x)/2+((D.x-A.x)%2!=0),(B.y-A.y)/2+((B.y-A.y)%2!=0));int x=(A.x+D.x)/2;int y=(C.y+D.y)/2;cout<<x<<' '<<y<<' '<<h<<endl;
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
//    cin>>t;while(t--) {solve();}return 0;
}

Problem - E - Codeforces

法一:

利用bfs一层一层搜,将加粗的所有点入队作为第一层,然后搜下一层,如果第一次搜到就更新距离加1,并且记录到该点为止一共有几个到它距离相同的加粗的点,把该点放入队列中,可以下一次继续拓展下一层,如果搜过了,那么看dist[u]是不是等于dist[v]+1,如果相等,那么可以把到点u距离相同的加粗的点的个数加到点v上

最后枚举每个点,只要有一个点满足到该点的距离相同的加粗的点的个数为m,那么就输出YES,如果一个点也不满足,那么就输出NO

AC代码:

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=2e5+10;
int dist[N];
int cnt[N];
int n,m;
vector<vector<int>>e(N);
void solve() {cin>>n>>m;for(int i=0;i<n-1;i++){int u,v;cin>>u>>v;e[u].push_back(v);e[v].push_back(u);}queue<int>q;for(int i=0;i<m;i++){int x;cin>>x;q.push(x);dist[x]=1;cnt[x]=1;}while(q.size()){int t=q.front();q.pop();for(auto v:e[t]){if(!dist[v]){dist[v]=dist[t]+1;cnt[v]+=cnt[t];q.push(v);}else if(dist[v]==dist[t]+1){cnt[v]+=cnt[t];}}}for(int i=1;i<=n;i++){if(cnt[i]==m){cout<<"YES"<<endl;cout<<i<<endl;return;}}cout<<"NO"<<endl;
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
//    cin>>t;while(t--) {solve();}return 0;
}

法二:

利用树的中心(有专门的模板)

先将那些不可能成为答案的点删掉(从叶子节点一直到加粗的点,将这些点标记,枚举到标记的点的时时候就跳过),这样所有叶子节点就都变成加粗的点了,然后求一遍树的中心,答案只可能在树的中心中(树的中心最多只有两个),因为树的中心到最远的点的距离最近,如果存在一个点满足到所有加粗的点(此时已经变成叶子节点了)的距离相等,那么它肯定是中心

找到中心之后,进行验证是否是答案,只要跑一遍BFS,判断它到所有加粗的点的距离是否相等即可

AC代码:

#include <bits/stdc++.h>
#include <cstdio>
#define endl '\n'
#define int long long
using namespace std;
const int N = 2e5 + 10;
int d1[N], d2[N];
int p1[N];
int up[N];
int du[N];//度数
int dist[N];
bool vis[N];
bool unused[N];
bool teams[N];
int n, m;
vector<vector<int>>e(N);
vector<int>team;
vector<int>zhongdian;
int dfs_d(int u, int fa) {d1[u] = 0; //d1[u]记录从u点向下走的最大长度d2[u] = 0; //d2[u]记录从u点向下走的次大长度for (auto v : e[u]) {if (v == fa || unused[v]) continue; //避免向上搜索int d = dfs_d(v, u) + 1; //从u经ver点往下走的最大长度//p1[u]记录从u点向下走的最长路径是从哪个点下去的if (d >= d1[u]) d2[u] = d1[u], d1[u] = d, p1[u] = v;else if (d > d2[u]) d2[u] = d;}return d1[u];//返回从u点往下走的最大长度
}
void dfs_u(int u, int fa) {for (auto v : e[u]) {if (v == fa || unused[v]) continue; //避免向上搜索//up[ver]记录从ver点向上走的最大长度if (p1[u] == v) up[v] = max(up[u], d2[u]) + 1;else up[v] = max(up[u], d1[u]) + 1;dfs_u(v, u); //深搜u的子节点ver}
}void solve() {cin >> n >> m;for (int i = 0; i < n - 1; i++) {int u, v;cin >> u >> v;e[u].push_back(v);e[v].push_back(u);//度数为1说明是叶子节点du[u]++;du[v]++;}for (int i = 0; i < m; i++) {int x;cin >> x;teams[x] = true; //标记一下teams里的点team.push_back(x);}//把那些没用的点都删掉,使得teams里的点全部成为叶子节点queue<int>q;for (int i = 1; i <= n; i++) {if (du[i] == 1 && !teams[i]) q.push(i);}while (q.size()) {int t = q.front();q.pop();unused[t] = true;for (auto v : e[t]) {if (--du[v] == 1 && !teams[v]) q.push(v);}}int start;//寻找起点,找一个没有被删除的点for (int i = 1; i <= n; i++) {if (!unused[i]) {start = i;break;}}//寻找中点dfs_d(start, -1);dfs_u(start, -1);int res = 2e9;for (int i = 1; i <= n; i++) {if (unused[i]) continue;res = min(res, max(d1[i], up[i]));}for (int i = 1; i <= n; i++) {if (unused[i]) continue;if (max(d1[i], up[i]) == res) zhongdian.push_back(i);}for (auto u : zhongdian) {for (int i = 1; i <= n; i ++) vis[i] = false;queue<int> q;q.push(u);dist[u] = 0;vis[u] = true;bool ok = true;while (q.size()) {int t = q.front();q.pop();for (auto v : e[t]) {if (vis[v] || unused[v]) continue;vis[v] = true;q.push(v);dist[v] = dist[t] + 1;}}for (int i = 1; i < (int)team.size(); i ++)if (dist[team[i - 1]] != dist[team[i]]) {ok = false;break;}if (ok) {cout << "YES" << endl;cout << u << endl;return;}}cout << "NO" << endl;
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t = 1;
//    cin>>t;while (t--) {solve();}return 0;
}

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

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

相关文章

微服务09-Sentinel的入门

文章目录 微服务中的雪崩现象解决办法&#xff1a;1. 超时处理2. 舱壁模式3. 熔断降级4.流量控制 Sentinel1.介绍2.使用操作3.限流规则4.实战&#xff1a;流量监控5.高级选项功能的使用1.关联模式2.链路模式3.总结 流控效果1.预热模式2.排队等待模式3.总结4.热点参数限流5.实战…

【业务功能篇 131】23种设计模式介绍

第一章 设计模式概述 1.1 代码质量好坏如何评价? 要想学习设计模式呢 我们就必须搞清楚设计模式到底在我们的编程过程中起到了怎样的作用,在编程世界中它处在一个什么样的位置,它到底是一种抽象的设计思想,还是一套具体的落地方案. 在学习设计模式之前呢 我们需要了解一下 代…

【数据结构C/C++】顺序与链式二叉树创建与前中后、层序遍历

文章目录 顺序存储结构二叉树链式存储结构二叉树刷题推荐408考研各数据结构C/C代码&#xff08;Continually updating&#xff09; 顺序存储结构二叉树 顺序存储结构的二叉树的特点在于&#xff0c;其使用数组存放二叉树中的每一个节点。 我们设定根节点的数组索引下标为n&…

MYSQL的日志管理

MySQL中有几种类型的日志记录&#xff0c;分别用于记录不同的操作和事件。以下是MySQL中常见的日志类型 错误日志 错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息。当数据…

linux后台运行java项目/ jar包:nohup 命令

1.提出问题 我们把一个 SpringBoot 工程导出为 jar 包&#xff0c;jar 包上传到阿里云 ECS 服务器上&#xff0c;使用 java -jar xxx-xxx.jar 命令启动这个 SpringBoot 程序。此时我们本地的 xshell 客户端必须一直开着&#xff0c;一旦 xshell 客户端关闭&#xff0c;java -j…

Jenkins对应java版本

官网地址&#xff1a;Java Support Policy 运行jenkins时,需要使用下列Java版本:

Jenkins安装多个jdk版本,并在项目中选择对应jdk版本

下载jdk版本&#xff1a;进入oracle官网下载官方jdk Java Downloads | Oracle 例&#xff1a;比如项目需要使用java8.341的版本&#xff0c;而jenkins用的是java11的版本&#xff0c;这里就需要下载多个jdk版本。进入下载网址&#xff0c;Java Archive Downloads - Java SE 8u…

MySQL数据库技术笔记(3)

概述 学习MySQL数据库技术其实只需要安装mysql服务器就可以使用了。只不过对于初学者来说直接操作dos窗口方式比较麻烦&#xff0c;命令不熟悉&#xff0c;导致经常写错。在真实的开发当中直接操作dos窗口效率比较慢&#xff0c;企业中也会经常使用一些mysql数据库支持的可视化…

学习记忆——数学篇——案例——代数——方程——一元二次方程

重点记忆法 a x 2 b x c 0 ax^2bxc0 ax2bxc0 整体可以由&#xff1a; 根&#xff08;多少&#xff0c;正负&#xff0c;区间&#xff09; ⟹ \Longrightarrow ⟹ △ △ △ ⟹ \Longrightarrow ⟹ 求根公式 x 1 , 2 x_{1,2} x1,2​ − b △ 2 a \frac{-b\sqrt{△}}{2a} 2…

Transformer模型 | Python实现TransformerCPI模型(pytorch)

文章目录 效果一览文章概述程序设计参考资料效果一览 文章概述 Python实现TransformerCPI模型(tensorflow) Dependencies: python 3.6 pytorch >= 1.2.0 numpy RDkit = 2019.03.3.0 pandas Gensim >=3.4.0 程序设计 import torch import numpy as np import random …

TensorFlow入门(十九、softmax算法处理分类问题)

softmax是什么? Sigmoid、Tanh、ReLU等激活函数,输出值只有两种(0、1,或-1、1或0、x),而实际现实生活中往往需要对某一问题进行多种分类。例如之前识别图片中模糊手写数字的例子,这个时候就需要使用softmax算法。 softmax的算法逻辑 如果判断输入属于某一个类的概率大于属于其…

线性代数 --- 矩阵的QR分解,A=QR

矩阵的QR分解&#xff0c;格拉姆施密特过程的矩阵表示 首先先简单的回顾一下Gram-Schmidt正交化过程的核心思想&#xff0c;如何把一组线性无关的向量构造成一组标准正交向量&#xff0c;即&#xff0c;如何把矩阵A变成矩阵Q的过程。 给定一组线性无关的向量a,b,c&#xff0c;我…

Hazelcast系列(三):hazelcast集成(服务器/客户端)

系列文章 Hazelcast系列(一)&#xff1a;初识hazelcast Hazelcast系列(二)&#xff1a;hazelcast集成&#xff08;嵌入式&#xff09; Hazelcast系列(三)&#xff1a;hazelcast集成&#xff08;服务器/客户端&#xff09; Hazelcast系列(四)&#xff1a;hazelcast管理中心 …

ubuntu下使用gcc编译c程序: “error: stray ‘\357’ in program“

现象&#xff1a; ubuntu下使用gcc编译c程序: “error: stray ‘\357’ in program“ 尝试查找原因&#xff1a;打开从windos直接粘贴c程序到ubuntu的c代码&#xff0c;发现多了 <200b>&#xff1a; 方案&#xff1a;尝试在vim编辑器删除&#xff0c;多出来的字符后编译…

长沙建筑模板生产厂家有哪些?

在湖南长沙地区&#xff0c;建筑施工企业寻找一家可信赖的建筑模板供应商是非常重要的。在长沙地区&#xff0c;有多家建筑模板生产厂家&#xff0c;其中值得一提的是能强优品木业&#xff0c;他们是长沙地区建筑模板生产的领先供应商之一。 能强优品木业位于广西贵港市&#x…

Linux 部署1Panel 现代化运维管理面板进行公网远程访问

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《速学数据结构》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透2.1 使用一键脚本安装命令 2.2向系统添加服务2.3 启动cpolar服务…

【Java】 DirectByteBuffer堆外内存回收

PhantomReference虚引用 在分析堆外内存回收之前&#xff0c;先了解下PhantomReference虚引用。 PhantomReference需要与ReferenceQueue引用队列结合使用&#xff0c;在GC进行垃圾回收的时候&#xff0c;如果发现一个对象只有虚引用在引用它&#xff0c;则认为该对象需要被回…

PyTorch 入门

一、说明 深度学习是机器学习的一个分支&#xff0c;其中编写的算法模仿人脑的功能。深度学习中最常用的库是 Tensorflow 和 PyTorch。由于有各种可用的深度学习框架&#xff0c;人们可能想知道何时使用 PyTorch。以下是人们更喜欢使用 Pytorch 来完成特定任务的原因。 Pytorch…

虹科分享 | 确保冻干工艺开发中精确测量和数据完整性的5步指南

虹科分享 | 确保冻干工艺开发中精确测量和数据完整性的5步指南 介绍 冻干周期的工艺开发在冻干中起着至关重要的作用&#xff0c;因为它可以优化关键工艺参数&#xff0c;以实现理想的产品质量和工艺一致性。优化冻干工艺还可以缩短运行时间&#xff0c;尽早发现关键错误&…

Unity头发飘动效果

Unity头发飘动 介绍动作做头发飘动头发骨骼绑定模拟物理组件 UnityChan插件下载UnityChan具体用法确定人物是否绑定好骨骼节点&#xff08;要做的部位比如头发等&#xff09;给人物添加SpringManager骨骼管理器给骨骼节点添加SpringBone这里给每个头发骨骼都添加上SpringBone。…