codeforces round974 div3 分层图 树形dp

news2024/9/24 0:05:07

A  Robin Helps

问题:

思路:模拟

代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 10;

void solve() {
    int n, k;
    cin >> n >> k;
    vector<int> a(n + 1);
    for(int i = 1; i <= n; i ++ ) cin >> a[i];
    int sum = 0;
    int cnt = 0;
    for(int i = 1; i <= n; i ++ ) {
        if(a[i] >= k) sum += a[i];
        else if(a[i] == 0 && sum != 0) {
            sum --;
            cnt ++;
        }
    }
    cout << cnt << endl;
}

int main() {
    int t;
    cin >> t;
    while(t -- ) solve();
}
/*
2
1
-1
4
2
-1
*/ 

B Robin Hood and the Major Oak

问题:

思路:注意到i^{i}的奇偶性只与$i$有关 因此前$i$天树叶的和的奇偶性我们可以很容易的得到,并且叶子只能存活m天,所以只需判断$n - m + 1$$n$天叶子的奇偶性即可

代码:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 2e5 + 10;

void solve() {
    int n, k;
    cin >> n >> k;
    /*vector<ll> a(N + 1);
    for(int i = 1; i <= n / i; i ++ ) a[i] = i * i;*/
    int num = 0;
    if(n & 1) num = (n + 1) / 2;
    else num = n / 2;
    int num1 = 0;
    if((n - k) & 1) num1 = (max(0, (n - k)) + 1) / 2;
    else num1 = max(0, (n - k)) / 2;
    if((num0 - num1) & 1) cout << "NO\n";
    else cout << "YES\n";
}

int main() {
    int t;
    cin >> t;
    while(t -- ) solve();
}

C  Robin Hood in Town

思路:

二分答案,然后在check函数中判断这个结果是否可行

代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 10;
const double eps = 1e-8;

void solve() {
    int n;
    cin >> n;
    vector<long long> a(n + 1);
    for(int i = 1; i <= n; i ++ ) cin >> a[i];
    sort(a.begin() + 1, a.end());

    auto check = [&](long long mid) {
        //mid = 0;
        a[n] += mid;
        double sum = 0;
        for(int i = 1; i <= n; i ++ ) sum += a[i];
        int cnt = 0;
        double avg = sum / n;
        avg /= 2;
        for(int i = 1; i <= n; i ++ ) {
            if(a[i] + eps < avg) cnt ++;
        }
        a[n] -= mid;
        //cout << cnt << " ";
        return cnt >= n / 2 + 1;
    };
    //check(0);
    //if(check(0)) cout << 11111;
    long long l = 0, r = 1e16;
    while(l < r) {
        long long mid = l + r >> 1;
        if(check(mid)) r = mid;
        else l = mid + 1;
    }

    if(check(l)) cout << l << "\n";
    else cout << "-1\n";
}

int main() {
    int t;
    cin >> t;
    while(t -- ) solve();
}

D robert hood and mrs hood

问题:

思路:

这道题目本质上是求一段区间内,最多和最少能包含多少个事件。首先可以通过差分的方式求出每个时间点当前包含多少事件,然后从该点开始向后扫描要扫描的区间长度,每碰见一个事件开始的左端点那么该段区间内事件数加1,第二层循环可以用前缀和优化掉,预处理出每个点之前有多少事件开始的左端点。

代码:
 

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 2e5 + 10;
const double eps = 1e-8;

void solve() {
    int n, d, k;
    cin >> n >> d >> k;
    vector<pair<int, int>> a(k + 1);
    for(int i = 1; i <= k; i ++ ) {
        int l, r;
        cin >> l >> r;
        a[i] = {l, r};
    }
    sort(a.begin() + 1, a.end());
    vector<ll> diff(n + 2);//每个点被几个区间覆盖
    for(int i = 1; i <= k; i ++ ) {
        int l = a[i].first;
        int r = a[i].second;
        diff[l] += 1;
        diff[r + 1] -= 1;
    }

    for(int i = 1; i <= n; i ++ ) diff[i] += diff[i - 1];
    vector<ll> sum(n + 1);
    for(int i = 1; i <= k; i ++ ) {
        sum[a[i].first] ++;
    }
    /*for(int i = 1; i <= n; i ++ ) cout << sum[i] << " ";
    cout << endl;
    for(int i = 1; i <= n; i ++ ) cout << diff[i] << " ";*/
    for(int i = 1; i <= n; i ++ ) sum[i] += sum[i - 1];
    ll minv = 0x3f3f3f3f, maxv = 0;
    int pos1 = 1, pos2 = 1;
    for(int i = 1; i <= n - d + 1; i ++ ) {
        ll num = sum[i + d - 1] - sum[i] + diff[i];
        if(num > maxv) {
            maxv = num;
            pos1 = i;
        }

        if(num < minv) {
            minv = num;
            pos2 = i;
        }
    }
    cout << pos1 << " " << pos2 << endl;
}

int main() {
    int t;
    cin >> t;
    while(t -- ) solve();
}

E Rendez-vous de Marian et Robin

问题:

思路:分层图,第一层图的边权为均为w,第二层图的边权均为w / 2,第一层图的点i与第二层图的点i + n对应,由于骑上马之后一定比骑上马再下马更优,因此两层图之间用单向边连接,即,如果在点i上有马,那么就在i与i + n之间连一条边权为0的单向边。最后从点1和点n分别跑dijkstra即可。最后一个点的最短时间就是min(dis[i], dis[i + n])。记得开long long

代码:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

void solve() {
    int n, m, h;
    cin >> n >> m >> h;
    vector<vector<pair<int, int>>> adj(2 * n + 1); 
    for(int i = 1; i <= h; i ++ ) {
        int x;
        cin >> x;
        adj[x].push_back({x + n, 0});
    }

    while(m -- ) {
        int u, v, w; 
        cin >> u >> v >> w;
        adj[u].push_back({v, w});
        adj[v].push_back({u, w});
        adj[u + n].push_back({v + n, w / 2});
        adj[v + n].push_back({u + n, w / 2});
    }

    vector<bool> st(2 * n + 1);
    auto dijkstra = [&](int start, vector<ll> &dis) {
        dis[start] = 0;
        priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> q;
        q.push({0ll, start});
        while(!q.empty()) {
            auto t = q.top();
            q.pop();
            ll dist = t.first, ver = t.second;
            if(st[ver]) continue;
            st[ver] = true;

            for(auto t: adj[ver]) {
                if(dis[t.first] > dist + t.second) {
                    dis[t.first] = dist + t.second;
                    q.push({dis[t.first], t.first});
                }
            }
        }
    };
    
    vector<ll> dis(2 * n + 1, 1e18), redis(2 * n + 1, 0x3f3f3f3f);
    dijkstra(1, dis);
    for(int i = 1; i <= 2 * n; i ++ ) st[i] = false;
    dijkstra(n, redis);
    ll ans = 1e18;
    for(int i = 1; i <= n; i ++ ) {
        ans = min(ans, max(min(dis[i], dis[i + n]), min(redis[i], redis[i + n])));
    }
    if(ans == 1e18) cout << "-1\n";
    else cout << ans << "\n";
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int t;
    cin >> t;
    while(t -- ) solve();
    return 0;
}

F sheriff's defences

问题:

思路:首先注意到这个图只有n - 1条边,并且是连通的,也就是说这是一棵树。然后对于一个点,如果这是一个单独被保护起来的点,那么这个点对答案的贡献实际上就是自身拥有的gold。如果这是多个连续的被保护的点,这里以两个点为例,对答案的贡献就是gold - c - c其中一个c表示本身被相邻的点抢走的gold,另一个c表示相邻那个点被这个点抢走的gold。这就和没有上司的舞会差不多了,dp[i][2]表示第i个营地我是否保护,dp[i][0]表示不保护, dp[i][1]表示保护 

那么状态转移可表示为:

dp[i][0] += max(dp[son][0], dp[son][1])

$dp[i][1] += max(dp[son][0], dp[son][1] - 2 * c)$

代码:
 

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

void solve() {
    int n, c;
    cin >> n >> c;
    vector<ll> a(n + 1);
    for(int i = 1; i <= n; i ++ ) cin >> a[i];
    vector<vector<int>> adj(n + 1);
    for(int i = 1; i <= n - 1; i ++ ) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    vector<vector<ll>> dp((n + 1), vector<ll>(3));
    function<void(int, int)> dfs = [&](int u, int fa) -> void {
        dp[u][1] = a[u];
        for(auto t: adj[u]) {
            if(t == fa) continue;
            dfs(t, u);
            dp[u][0] += max(dp[t][1], dp[t][0]);
            dp[u][1] += max(dp[t][0], dp[t][1] - 2 * c);
        }
    };
    dfs(1, 1);
    cout << max(dp[1][1], dp[1][0]) << "\n";
}

int main() {
    ios::sync_with_stdio(false);
    int t;
    cin >> t;
    cin.tie(0), cout.tie(0);
    while(t -- ) solve();
    return 0;
}

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

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

相关文章

着色器(Vertex Shader)基础

什么是顶点着色器 顶点着色器处理顶点并告知它们在“剪辑空间”中的坐标,该空间使计算机可以轻松了解哪些顶点对摄像机可见,哪些顶点不可见,必须剪切或“剪切”掉。 这使得 GPU 在后期阶段的速度更快,因为它们需要处理的数据较少。 它们通过接收来自顶点列表中的单个顶…

手写数字识别案例分析(torch,深度学习入门)

在人工智能和机器学习的广阔领域中&#xff0c;手写数字识别是一个经典的入门级问题&#xff0c;它不仅能够帮助我们理解深度学习的基本原理&#xff0c;还能作为实践编程和模型训练的良好起点。本文将带您踏上手写数字识别的深度学习之旅&#xff0c;从数据集介绍、模型构建到…

全栈开发(四):使用springBoot3+mybatis-plus+mysql开发restful的增删改查接口

1.创建user文件夹 作为增删改查的根包 路径 src/main/java/com.example.demo/user 2.文件夹里文件作用介绍 1.User(实体类) package com.example.demo.user; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.IdType; impo…

利用影刀实现批量发布文章的RPA流程(附视频演示)

前言 大家好&#xff0c;我是小智。在这篇文章中&#xff0c;我将分享一个实战案例&#xff0c;展示如何利用影刀实现批量发布文章的RPA流程。这里主要介绍其中一个简单步骤&#xff0c;其它步骤将通过视频演示。有使用方面的疑问可以留言。 影刀是一款强大的自动化工具&#x…

Matlab|考虑柔性负荷的综合能源系统低碳经济优化调度

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序主要实现的是考虑柔性负荷的综合能源系统低碳经济优化调度&#xff0c;模型参考《考虑柔性负荷的综合能源系统低碳经济优化调度》&#xff0c;求解方法采用的是混合整数规划算法&#xff0c;通过matlabc…

医学数据分析实训 项目四 回归分析--预测帕金森病病情的严重程度

文章目录 项目四&#xff1a;回归分析实践目的实践平台实践内容 预测帕金森病病情的严重程度作业&#xff08;一&#xff09;数据读入及理解&#xff08;二&#xff09;数据准备&#xff08;三&#xff09;模型建立&#xff08;四&#xff09;模型预测&#xff08;五&#xff0…

如何使用cmd命令查看本机电脑的主机名?

1、按键盘win R 键&#xff0c;输入cmd&#xff0c;然后按一下【回车】 2、输入ping -a localhost , 然后按下【回车】 3、如下Ping 后面的DESKTOP-ALB9JF7即是本机电脑的【主机名】

浮动静态路由

浮动静态路由 首先我们知道静态路由的默认优先级是60&#xff0c;然后手动添加一条静态路由优先级为80的路由作为备份路由。当主路由失效的备份路由就会启动。 一、拓扑图 二、基本配置 1.R1: <Huawei>system-view [Huawei]sysname R1 [R1]interface GigabitEthernet…

linux的ssh命令使用介绍

目录 一、SSH的基本概念 二、SSH的工作原理 1、建立连接 2、密钥交换 3、认证 4、加密通信 三、SSH的主要功能 1、远程登录 2、文件传输 3、端口转发 四、SSH的安全性 五、SSH的应用场景 六、SSH的实现软件 一、SSH的基本概念 SSH主要用于登录远程服务器和执行命令、传输文…

使用Conda配置python环境到Pycharm------Window小白版

使用Conda配置python环境到Pycharm 一、Conda安装和环境配置1.1 安装Conda软件1.2 判断是否安装成功1.3 创建Conda虚拟环境 二、 pycharm的安装2.1 Pycharm使用手册2.2 安装pycharm 三、 pycharm导入Conda环境 一、Conda安装和环境配置 anaconda官网 1.1 安装Conda软件 运行…

TryHackMe 第4天 | Pre Security (三)

该学习路径讲解了网络安全入门的必备技术知识&#xff0c;比如计算机网络、网络协议、Linux命令、Windows设置等内容。过去两篇已经对计算机网络和网络协议进行了简单介绍&#xff0c;本篇博客将记录 Linux命令 部分。 Linux 系统的优点就是其轻量级&#xff0c;有些 Linux 系…

通过spring-boot创建web项目

依赖的软件 maven 1. 官网下载zip 文件&#xff0c;比如apache-maven-3.9.9-bin.zip 2. 解压到某个盘符&#xff0c;必须保证父亲目录的名字包含英文&#xff0c;数字&#xff0c;破折号&#xff08;-&#xff09; 3. 设置环境变量M2_HOME, 并将%M2_HOME%\bin添加到windown…

Linux:Bash中的文件描述符详解

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Linux中的所有进程&#xff0c;都拥有自己的文件描述符(File Descriptor, FD)&#xff0c;它是操作系统在管理进程和文件时的一种抽象概念。每个文件描述符由一个非负整…

2012-2019全球地表平均夜光年度数据

数据详情 2012-2019全球地表平均夜光年度数据 数据属性 数据名称&#xff1a;全球地表平均夜光年度数据 数据时间&#xff1a;2012-2019 空间位置&#xff1a;全球 数据格式&#xff1a;tif 空间分辨率&#xff1a;1500米 时间分辨率&#xff1a;年 坐标系&#xff1a;…

【自学笔记】支持向量机(3)——软间隔

引入 上一回解决了SVM在曲线边界的上的使用&#xff0c;使得非线性数据集也能得到正确的分类。然而&#xff0c;对于一个大数据集来说&#xff0c;极有可能大体呈线性分类趋势&#xff0c;但是边界处混杂&#xff0c;若仍采用原来的方式&#xff0c;会得到极其复杂的超平面边界…

高效高质量SCI论文撰写及投稿

第一章、论文写作准备即为最关键 1、科技论文写作前期的重要性及其分类 2、AI工具如何助力学术论文 3、研究主题确定及提高创新性 兴趣与背景&#xff1a;选择一个您感兴趣且有背景知识的研究领域。 创新性&#xff1a;选题和研究设计阶段如何提高学术创新性的方法。 研究缺…

FreeMarker 禁止自动转义标签-noautoesc

&#x1f496;简介 FreeMarker 是一个用 Java 语言编写的模板引擎&#xff0c;它被设计用来生成文本输出&#xff08;HTML 网页、电子邮件、配置文件等&#xff09;。在 FreeMarker 中&#xff0c;默认情况下&#xff0c;当你在模板中输出变量时&#xff0c;如果这些变量包含 …

应用密码学第一次作业(9.23)

一、Please briefly describe the objectives of information and network security,such as confidentiality, integrity, availability , authenticity , and accountability The objectives of information and network security include: Confidentiality: Protecting se…

在线思维导图怎么制作?只需要台这些组合分析法!

思维导图经历了漫长的进化&#xff0c;现已成为信息组织、记忆和头脑风暴的重要工具。其制作方式主要有手绘和软件两种&#xff0c;随着互联网的发展&#xff0c;软件制作因其便捷性和易于保存逐渐占据主导。如今&#xff0c;在线工具使得用户能够免费创建思维导图。本文将以即…

828华为云征文 | 云服务器Flexus X实例,Docker集成搭建Redis集群

828华为云征文 | 云服务器Flexus X实例&#xff0c;Docker集成搭建Redis集群 Redis 集群是一种分布式的 Redis 解决方案&#xff0c;能够在多个节点之间分片存储数据&#xff0c;实现水平扩展和高可用性。与传统的主从架构不同&#xff0c;Redis 集群支持数据自动分片、主节点故…