牛客周赛 Round 36 解题报告 | 珂学家 | 状态DP + 构造 + 9棵树状数组


前言

alt


整体评价

今天相对容易,E的构造题,感谢出题人极其善意的Case 1, 算是放水了。F题是个很典的结论题,由于存在动态点修改,所以引入树状数组做区间和的快速计算。


A. 小红的数位删除

题型: 签到

s = input()

print (s[:-3])

B. 小红的小红矩阵构造

思路: 模拟

h, w, s = list(map(int, input().split()))

ts = 0
grid = []
for i in range(h):
    arr = list(map(int, input().split()))
    grid.append(arr)
    ts += sum(arr) 

hs = set()
for i in range(h):
    v = 0
    for u in grid[i]:
        v = v ^ u
    hs.add(v)
for i in range(w):
    v = 0
    for j in range(h):
        v ^= grid[j][i]
    hs.add(v)
    
if len(hs) == 1 and ts == s:
    print ("accepted")
else:
    print ("wrong answer")

C. 小红的白色字符串

思路: 状态机DP

引入三个状态

  • 0, 末尾是空格,
  • 1, 末尾是小写字母
  • 2, 末尾是大写字母

具体转移和当前的字母的大小写性质有关

具体看代码

s = input()

from math import inf

dp0, dp1, dp2 = 0, inf, inf

n = len(s)
for c in s:
    if c >= 'A' and c <= 'Z':
        t0 = min(dp0, dp1, dp2) + 1
        t1 = inf
        t2 = dp0
        dp0, dp1, dp2 = t0, t1, t2
    else:
        t0 = min(dp0, dp1, dp2) + 1
        t1 = min(dp0, dp1, dp2)
        t2 = inf
        dp0, dp1, dp2 = t0, t1, t2

print (min(dp0, dp1, dp2))

D. 小红走矩阵

思路: BFS

很板的一道题,只是在扩展下一步的时候,多了一个限制条件

h, w = list(map(int, input().split()))

maze = []
for _ in range(h):
    arr = list(input())
    maze.append(arr)
    
from math import inf
from collections import deque

vis = [[inf] * w for _ in range(h)]

deq = deque()
deq.append((0, 0))
vis[0][0] = 0

while len(deq) > 0:
    y, x = deq.popleft()
    for (dy, dx) in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
        ty = y + dy
        tx = x + dx
        if 0 <= ty < h and 0 <= tx < w:
            if maze[y][x] != maze[ty][tx]:
                if vis[ty][tx] > vis[y][x] + 1:
                    vis[ty][tx] = vis[y][x] + 1
                    deq.append((ty, tx))

if vis[h - 1][w - 1] == inf:
    print (-1)
else:
    print (vis[h - 1][w - 1])

E. 小红的小红走矩阵

思路: 构造一个弯

按照Case 1,构造一个”钩“,然后其余的保持和周边不同即可。

alt

因为地图四色定律,所以只要”abcd“即可。

h, w = list(map(int, input().split()))

maze = [['A'] * w for _ in range(h)]
maze[0][0] = 'a'
maze[0][1] = 'b'
maze[0][2] = 'b'

maze[1][0] = 'a'
maze[1][1] = 'c'
maze[1][2] = 'c'

maze[2][0] = 'b'
maze[2][1] = 'c'

def compute(y, x):
    s = set()
    for (dy, dx) in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
        ty, tx = y + dy, x + dx
        if 0 <= ty < h and 0 <= tx < w:
            if maze[ty][tx] != 'A':
                s.add(maze[ty][tx])
    for c in "abcd":
        if c not in s:
            return c
    return 'e'

for i in range(h):
    for j in range(w):
        if maze[i][j] == 'A':
            maze[i][j] = compute(i, j)

for i in range(h):
    print (''.join(maze[i]))

F. 小红的好子串询问

思路: 经典结论 + 树状数组

不存在 大于等于2个子串的回文,

r e d 的排列 p ,然后 p 循环出现 red的排列p,然后p循环出现 red的排列p,然后p循环出现

基于这个结论,对于某个查询[l, r], 则枚举red的排列,然后引入9个树状数组, 进行统计,求最小代价即可。

fenwicks[3][3],表示位置余3,字母(按red=123)的9个树状数组

class BIT(object):
    def __init__(self, n):
        self.n = n
        self.arr = [0] * (n + 1)
    
    def query(self, p):
        r = 0
        while p > 0:
            r += self.arr[p]
            p -= p & -p
        return r
    
    def update(self, p, d):
        while p <= self.n:
            self.arr[p] += d
            p += p & -p

def toId(ch):
    if ch == 'r':
        return 0
    elif ch == 'e':
        return 1
    return 2


from math import inf
from itertools import permutations 

n, m = list(map(int, input().split()))
s = list(input())

trees = [ [ BIT(n) for _ in range(3) ] for _ in range(3)]

for i in range(n):
    trees[i % 3][toId(s[i])].update(i + 1, 1)

for _ in range(m):
    op, a1, a2 = input().split()
    if int(op) == 1:
        l, ch = int(a1) - 1, a2[0]
        trees[l % 3][toId(s[l])].update(l + 1, -1)
        s[l] = ch
        trees[l % 3][toId(s[l])].update(l + 1, 1)
    else:
        l, r = int(a1) - 1, int(a2) - 1
        
        res = inf
        for (t1, t2, t3) in list(permutations([0, 1, 2])):
            z1 = trees[(l + t1) % 3][0].query(r + 1) - trees[(l + t1) % 3][0].query(l)
            z2 = trees[(l + t2) % 3][1].query(r + 1) - trees[(l + t2) % 3][1].query(l)
            z3 = trees[(l + t3) % 3][2].query(r + 1) - trees[(l + t3) % 3][2].query(l)

            res = min(res, (r - l + 1) - (z1 + z2 + z3))
        print (res)

写在最后

alt

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

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

相关文章

链表的基础

目录 顺序表 链表 需要注意的 链表的优势 单链表的实现 1.单链表的准备 2.单链表的结构体的创建 3.单链表的准备 4.前插 5.后插 6.后删 7.前删 8.任意位置前插 9.任意位置后插 10.删除 11.修改 12.打印 13.释放链表 总说链表难&#xff0c;但我感觉只要认真听讲…

C语言:深入补码计算原理

C语言&#xff1a;深入补码计算原理 有符号整数存储原码、反码、补码转换规则数据与内存的关系 补码原理 有符号整数存储 原码、反码、补码 有符号整数的2进制表示方法有三种&#xff0c;即原码、反码和补码 三种表示方法均有符号位和数值位两部分&#xff0c;符号位用0表示“…

算法第二十六天-删除有序数组中的重复项Ⅱ

删除有序数组中的重复项 题目要求 解题思路 题目要求中提到原地修改&#xff0c;那么肯定需要一个指针指向当前即将放置元素的位置&#xff0c;需要另外一个指针向后遍历所有元素&#xff0c;所以[双指针]解法呼之欲出。 慢指针slow&#xff1a;指向当前元素放置的位置&…

蓝桥杯第一天

这题就是典型的位数贡献大于数量贡献&#xff0c; 1花的火柴更少&#xff0c;所以尽量用完10个1&#xff0c;然后其实就是简单的背包问题尽量拿最多的物品&#xff08;数字&#xff09;&#xff0c;限重为300&#xff0c;各物品&#xff08;数字&#xff09;的重量即为所需火柴…

波动数列 刷题笔记

思路分析 dp 找出状态转移方程 设d为a或者-b 代码 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N1010,MOD100000007; int get_mod(int a,int b){ return (a%bb)%b; …

深入解读 Elasticsearch 磁盘水位设置

本文将带你通过查看 Elasticsearch 源码来了解磁盘使用阈值在达到每个阶段的处理情况。 跳转文章末尾获取答案 环境 本文使用 Macos 系统测试&#xff0c;512M 的磁盘&#xff0c;目前剩余空间还有 60G 左右&#xff0c;所以按照 Elasticsearch 的设定&#xff0c;ES 中分片应…

全国保护性耕作/常规耕作农田分类数据集

基于Sentinel-2遥感产品&#xff0c;使用来自文献调研和目视解译产生的保护性/常规耕作样本点&#xff0c;通过交叉验证方法训练随机森林分类器&#xff0c;生成了2016-2020年全国保护性耕作/常规耕作农田分类数据集。分类代码&#xff1a;0值代表非农田&#xff0c;1值表示第一…

laravel-admin 头部添加操作

新建html 样式及js namespace App\Admin\Extensions\Nav;class Links {public function __toString(){return <<<HTML<li><a href"" οnclick"js_method();return false;"><i class"fa fa-floppy-o"></i><s…

方法的使用

1.什么是方法(method) 在java中方法就是一个代码片段.。几乎相当于c语言的函数。 2.方法定义 方法跟函数是几乎一样的。所以语法是大差不差的。就多了一点东西。之前我们在c语言里已经很详细讲过了函数。这里就简便的讲一下。 相比c语言函数多了个修饰符 。 现在看下其注意…

深入理解JavaScript内存泄漏:原因与解决方法

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Visual C++ 2010学习版安装教程

1. 创建项目 点击 “创建新项目”&#xff0c;创建一个项目。 2. 创建 helloworld.c ⽂件 3. 在弹出的编辑框中&#xff0c;选中 “C文件(.cpp)”&#xff0c;将 下方 “源.cpp” 手动改为要新创建的文件名。 如&#xff1a;helloWorld.c 。注意&#xff0c;默认 cpp 后缀名&am…

记录西门子:IO隔离SCL编程

在PLC变量中创建IO输入输出 在PLC类型中创建输入和输出&#xff0c;并将PLC变量的输入输出名称复制过来 创建一个FC块或者FB块 创建一个DB块 MAIN主程序中&#xff1a;

文件包含漏洞初识

一、基础知识介绍 在web后台开发的时候&#xff0c;我们会使用PHP&#xff0c;Java这种代码&#xff0c;而在使用的过程中&#xff0c;我们经常会使用包含函数&#xff08;也就是调用&#xff09;&#xff0c;而很多时候&#xff0c;前端用户在选择浏览时会调用包含的文件这无…

使用CSS制作动态的环形图/饼图

使用纯 CSS Animation conic-gradient 实现一个环形图。 饼图的实现思路和环形图一样&#xff0c;去掉中间的圆形遮盖 after 伪类元素即可。 一、构建基础样式 构建圆形节点和中间的遮盖元素。 <style>body {background-color: rgb(130, 226, 255);}.circle {top: 16…

个人网站展示(静态)

大学期间做了一个个人博客网站&#xff0c;纯H5编码的网站&#xff0c;利用php搭建了一个留言模块。 有需要源码的同学&#xff0c;可以联系我~ 首页&#xff1a; IT杂记模块 文人墨客模块 劳有所获模块 生活日志模块 关于我 一个推崇全栈开发的前端开发人员 微信: itrzzh …

蓝桥杯备战刷题five(自用)

1.数字三角形&#xff08;方向次数限制&#xff0c;动态规划&#xff09; //如果n为奇数时&#xff0c;最后必然走到最后行最中间的数&#xff0c;如果为偶数&#xff0c;则取中间两个数的最大值&#xff0c; //因为向左下走的次数与向右下走的次数相差不能超过 1 #include …

【动态规划】代码随想录算法训练营第四十四天 |完全背包,518. 零钱兑换 II , 377. 组合总和 Ⅳ (待补充)

完全背包理论基础 完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和…

仿牛客网项目---项目总结

本篇文章是对整个项目的一个总结。下面这张图要好好理解。 整个项目都是构建在SpringBoot之上的&#xff0c;所以把它画到最底下&#xff0c;其它技术依托在springboot之上。但是springboot并不是技术的核心&#xff0c;而只是起到了一个辅助的作用&#xff0c;它的作用仅仅是降…

后端项目访问不了

问题&#xff1a; 后端启动不了&#xff0c;无法访问网站 原因&#xff1a; 1.防火墙没有关 2.有缓存 3、项目没有启动 4、docker没有启动 解决&#xff1a; 先查看进程&#xff1a;docker ps&#xff0c;必须有三个 详细查看&#xff1a;docker ps -a exited代表没有开启…

AI相关的实用工具分享

AI实用工具大赏&#xff1a;赋能科研与生活&#xff0c;探索AI的无限可能 前言 在数字化浪潮汹涌而至的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;无论是工作还是生活&#xff0c;都在悄然发生改变。AI的崛起不仅为我们带…