Codeforces Round 928 (Div. 4)( F(dfs+小技巧),G(树上dp) )

CF1926F. Vlad and Avoiding X

题意
给定一个 7 ∗ 7 7*7 77的网格,网格上的点不是黑色就是白色,要求修改最少的点,使得网格中没有X形状的黑色网格。
思路
首先看到这个数据范围,很容易想到暴搜,但是总共有 7 ∗ 7 = 49 7*7=49 77=49个网格,如果暴力dfs去搜的话,时间复杂度就是 O ( 2 49 ) O(2^{49}) O(249),一定是会超时的,因此我们看如何优化,会发现,坐标和为奇数与偶数的格子是互不影响的,也就是所有可能的X形状的格子,要么坐标和全是奇数,要么全是偶数,即下图中,X形状的格子要么全是蓝色,要么全是棕色
在这里插入图片描述
那么我们就可以进行两次搜索,一次搜索坐标和为奇数的格子,另一次搜索坐标和为偶数的格子,时间复杂度就优化成了 O ( 2 24 + 2 25 ) O(2^{24}+2^{25}) O(224+225),我们再观察一下,如果要修改最外圈的点,那么我们总能找到修改内圈中的点来替换最外圈的点来达到更优的效果,那么时间复杂度就来到了 ( O ( 2 12 + 2 13 ) (O(2^{12}+2^{13}) (O(212+213),这样就可以通过了本题了,同时可以加一个最优性剪枝,进一步优化时间复杂度,在我们搜索的时候其实会有很多点会重复搜索,因此我们每次可以少搜两个点,具体哪两个点可以看你的代码怎么写了
代码如下:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <cmath>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int N = 1e5 + 10;

void solve()
{
    string s[7];
    for(int i=0;i<7;i++)cin>>s[i];

    int ans=0;
    for(int p=0;p<2;p++)//分别统计坐标和为奇数或偶数的情况
    {
        int res=100;

        auto dfs = [&](auto dfs,int x,int y,int cnt)
        {
            if(cnt>=res)return;//剪枝
            if(x==5)//边界情况
            {
                res=min(res,cnt);
                return;
            }
            if(y==5)//到达边界,x+1,y=0
            {
                dfs(dfs,x+1,0,cnt);
                return;
            }
            if((x+y)%2!=p)//坐标和要跟当前遍历的p相等
            {
                dfs(dfs,x,y+1,cnt);
                return;
            }

            if(s[x][y]=='B'&&s[x][y+2]=='B'&&s[x+1][y+1]=='B'&&s[x+2][y]=='B'&&s[x+2][y+2]=='B')
            {
                // s[x][y]='W';
                // dfs(dfs,x,y+1,cnt+1);//这个点会重复修改可以不要
                // s[x][y]='B';

                // s[x][y+2]='W';
                // dfs(dfs,x,y+1,cnt+1);//位于最外一圈的点可以不修改,因为总能找到内层的点修改,会更优
                // s[x][y+2]='B';

                s[x+1][y+1]='W';
                dfs(dfs,x,y+1,cnt+1);
                s[x+1][y+1]='B';

                s[x+2][y]='W';
                dfs(dfs,x,y+1,cnt+1);
                s[x+2][y]='B';

                s[x+2][y+2]='W';
                dfs(dfs,x,y+1,cnt+1);
                s[x+2][y+2]='B';
            }
            else dfs(dfs,x,y+1,cnt);
            
        };
        dfs(dfs,0,0,0);
        ans+=res;
    }
    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;
}

CF1926G. Vlad and Trouble at MIT

题意
给定一棵树,树上的点要么是P,要么是S,要么是C,C可以替换成P,也可以替换成C,要求在树中加一些墙,使得任意的P跟S之间都是有墙的。
思路
如果这个题没有C的话,我们可以用并查集缩点然后建图,统计每个S点的度数即可。但是有C那我们应该怎么做呢?

我们令 d p [ u ] [ 0 / 1 ] dp[u][0/1] dp[u][0/1]表示当前点uS/P时,以点u为根的子树中满足题意需要加墙的最小操作数。如果当前点uC,那么就可以变成SP,此时 d p [ u ] [ 0 ] = d p [ u ] [ 1 ] = 0 dp[u][0]=dp[u][1]=0 dp[u][0]=dp[u][1]=0否则不能,如果当前点为S,那么 d p [ u ] [ 0 ] = I N F dp[u][0]=INF dp[u][0]=INF(极大值),那么只需要将当前点的儿子中P分割开,加一堵墙即可。反之亦然。

代码如下:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <cmath>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int N = 1e5 + 10 ,INF = 1e9;

int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    
    int T;cin>>T;
    while(T--)
    {
        int n;cin>>n;
        vector<vector<int>>g(n+1);
        for(int i=2;i<=n;i++)
        {
            int x;cin>>x;
            g[x].push_back(i);//由题意,可以只建一条边
        }
        string s;cin>>s;s=" "+s;

        vector<vector<int>>dp(n+1,vector<int>(2,0));
        //dp[u][0]表示当前点为S时,以点u为根的子树满足题意的最小方案数
        //dp[u][1]表示当前点为P时,以点u为根的子树满足题意的最小方案数
        auto dfs = [&] (auto dfs,int u)->void
        {
            dp[u][0]=dp[u][1]=0;//当前点s[u]=C时,dp[u][0]=dp[u][1]=0
            if(s[u]=='P')dp[u][0]=INF;//当前点s[u]如果为P,那么就不可能为S
            if(s[u]=='S')dp[u][1]=INF;//当前点s[u]如果为S,那么就不可能为P

            for(auto j:g[u])
            {
                dfs(dfs,j);
                dp[u][0]+=min(dp[j][0],dp[j][1]+1);//如果儿子与当前点相同,就不用加隔板,否则要加一个隔板
                dp[u][1]+=min(dp[j][1],dp[j][0]+1);
            }
        };
        dfs(dfs,1);
        cout<<min(dp[1][0],dp[1][1])<<"\n";//答案就是两种情况的最小值
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

openai chatGPT 原理通俗介绍

引言 近年来&#xff0c;随着深度学习技术的不断发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域取得了长足的进步。ChatGPT&#xff08;Generative Pre-trained Transformer&#xff09;作为一种先进的语言生成模型&#xff0c;在各类对话系统和智能助手中得到…

PHP+vue+mysql网络考试系统成绩学习资料系统7wivi

开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 运行环境:phpstudy/wamp/xammp等 随着互联网的发展&#xff0c;教育也迎来了互联网的春天&#xff0c;现代教育更加依托于互联网的应用&a…

php反序列化原理常见的魔术方法

序列化是什么&#xff1f; 要想了解反序列化&#xff0c;就先要知道序列化是什么。下面是是一串序列化数组&#xff1a; a:2:{s:4:"name";s:6:"cike_y";s:3:"age";i:18;}a表示array&#xff08;数组&#xff09;&#xff0c;2表示这个数组有两…

Maxwell - 增量数据同步工具

前言 今天来学习一个新的大数据小工具 Maxwell &#xff0c;它和 Sqoop 很像。Sqoop主要用于在 Hadoop &#xff08;比如 HDFS、Hive、HBase 等&#xff09;和关系型数据库之间进行数据的批量导入和导出&#xff0c;而 Maxwell 则主要用于监控数据库的变化&#xff08;通过监控…

详解AT24CXX驱动开发(linux platform tree - i2c应用)

目录 概述 1 认识AT24Cxx 1.1 AT24CXX的特性 1.2 AT24CXX描述 1.2.1 引脚 1.2.2 容量描述 1.2.3 设备地址 1.3 操作时序 1.3.1 写单个字节时序 1.3.2 写page字节时序 1.3.3 读取当前数据时序 1.3.4 随机读取数据 1.3.5 连续读取多个数据 2 驱动开发 2.1 硬件接口…

爬虫案例|采集某东商品评论信息|API数据接口 python实例

前言&#xff1a; 平常大家都有网上购物的习惯&#xff0c;在商品下面卖的好的产品基本都会有评论&#xff0c;当然也不排除有刷评论的情况&#xff0c;因为评论会影响我们的购物决策。今天主要分享用pythonre正则表达式获取京东商品评论。可以直接采用API接口接入形式大规模采…

【洛谷 P8780】[蓝桥杯 2022 省 B] 刷题统计 题解(贪心算法+模拟+四则运算)

[蓝桥杯 2022 省 B] 刷题统计 题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a a a 道题目&#xff0c;周六和周日每天做 b b b 道题目。请你帮小明计算&#xff0c;按照计划他将在第几天实现做题数大于等于 n n n 题? 输入格式 输入一…

python使用openpyxl添加图片到excel文件中

文章目录 openpyxl添加图片方法示例程序 openpyxl添加图片方法 图片只能保存在某个sheet页面中&#xff0c;因此首先打开sheet页面&#xff1a; openpyxl.load_workbook("测试excel.xlsx")然后创建一个图片&#xff1a; input_sheet excel_workbook["Sheet1…

java—泛型编程

文章目录 什么是泛型为什么需要泛型 泛型的使用泛型的上界 泛型方法的使用引出泛型方法 泛型是如何编译的擦除机制 什么是泛型 首先什么是泛型呢&#xff1f;从字面上我们可以理解为广泛的类型&#xff0c;有一定c基础的程序猿们应该了解&#xff0c;java中的泛型其实就是c的模…

小米14 ULTRA:重新定义手机摄影的新篇章

引言 随着科技的飞速发展&#xff0c;智能手机已经不仅仅是一个通讯工具&#xff0c;它更是我们生活中的一位全能伙伴。作为科技领域的佼佼者&#xff0c;小米公司再次引领潮流&#xff0c;推出了全新旗舰手机——小米14 ULTRA。这款手机不仅在性能上进行了全面升级&am…

UE5 C++ 静态加载资源和类

一.上篇文章创建组件并绑定之后 在Actor中加载初始化了组件&#xff0c;现在在组件中赋值。使用static ConstructorHelpers::FObjectFinder<T>TempName(TEXT("Copy Reference"))&#xff1b;再用TempName.Object //静态加载资源static ConstructorHelpers::FOb…

Java HashMap源码剖析

字面上看&#xff0c;HashMap由Hash和Map两个单词组成&#xff0c;Map表示映射关系&#xff0c;是一个接口&#xff0c;实现Map接口有多种方式&#xff0c;HashMap实现的方式利用了Hash。本文先分析Map接口&#xff0c;接着分析HashMap实现原理&#xff0c;最后总结分析HashMap…

【云原生系列之kubernetes】--Ingress使用

service的缺点&#xff1a; 不支持基于URL等机制对HTTP/HTTPS协议进行高级路由、超时、重试、基于流量的灰度等高级流量治理机制难以将多个service流量统一管理 1.1ingress的概念 ingress是k8s中的一个对象&#xff0c;作用是如何将请求转发到service的规则ingress controlle…

STM32-启用蜂鸣器

目录 1 、电路构成及原理图 2、编写实现代码 main.c beep.c beep.h 3、代码讲解 4、 烧录到开发板调试、验证代码 5、检验效果 本人使用的是朗峰 STM32F103 系列开发板&#xff0c;此笔记基于这款开发板记录。 1 、电路构成及原理图 首先&#xff0c;通过朗峰 F1 开…

14. rk3588自带的RKNNLite检测yolo模型(python)

首先将文件夹~/rknpu2/runtime/RK3588/Linux/librknn_api/aarch64/下的文件librknnrt.so复制到文件夹/usr/lib/下&#xff08;该文件夹下原有的文件librknnrt.so是用来测试resnet50模型的&#xff0c;所以要替换成yolo模型的librknnrt.so&#xff09;&#xff0c;如下图所示&am…

相机图像质量研究(36)常见问题总结:编解码对成像的影响--块效应

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

uniapp开发小程序项目

下载hbuilder 官网入口 下载地址 解压安装包 HBuilderX&#xff0c;Windows为zip包&#xff0c;解压后才能使用。 首先&#xff0c;选中下载的zip包&#xff0c;点击右键菜单&#xff0c;点击解压到当前文件夹进入解压后的文件夹&#xff0c;找到HBuilderX.exe&#xff0c;…

Leetcoder Day16| 二叉树 part05

语言&#xff1a;Java/C 513.找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 本题需要满足两…

Flink/flinksql 语法 窗口与join 一文全 相关概念api汇总总结,底层process算子总结,与数据延迟处理,超时场景解决方案

Flink 窗口概念与join汇总总结 1 SQL语法中窗口语法相关&#xff08;仅仅是flinksql中 窗口的语法&#xff09;1.1 sql窗口1.2 window topN 2 java/SQL join语法与介绍2.1 有界join2.1.1 Window Join2.1.2 Interval Join2.1.3 Temporary Join2.1.4 LoopUp Join2.2 无界join2.2.…

MyBatis学习总结

MyBatis分页如何实现 分页分为 逻辑分页&#xff1a;查询出所有的数据缓存到内存里面&#xff0c;在从内存中筛选出需要的数据进行分页 物理分页&#xff1a;直接用数据库语法进行分页limit mybatis提供四种方法分页&#xff1a; 直接在sql语句中分页&#xff0c;传递分页参数…