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.mzph.cn/news/100954.shtml

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

相关文章

2023年陕西省安全员B证证考试题库及陕西省安全员B证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年陕西省安全员B证证考试题库及陕西省安全员B证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大…

ArcGIS/GeoScene脚本:基于粒子群优化的支持向量机分类模型

参数输入 输出 栅格 预测为负类的概率 预测为正类的概率 二值化结果 评估结果 ROC曲线

【2023.10版本】linux安装cuda和cudnn【已经解决】

别再百度了&#xff0c;都是错&#xff0c;都是版本不对的回答&#xff0c;官网教程才是解决王道。 cuda: 1. Introduction — cuda-installation-guide-linux 12.2 documentation (nvidia.com) cudnn Installation Guide - NVIDIA Docs 有哪些方法&#xff0c;上面说的非…

PageHelper详解

这里有两个参数&#xff0c;分别为&#xff1a;page1&#xff0c;rows20。默认请求第一页&#xff0c;每页显示20条数据 先PageHelper.startPage(1, 10)开始分页&#xff0c;再selectlist查询数据库的时候会自动加上limit 1&#xff0c;10。 得到这样的结果&#xff1a;查询结…

kepler.gl 笔记:Layer

Point S2Layer Icon Line Cluster Polygon 一个路径型的GeoJSON图层可以显示诸如行程路线或等值线的数据。轮廓的颜色可以使用数值字段进行设置。 一个多边形型的GeoJSON图层本质上是一种区域填充图层&#xff0c;最适合用于呈现地理围栏。填充颜色或高度可以使用数值字…

LLVM(5)ORC实例分析

ORC实例总结 总结 因为API茫茫多&#xff0c;逻辑上的一些概念需要搞清&#xff0c;编码时会容易很多。JIT的运行实体使用LLVMOrcCreateLLJIT可以创建出来&#xff0c;逻辑上的JIT实例。JIT实例需要加入运行库&#xff08;依赖库&#xff09;和用户定义的context&#xff08;…

多线程并发篇---第四篇

系列文章目录 文章目录 系列文章目录一、Java中synchronized 和 ReentrantLock 有什么不同?二、有三个线程T1,T2,T3,如何保证顺序执行?三、SynchronizedMap和ConcurrentHashMap有什么区别?一、Java中synchronized 和 ReentrantLock 有什么不同? 相似点: 这两种同步方式有…

Qt 关于mouseTracking鼠标追踪和tabletTracking平板追踪的几点官方说明

mouseTracking属性用于保存是否启用鼠标跟踪&#xff0c;缺省情况是不启用的。 没启用的情况下&#xff0c;对应部件只接收在鼠标移动同时至少一个鼠标按键按下时的鼠标移动事件。 启用鼠标跟踪的情况下&#xff0c;任何鼠标移动事件部件都会接收。 部件方法hasMouseTrackin…

设计模式 - 状态模式

目录 一. 前言 二. 实现 一. 前言 状态模式&#xff08;State Pattern&#xff09;&#xff1a;它主要用来解决对象在多种状态转换时&#xff0c;需要对外输出不同的行为的问题。状态和行为是一一对应的&#xff0c;状态之间可以相互转换。当一个对象的内在状态改变时&#x…

点击、拖曳,15分钟搞定BI零售数据分析

早几年做数据分析还很依赖IT&#xff0c;过程复杂、耗时长、灵活性差&#xff0c;但这几年随着BI智能数据分析技术的成长&#xff0c;零售数据分析发生了翻天覆地的变化&#xff0c;其中最直观的一点就是&#xff1a;点击、拖曳&#xff0c;15分钟内就能搞定BI零售数据分析。 …

批量给每一段文字 段落加上符号

批量给每一段文字 段落加上符号 例如 要给下面的内容统一加上[xxxxxxxx] 查找替换–>查找内容 &#xff1a;输入前面统一的标识 替换为&#xff1a;–>特殊格式–>查找内容–>全部替换 先在前面加符号 在后面加符号&#xff1a; 最后效果&#xff1a;

QTableWidget 表格增删数据

QTableWidgetQTableWidgetQTableWidget部分使用方法&#xff0c;如在表格中插入或删除一行数据以及清空表格数据等。在添加数据时&#xff0c;设置了条件判断如正则表达式&#xff0c;若用户输入的数据不合法&#xff0c;则添加失败并提示用户错误的地方&#xff0c;便于用户修…

rust模式

一、模式是什么 模式是Rust中特殊的语法&#xff0c;它用来匹配值 二、模式的使用场景 &#xff08;一&#xff09;match match的每个分支箭头左边部分就是模式。 match VALUE {PATTERN > EXPRESSION,PATTERN > EXPRESSION,PATTERN > EXPRESSION, }例子 match x …

3.3 使用广播信道的数据链路层

思维导图&#xff1a; 3.3.1 局域网的数据链路层 ### 3.3 使用广播信道的数据链路层 #### 简介 - 广播信道支持一对多通信。 - 局域网技术在20世纪70年代末兴起&#xff0c;现在在计算机网络中占有主导地位。 #### 3.3.1 局域网的数据链路层 **局域网的特点&#xff1a;** 1…

9-AJAX-上-原理详解

一、定义 1、什么是Ajax Ajax&#xff1a;即异步 JavaScript 和XML。Ajax是一种用于创建快速动态网页的技术。通过在后台与进行少量数据交换&#xff0c;Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下&#xff0c;对网页的某部分进行更新。而传统的…

储存数据文本json的读写

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、json文本介绍二、json文本的应用三、json文本的操作1、环境配置2、写入文件3、读取文件4、文件格式解析注意的点参考链接前言 认知有限,望大家…

FairGuard游戏加固无缝兼容 Android 14 正式版

北京时间10月4日&#xff0c;谷歌公司在“Made by Google 2023”硬件发布会上公开了新版安卓操作系统—— Android 14 正式版。 为保证产品的加固效果并提供更优质的服务&#xff0c;FairGuard游戏加固团队第一时间组织人员进行了相关测试。 据测试&#xff0c;FairGuard游戏…

架构师选择题--计算机网络

架构师选择题--计算机网络 22年考题21年考题20年考题19年真题2017考题 22年考题 d http:80 https:httpssl &#xff1a;443 b b pop3是邮件接收协议&#xff1a;110 SMTP是邮件发送协议&#xff1a;25 http:80 A 网络隔离&#xff1a;防火墙&#xff08;逻辑&#xff09;&…

聊聊JDK19特性之虚拟线程 | 京东云技术团队

1.前言 在读《深入理解JVM虚拟机》这本书前两章的时候整理了JDK从1.0到最新版本发展史&#xff0c;其中记录了JDK这么多年来演进过程中的一些趣闻及引人注目的一些特性&#xff0c;在调研JDK19新增特性的时候了解到了虚拟线程这个概念&#xff0c;于是对虚拟线程进行学习整理内…

APK大小缩小65%,内存减少70%:如何优化Android App

APK大小缩小65&#xff05;&#xff0c;内存减少70&#xff05;&#xff1a;如何优化Android App 我们一直在努力为我们的Android应用程序构建MVP产品。在开发MVP产品后&#xff0c;我们发现需要进行应用程序优化以提高性能。经过分析&#xff0c;我们发现了以下可以改进的应用…