牛客周赛 Round 57 解题报告 | 珂学家

news2024/9/26 13:46:05

前言

alt


题解

难度比较适宜,这场周赛出的不错。


A. 小红喜欢1

题型: 签到+语法

arr = list(map(int, input().split()))
 
print (arr.index(1) + 1)

B. 小红的树切割

思路:思维

统计边两端为同一颜色的边数即可

n = int(input())
 
s = input()
 
res = 0
for i in range(n - 1):
    u, v = list(map(int, input().split()))
    if s[u - 1] == s[v - 1]:
        res += 1
         
print (res)

C. 小红的双好数(easy)

思路: 数论 + 分类讨论

首先,2进制是天然好进制

同时需要借用一个经典结论

相邻两个自然数互质,自然 n 满足 ( n − 1 ) 的好进制 相邻两个自然数互质,自然n满足(n - 1)的好进制 相邻两个自然数互质,自然n满足(n1)的好进制

因此,对于大部分n,只要 2 , n − 1 2, n - 1 2,n1两数即可

所以需要考虑的是例外是

  • n = 1,3

    2,3为解

  • n = 2

    无解

n = int(input())

if n == 1 or n == 3:
    print ("YES")
    print (2, 3)
elif n == 2:
    print ("NO")
else:
    print ("YES")
    print (2, n - 1)

D. 小红的线段

思路: 数学 + 贪心

如果和 y = k ∗ x + b , 直线,有交点,则该线段两端点在直线的两侧 如果和 y = k * x + b, 直线,有交点,则该线段两端点在直线的两侧 如果和y=kx+b,直线,有交点,则该线段两端点在直线的两侧

根据 y = f ( x i ) = k ∗ x i + b , 和 y i 进行大小比较 {根据 y= f(x_i) = k * x_i + b, 和 y_i 进行大小比较} 根据y=f(xi)=kxi+b,yi进行大小比较

  • y < y i y \lt y_i y<yi, 则在直线下方, 构建点集 S n e g S_{neg} Sneg
  • y > y i y \gt y_i y>yi, 则在直线上方, 构建点集 S p o s S_{pos} Spos
  • y = = y i {y == y_i} y==yi, 则该点恰好在直线上, 构建点集 S z e r o S_{zero} Szero
  1. 优先利用 S n e g , S p o s S_{neg}, S_{pos} Sneg,Spos构建线段
  2. 次之使用 S z e r o 和多余的 S n e g , S p o s 构建线段 S_{zero} 和 多余的S_{neg}, S_{pos}构建线段 Szero和多余的Sneg,Spos构建线段
  3. 再次之使用 S z e r o 两两配对 S_{zero} 两两配对 Szero两两配对
  4. 剩下的都是没有交点的情况
n, k, b = list(map(int, input().split()))

def xl(x, y):
    y1 = k * x + b
    if y == y1:
        return 0
    elif y > y1:
        return 1
    return -1

pos = []
neg = []
zero = []

for i in range(2 * n):
    x, y = list(map(int, input().split()))
    d = xl(x, y)
    if d==0:
        zero.append(i + 1)
    elif d > 0:
        pos.append(i + 1)
    else:
        neg.append(i + 1)

ans = 0
res = []
while len(pos) > 0 and len(neg) > 0:
    t1, t2 = pos.pop(), neg.pop()
    res.append((t1, t2, 'Y'))
    ans += 1
    
while len(zero) > 0 and len(pos) > 0:
    t1, t2 = zero.pop(), pos.pop()
    res.append((t1, t2, 'Y'))
    ans += 1
    
while len(zero) > 0 and len(neg) > 0:
    t1, t2 = zero.pop(), neg.pop()
    res.append((t1, t2, 'Y'))
    ans += 1
    
while len(zero) >= 2:
    t1, t2 = zero.pop(), zero.pop()
    res.append((t1, t2, 'Y'))
    ans += 1
        
while len(pos) >= 2:
    t1, t2 = pos.pop(), pos.pop()
    res.append((t1, t2, 'N'))
    
while len(neg) >= 2:
    t1, t2 = neg.pop(), neg.pop()
    res.append((t1, t2, 'N'))
        
print (ans)
for e in res:
    print (*e, sep=' ')


E. 小红的双好数(hard)

题型: 数论+枚举

所求的数,满足

z = ∑ a i ∗ k 1 i , a i ∈ ( 0 , 1 ) z = \sum a_i * k1^i, a_i \in (0, 1) z=aik1i,ai(0,1)

同时满足

z = ∑ b i ∗ k 2 i , b i ∈ ( 0 , 1 ) z = \sum b_i * k2^i, b_i \in (0, 1) z=bik2i,bi(0,1)

因为 k 1 < k 2 k1 < k2 k1<k2, 所以尝试构造枚举 { b i ∗ k 2 i } \{b_i * k2^i\} {bik2i}的序列出发,然后验证满足某个 { a j ∗ k 1 j } \{a_j * k1 ^ j\} {ajk1j}

因为 2 ≤ k 1 < k 2 {2 \le k1 \lt k2} 2k1<k2

所以 在 [ 2 , 1 0 18 ] [2, 10^{18}] [2,1018]范围内

满足序列的个数,最多为

2 x , x = l o g ( 1 0 18 ) / l o g ( k 2 ) 2 ^ x, x = log(10^{18}) / log(k2) 2x,x=log(1018)/log(k2)

k2最大的指数状态数
3 l o g 3 1 0 18 = 37.7 {log_3 10^{18} = 37.7} log31018=37.7 2 38 2^{38} 238
4 l o g 4 1 0 18 = 29.8 {log_4 10^{18} = 29.8} log41018=29.8 2 30 2^{30} 230
5 l o g 5 1 0 18 = 25.7 {log_5 10^{18} = 25.7} log51018=25.7 2 26 2^{26} 226
6 l o g 6 1 0 18 = 23.1 {log_6 10^{18} = 23.1} log61018=23.1 2 23 2^{23} 223

分类讨论下

  • k 2 ≤ 6 {k2 \le 6} k26,其实可以打表(实际上不需要,解空间很小)
  • k 2 ≥ 7 {k2 \ge 7} k27, 状态空间已经很小,可暴力全枚举
def check(v, k):
    while v > 0:
        r = v % k
        if r > 1:
            return False
        v //= k
    return True

def solve():
    k1, k2 = list(map(int, input().split()))
    dp = [0]
    base = k2
    while base <= 10 ** 18:
        dp2 = dp[:]
        for v in dp:
            if check(v + base, k1):
                return v + base
            dp2.append(v + base)
        base = base * k2
        dp = dp2
    return -1

ans = solve()
if ans == -1:
    print ("NO")
else:
    print ("YES")
    print (ans)


F. 小红的数组操作

思路: 树套树

不太确定,出题人是否出于这个想法。

但是无论怎么样,线段树中套平衡二叉树,是一种可行的解法。

当然很多同学,在写题的时候,可能会没意识到这点。

前缀最小,更一般化也可以理解为区间最小,那就是RMQ。

这边是区间查询+点更新操作。

// package lc.temp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.TreeMap;

public class Main {

    static int inf = Integer.MAX_VALUE;

    static class SegTree {
        int l, r, m;
        int minValue;
        public SegTree left, right;
        public SegTree(int ul, int ur) {
            this.l = ul;
            this.r = ur;
            this.m = (l + r) / 2;
            this.minValue = inf;

            if (l == r) {
                return;
            }
            this.left = new SegTree(ul, m);
            this.right = new SegTree(m + 1, ur);
        }

        void update(int p, int v) {
            if (l == r) {
                this.minValue = v;
                return;
            }
            if (p <= m) {
                this.left.update(p, v);
            } else {
                this.right.update(p, v);
            }
            this.minValue = Math.min(this.left.minValue, this.right.minValue);
        }

        int query(int p) {
            if (l == r) {
                return this.minValue;
            }
            if (p >= r) {
                return this.minValue;
            }
            if (m >= p) {
                return this.left.query(p);
            } else {
                return Math.min(this.left.minValue, this.right.query(p));
            }
        }

    }


    public static void main(String[] args) {
        AReader sc = new AReader();
        int t = 1;
        while (t-- > 0) {
            int n = sc.nextInt();
            TreeMap<Integer, Integer>[] ts = new TreeMap[n];
            int[][] arr = new int[n][];
            for (int i = 0; i < n; i++) {
                int m = sc.nextInt();
                ts[i] = new TreeMap<>();
                arr[i] = new int[m];
                for (int j = 0; j < m; j++) {
                    int v = sc.nextInt();
                    ts[i].merge(v, 1, Integer::sum);
                    arr[i][j] = v;
                }
            }

            SegTree segTree = new SegTree(0, n - 1);
            for (int i = 0; i < n; i++) {
                segTree.update(i, ts[i].firstKey());
            }


            int q = sc.nextInt();
            for (int i = 0; i < q; i++) {
                int op = sc.nextInt();
                if (op == 1) {
                    int x = sc.nextInt(), y = sc.nextInt();
                    x--; y--;
                    int v = sc.nextInt();

                    int ov = arr[x][y];
                    if (ov == v) continue;

                    ts[x].computeIfPresent(ov, (a, b) -> b > 1 ? b - 1: null);
                    arr[x][y] = v;
                    ts[x].merge(v, 1, Integer::sum);

                    segTree.update(x, ts[x].firstKey());
                } else {
                    int x = sc.nextInt();
                    x--;
                    int res = segTree.query(x);
                    System.out.println(res);
                }
            }
        }

    }

    static
    class AReader {
        private BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        private StringTokenizer tokenizer = new StringTokenizer("");
        public String nextLine() {
            tokenizer = new StringTokenizer("");
            return innerNextLine();
        }
        public String next() {
            hasNext();
            return tokenizer.nextToken();
        }
        public int nextInt() {
            return Integer.parseInt(next());
        }
        public long nextLong() {
            return Long.parseLong(next());
        }
        private String innerNextLine() {
            try {
                return reader.readLine();
            } catch (IOException ex) {
                return null;
            }
        }
        public boolean hasNext() {
            while (!tokenizer.hasMoreTokens()) {
                String nextLine = innerNextLine();
                if (nextLine == null) {
                    return false;
                }
                tokenizer = new StringTokenizer(nextLine);
            }
            return true;
        }
    }

}

唯一的其他想法是,是否还可以借助其他数据结构实现?


G. 小红的双排列构造

思路: 构造

其实这题的指向很明确

假设存在一个 1   n 的排列 假设存在一个1~n的排列 假设存在一个1 n的排列

然后把剩下的1~n围绕其左右侧,使得正好的排列数为K

策略:

  • 先左侧构建一个 1~N的数组

  • 那右侧天然就是一个1~N的数组

  • 然后从左侧,依次构造 k - 2的排列数

  • 剩下的何如阻断呢?其实打断它的循环节即可


对于特殊的情况,比如k=0,n=1,这些组合需要特判

写了一个很奇怪的代码

import java.io.*;
import java.util.*;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(new BufferedInputStream(System.in));
        int n = sc.nextInt(), k = sc.nextInt();

        if (k == 0) {
            if (n <= 2) {
                System.out.println("-1");
            } else {
                List<Integer> res = new ArrayList<>();
                for (int i = 0; i < n; i++) {
                    res.add(i + 1);
                    res.add(i + 1);
                }
                System.out.println(res.stream().map(String::valueOf).collect(Collectors.joining(" ")));
            }
        } else {
            if (n == 1) {
                if (k == 1) {
                    System.out.println(-1);
                } else if (k==2) {
                    System.out.println("1 1");
                }
            } else if (k == 1) {
                List<Integer> res = new ArrayList<>();
                res.add(1);
                for (int i = 0; i < n; i++) {
                    res.add(i + 1);
                }
                for (int i = 1; i < n; i++) {
                    res.add(i + 1);
                }
                System.out.println(res.stream().map(String::valueOf).collect(Collectors.joining(" ")));
            } else {
                List<Integer> res = new ArrayList<>();
                for (int i = 0; i < n; i++) {
                    res.add(i + 1);
                }
                for (int i = 0; i < k - 2; i++) {
                    res.add(i + 1);
                }
                for (int i = k - 2; i < n; i++) {
                    res.add(n - (i - k + 2));
                }
                System.out.println(res.stream().map(String::valueOf).collect(Collectors.joining(" ")));
            }
        }
    }
}

写在最后

alt

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

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

相关文章

python爬虫,使用pyppeteer异步,爬取,获得指定标签内容

获得指定 #pip install pyppeteer,使用 Pyppeteer&#xff08;异步方案&#xff09; import asyncio from pyppeteer import launch async def main():browser await launch()page await browser.newPage()await page.goto(http://xxx/#/login)# 等待页面加载完成await page…

企业本地部署大型语言模型(LLMs)构建本地垂直领域知识库的策略|空天防御

0 引言 在数字化转型的浪潮中&#xff0c;传统企业面临着前所未有的机遇与挑战。随着大数据、云计算和人工智能技术的发展&#xff0c;企业积累的私有数据成为了潜在的金矿&#xff0c;等待着被挖掘和利用。大型语言模型&#xff08;LLMs&#xff09;作为当前人工智能领域的前…

基于深度学习的手势识别系统

基于深度学习网络的手势识别系统 完整源码数据集报告PPT全套信息 【python设计开发】基于深度学习的手势图像识别处理系统 【包括】代码 PPT 报告 2 需求分析 2.1要求 &#xff08;1&#xff09;用Python语言实现程序设计&#xff1b; &#xff08;2&#xff09;初识深度学习…

个人网站无缝切换图片格式到 webp 或 avif

当你点进来&#xff0c;恭喜你来对地方了&#xff0c;我写的东西从来都是小白向的&#xff08;把自己当小白&#xff09;&#xff0c;不会故作厉害写的云里雾里让人看不懂&#xff0c;既然发出来就会有人看到&#xff0c;不是每个人都是程序员懂技术的。 项目 为什么图片格式要…

QT绘制折现图

做一个小工具,需要根据数据绘制折线图,同时拥有方法缩小拖到等功能 运行结果: 原图: 滚轮缩小 滚轮放大 左移右移 鼠标悬停显示点的坐标 源代码 实现 .pro 使用QChart 加入其对应的模块 QT charts customchartview:继承chartView 重写了鼠标点击,鼠标释放,鼠标移…

MAC +win10 笔记本, OBS 桌面音频不起作用 问题 总结

现象: MAC+WIN10笔记本,音频是好好的,可以听,但是OBS使用的时候,桌面音频条,保持静止,录制的视频,也没有系统声音。 问题排查 1、通常的OBS无法捕获音频解决方法 1)、 驱动问题,更新到最新驱动 2)、声音参数配置问题 3)、右侧小喇叭,音量合成器中, 4)、设…

Midjourney Describe API 的对接和使用

Midjourney Describe API 的对接和使用 Midjourney Describe API 的主要功能是通过上传图片&#xff0c;获取对图片的描述。使用该 API&#xff0c;只需要传递图片文件地址&#xff0c;API 会返回图片的详细描述。无需繁琐的参数设置&#xff0c;即可获得高质量的图片描述。 …

VBA技术资料MF180:将某个文件夹中的某类图片导入Word

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

ssrf实现

一、SSRF &#xff08;Server-side Request Forge, 服务端请求伪造&#xff09; 1、概念&#xff1a; 它是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统。正是因为它是由服务端发起的&#xff0c;所…

SpringBoot项目如何使用和打包本地第三方jar包

有时候我们引用了maven仓库不存在的第三方jar&#xff0c;项目打包后jar包里没有引用的jar&#xff0c;解决方法往下看。 一、目录介绍 SpringBoot项目通过idea打成jar包部署。 将项目打成jar包后&#xff0c;所有引用的jar都存在于BOOT-INF\lib下&#xff1a; 如果存在本地…

HTML静态网页成品作业(HTML+CSS+JS)——迪士尼公主介绍(6个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码&#xff0c;共有6个页面。 二、作品演示 三、代码…

大白话【8】WindowsServer2016搭建DNS服务

1.DNS服务功能介绍 2.DNS服务器搭建 2.0准备环境 2.1把该DNS服务器设置成静态IP 2.2修改主机名&#xff08;可省略&#xff09; 2.3安装DNS服务 DNS服务器名为www&#xff1b;IP为192.168.2.100 3.客户机测试 在网内可网络连通的客户机如何验证DNS服务器域名解析有效性&#…

SparkShop开源商城 uploadFile 任意文件上传漏洞复现

0x01 产品简介 SparkShop开源商城(也被称为星火商城)是一款基于ThinkPHP6和Element UI的开源免费可商用的高性能商城系统。适用于各类电商场景,包括但不限于B2C商城、新零售、分销商城等。无论是初创企业还是成熟品牌,都可以通过SparkShop快速搭建个性化独立商城,实现线上…

机器学习:SVM的代码实现

目录 前言 一、完整代码 二、输出结果 三、实现步骤解析 1.读取数据 2.创建模型并训练 3.可视化SVM结果 总结 前言 支持向量机&#xff08;SVM&#xff0c;Support Vector Machine&#xff09;是一种用于分类和回归的监督学习算法。它的核心思想是通过在特征空间中找到…

全网最适合入门的面向对象编程教程:39 Python 常用复合数据类型-集合

全网最适合入门的面向对象编程教程&#xff1a;39 Python 常用复合数据类型-集合 摘要&#xff1a; 在 Python 中&#xff0c;集合&#xff08;set&#xff09;是一种常用的复合数据类型。集合是一组无序且不重复的元素。与列表和元组不同&#xff0c;集合中的元素是无序的&am…

Webpack中的 HTTP 压缩

http压缩介绍 http压缩&#xff0c;是指一种内置在服务器和客户端之间改进传输速度和带宽利用率的方式。 http 压缩的流程&#xff1a; http 数据在服务器发送前&#xff0c;通过 webpack配置进行压缩&#xff1b;兼容的浏览器在向服务器发送请求时&#xff0c;在请求头中会…

JS Java Script知识简单记录

JS 参考 导入方式 内联样式&#xff0c;和css&#xff08;style&#xff09;很像 script标签导入&#xff0c;可以放在head或body标签中 外联样式 打印内容方式 console.log:在控制台显示 alert&#xff1a;网页弹窗 JS变量 var函数作用域&#xff0c;let是块作用域…

OpenCV杂项图像变换(2)线性混合函数blendLinear()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 执行两个图像的线性混合&#xff1a; dst ( i , j ) weights1 ( i , j ) ∗ src1 ( i , j ) weights2 ( i , j ) ∗ src2 ( i , j ) \texttt{…

FaceFormer嘴形同步论文复现

一、项目地址 https://github.com/EvelynFan/FaceFormer 二、复现过程 1、项目环境 系统&#xff1a;Ubuntu 18.04.1 python版本&#xff1a;Python 3.7 使用conda创建一个虚拟环境&#xff0c;安装requirements.txt中所需要的库 2、安装ffmpeg 教程网址&#xff1a;http…

kafka 入门

kafka 有分区和副本的概念&#xff0c;partition 3 表示有3个分区&#xff0c;replication 2 表示有2个副本 通过 --describe --topic test命令可以知道 test这个 主题的分区和副本情况&#xff0c;途中的replicas 表示 其他副本分区的情况&#xff0c;如第一条&#xff0c;t…