ICPC 2019-2020 North-Western Russia Regional Contest

news2024/11/15 10:50:40

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-y
        c1=max(c1,h-y);
        //z=x+c2==>c2=z-x
        c2=max(c2,h-x);
        //z=-y+c3==>c3=z+y
        c3=max(c3,h+y);
        //z=-x+c4==>c4=z+x
        c4=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.coloradmin.cn/o/1080424.html

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

相关文章

算法通过村第十三关-术数|黄金笔记|数论问题

文章目录 前言辗转相除法素数和合数埃氏筛选法丑数问题总结 前言 提示&#xff1a;难过的人伤心的人、在生活里面对困境的人、即将抑郁的人、从外面很难看出异样&#xff0c;人的心里却可能有一些裂痕。只是人不会再表面裂开。 --栾颖新《那个苹果也很好》 数论是一个很重要的学…

Stable diffusion 用DeOldify给黑白照片、视频上色

老照片常常因为当时的技术限制而只有黑白版本。然而现代的 AI 技术,如 DeOldify,可以让这些照片重现色彩。 本教程将详细介绍如何使用 DeOldify 来给老照片上色。. 之前介绍过基于虚拟环境的 基于DeOldify的给黑白照片、视频上色,本次介绍对于新手比较友好的在Stable diff…

2023年中国非血管介入手术无源耗材发展现状、竞争格局及行业市场规模[图]

非血管介入手术是指通过人体自然腔道或通过人体的小切口接近病灶而无需进入血管系统的微创手术&#xff0c;内窥镜、有源医疗器械及无源耗材则是该手术中最常用的医疗器械。非血管介入手术无源耗材主要包括导丝、球囊导管、取石网篮、封堵导管及鞘管。 非血管介入手术无源耗材…

LeetCode【739】每日温度

题目&#xff1a; 思路&#xff1a; https://www.bilibili.com/video/BV1PJ411H7P7/?spm_id_from333.337.search-card.all.click&vd_source2f682a60feabf0f730ad09e0f980ce83 单调栈 思考&#xff1a; 解决栈类问题&#xff0c;思考入栈&#xff0c;出栈条件&#xff1b;…

vue设置页面超时15分钟自动退出登录

需求&#xff1a;用户登录后&#xff0c;如果长时间未操作页面这个时候需要自动退出登录回到登录页面。 注意点&#xff1a;这里我们如果把超时的时间放到浏览器里面存储&#xff0c;我们要放到本地存储里面localStorage里面 Vue设置长时间未操作登录以后自动到期返回登录页 …

重生奇迹MU玛雅宝石的获取方法

在打斗游戏中重生奇迹MU游戏最好玩&#xff0c;并且游戏里面有很多的宝石&#xff0c;比如玛雅宝石、灵魂宝石以及创造宝石等等&#xff0c;这些宝石的作用非常强大&#xff0c;玩家必须要懂得如何利用这些宝石。 那么是否了解玛雅宝石呢&#xff0c;玛雅宝石应该算是最经典的…

为什么选择虚拟展会展览?了解虚拟展会展览的应用领域

引言&#xff1a; 相较于传统的实体展览&#xff0c;虚拟展会展览具有吸引力和便捷性&#xff0c;能够在全球范围内进行宣传活动。这种创新形式不仅能够降低成本、扩大受众范围&#xff0c;还能够提供没有过的互动性和数据分析。 一&#xff0e;虚拟展会展览简介 虚拟展会展览…

TikTok变现的5个高效策略:打造成功创作者之路

短视频平台TikTok已经成为全球范围内最受欢迎的社交媒体之一&#xff0c;吸引了数亿用户。对于创作者而言&#xff0c;TikTok不仅是一个分享创意和娱乐的平台&#xff0c;还是一个潜在的收入来源。本文Nox聚星将和大家探讨TikTok的变现策略&#xff0c;揭示其中的关键秘诀和策略…

京东数据平台:2023年京东营养保健品市场销售数据分析

随着十一长假结束&#xff0c;市场端也开始了一系列的消费数据回顾和复盘。从现有数据表现来看&#xff0c;营养保健品市场的增长备受关注。 近日&#xff0c;京东消费及产业发展研究院与《经济日报》联合整合了相关数据。数据显示&#xff0c;2023年中秋福利采购季期间&#…

class类实现Serializable接口生成serialVersionUID

前言 我在class类实现了Serializable接口&#xff0c;发现把鼠标放在这个类名上&#xff0c;然后键盘输入altenter键没有生成serialVersionUID的提示 解决 找到Editor下边的Inspections&#xff0c;然后搜索UID&#xff0c;把如下截图中的勾选即可 效果 鼠标光标放在类名上&am…

C/C++之自定义类型(结构体,位段,联合体,枚举)详解

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

使用 KubeSkoop exporter 监测和定位容器网络抖动问题

作者&#xff1a;遐宇、溪恒 本文是 8 月 17 日直播的文字稿整理&#xff0c;文末可观看直播回放。除去文章内容外&#xff0c;还包括针对实际网络问题的实战环节。 容器网络抖动问题发生频率低&#xff0c;时间短&#xff0c;是网络问题中最难定位和解决的问题之一。 不仅如…

Java基于SpringBoot的学生就业管理信息系统

文章目录 1. 简介2. 技术栈3. 总体设计4 系统设计4.1前台功能模块4.2后台功能模块4.2.1管理员功能 六 源码咨询 1. 简介 Java基于SpringBoot的学生就业管理信息系统&#xff0c;本次设计任务是要设计一个就业信息管理系统&#xff0c;通过这个系统能够满足就业信息管理功能。系…

【接口测试】如何在 Eolink Apilkit 中使用 cookie ?

什么是 Cookie &#xff1f; Cookie是一种在网站之间传递的小型文本文件&#xff0c;用于存储用户的个人信息和偏好设置。当您访问一个网站时&#xff0c;网站会将Cookie存储在您的浏览器中&#xff0c;并在您下次访问该网站时读取该Cookie。这样&#xff0c;网站可以记住您的…

【Spring AOP】Spring AOP 详解

Spring AOP 详解 一. 什么是 AOP二. AOP 组成切面&#xff08;Aspect&#xff09;连接点&#xff08;Join Point&#xff09;切点&#xff08;Pointcut&#xff09;通知&#xff08;Advice&#xff09; 三. Spring AOP 实现1. 添加 AOP 框架⽀持2. 定义切面和切点3. 定义相关通…

nginx windows安装部署,代理转发配置

一、安装 1、nginx官网下载 windows版本 nginx官网 下载后解压到本地 2、在nginx的配置文件是conf目录下的nginx.conf&#xff0c;默认配置的nginx监听的端口为80&#xff0c;如果本地电脑的80端口有被占用&#xff0c;如果本地80端口已经被使用则修改成其他端口。如下&…

【吴恩达深度学习】

第一周 1、修正线性单元ReLU 第二周、Logistic回归 1、样本矩阵X&#xff1a; 是一个m*nx的矩阵&#xff0c;表示m个样本&#xff08;一个竖列代表一个样本&#xff09;&#xff0c;每个样本有nx个特征。 2、标签矩阵Y&#xff1a;[y1,y2,y3,ym] m个训练样本分别对应的标签…

C++程序员必修第一课【C++基础课程】01:安装C++开发环境

1 本课主要内容&#xff1a; 了解 C 开发相关基础概念学会在 Windows10 上安装 Visual Studio 2019免费社区版新建第一个 "Hello World" C 程序&#xff0c;验证 C 开发环境 2 主要知识点&#xff1a; C 开发环境是同时指操作系统和C开发工具操作系统主要有 Window…

软件开发人员 Kubernetes 入门指南|Part 1

Kubernetes 是一个用于部署和管理容器的编排系统。使用 Kubernetes&#xff0c;用户可以通过自动执行管理任务&#xff08;例如在跨节点间扩展容器并在容器停止时重新启动任务&#xff09;&#xff0c;在不同环境中可靠地运行容器。 Kubernetes 提供的抽象可以让你从 Pod&am…

二维码智慧门牌管理系统:提升社会治理水平,创新市民服务方式

文章目录 前言一、适应市域社会治理现代化二、解决地名地址管理核心问题三、拓展多元化服务 前言 随着科技的不断发展&#xff0c;社会治理的方式和方法也在不断更新和升级。近年来&#xff0c;市域社会治理现代化已成为社会发展的必然趋势&#xff0c;而二维码智慧门牌管理系…