第33次CCF计算机软件能力认证-第4题十滴水

news2024/11/24 1:37:18

题干:

十滴水是一个非常经典的小游戏。

CSP202403-4-0.jpeg

C C C 正在玩一个一维版本的十滴水游戏。

我们通过一个例子描述游戏的基本规则。

游戏在一个 1 × c 1×c 1×c 的网格上进行,格子用整数 x ( 1 ≤ x ≤ c ) x(1≤x≤c) x(1xc) 编号,编号从左往右依次递增。

网格内 m m m 个格子里有 1 ∼ 4 1∼4 14 滴水,其余格子里没有水。

在我们的例子中, c = m = 5 c=m=5 c=m=5,按照编号顺序,每个格子中分别有 2 , 4 , 4 , 4 , 2 2,4,4,4,2 2,4,4,4,2 滴水。

玩家可以进行若干次操作,每次操作中,玩家选择一个有水的格子,将格子的水滴数加一。

任何时刻若某个格子的水滴数大于等于 5 5 5,这个格子里的水滴就会向两侧爆开

此时,这个格子的水被清空,同时对于左方、右方两个方向同时进行以下操作:找到当前格子在对应方向上最近的有水的格子,如果存在这样的格子,将这个格子的水滴数加一。

若在某个时刻,有多个格子的水滴数大于等于 5 5 5,则最靠左的先爆开

在我们的例子中,若玩家对第三格进行操作,则其水滴数变为 5 5 5,故第三格水滴爆开,水被清空,其左侧最近的有水格子(第二格)和右侧最近的有水格子(第四格)的水量增加 1 1 1,此时每个格子中分别有 2 , 5 , 0 , 5 , 2 2,5,0,5,2 2,5,0,5,2 滴水。

此时第二格和第四格的水滴数均大于等于 5 5 5,按照规则,第二格的水先爆开,爆开后每个格子中分别有 3 , 0 , 0 , 6 , 2 3,0,0,6,2 3,0,0,6,2 滴水;最后第四格的水滴爆开,每个格子中分别有 4 , 0 , 0 , 0 , 3 4,0,0,0,3 4,0,0,0,3 滴水。

C C C 开始了一局游戏并进行了 n n n 次操作。

C C C 在每次操作后,会等到所有水滴数大于等于 5 5 5 的格子里的水滴都爆开再进行下一次操作。

C C C 想知道他的水平有多高,于是他想知道每一次操作后还有多少格子里有水。

保证这 n n n 次操作都是合法的,即每次操作时操作的格子里都有水。

输入格式

输入的第一行三个整数 c , m , n c,m,n c,m,n 分别表示网格宽度、有水的格子个数以及操作次数。

接下来 m m m 行每行两个整数 x , w x,w x,w,表示第 x x x 格有 w w w 滴水。

接下来 n n n 行每行一个整数 p p p,表示小 C C C 对第 p p p 格做了一次操作。

输出格式

输出 n n n 行,每行一个整数表示这次操作之后网格上有水的格子数量。

数据范围

对于所有测试数据,

  • 1 ≤ c ≤ 1 0 9 1 \le c \le 10^9 1c109 1 ≤ m ≤ min ⁡ ( c , 3 × 1 0 5 ) 1 \le m \le \min(c,3 \times 10^5) 1mmin(c,3×105) 1 ≤ n ≤ 4 m 1 \le n \le 4m 1n4m
  • 1 ≤ x , p ≤ c 1 \le x,p \le c 1x,pc 1 ≤ w ≤ 4 1 \le w \le 4 1w4
  • 输入的所有 x x x 两两不同;
  • 对于每个输入的 p p p,保证在对应操作时 p p p 内有水。

子任务编号

c ≤ c \le c

m ≤ m \le m

特殊性质

1 1 1

30 30 30

30 30 30

2 2 2

3000 3000 3000

3000 3000 3000

3 3 3

3000 3000 3000

3000 3000 3000

4 4 4

1 0 9 10^9 109

3000 3000 3000

5 5 5

3 × 1 0 5 3 \times 10^5 3×105

3 × 1 0 5 3 \times 10^5 3×105

6 6 6

1 0 9 10^9 109

3 × 1 0 5 3 \times 10^5 3×105

7 7 7

1 0 9 10^9 109

3 × 1 0 5 3 \times 10^5 3×105

特殊性质:在游戏的任意时刻(包括水滴爆开的连锁反应过程中),只有至多一个格子的水滴数大于等于 5 5 5

输入样例:
5 5 2
1 2
2 4
3 4
4 4
5 2
3
1
输出样例:
2
1

这道题读完题就明白我们要使用双链表。因为我们可以很容易地看到水槽里面没有水的格子是没有用的,可以直接删去(题干中每次加水只在左右两边的第一个有水的格子),而且我们要能够访问每一个格子它的左右两边的格子。我们明显还要使用到map<>, 因为可以明显的看见对于给定的每一个序号我们能够得到他的水的滴数。所以我们可以想到要使用map<int , Node*> Node是爽两边节点。

下面代码里面有注释,欢迎又不懂的在评论区留言

#include <bits/stdc++.h>

using namespace std;

const int N = 3e5 + 5;
map<int,int> h; 
// 使用map来进行排序,unordered_map来进行存储
// 题目中样例给的下标是有序的,但是题目中没有说一定是有序的,所以有可能是无序的要先排序。

struct Node {
    int num;
    Node * left;
    Node * right;
};


int main() {
    int c, m, n;
    scanf("%d%d%d", &c, &m, &n);
    for (int i = 0; i < m; i++) {
        int a,b;
        scanf("%d%d", &a, &b);
        h[a] = b;
    }
    
    unordered_map<int,Node*> s;// 里面放Node指针,就可以指向map里面存储的节点。
    Node* node = nullptr;
    
    for(auto it = h.begin() ; it != h.end() ; it++){//存入unordered_map,记录双链表信息
    //指针的调用要用 ->
        Node* new_node = new Node;
        new_node->num = it->second;
        new_node->left = node;
        new_node->right = nullptr;
        s[it->first] = new_node;
        if(it != h.begin())node -> right = new_node;
        node = new_node;
    }
    
    int msize = m;
    for (int i = 0; i < n; i ++ ){
        int k;scanf("%d" , &k);
        node = s[k];
        node->num ++ ;
        if(node->num > 4) 
        {
            while(node){
                if(node->left){
                    node->left->num ++;
                    node->left->right = node->right;
                }
                if(node ->right){
                    node->right->num ++ ;
                    node->right->left = node->left;
                }
                
                msize -- ;
                
                if(node->left && node -> left -> num >4){
                    node = node -> left; continue;
                }
                if(node->right && node -> right -> num > 4){
                    node = node -> right;continue;
                }
                
                break;
            }
        }
        printf("%d\n" , msize);
    }
    
    return 0;
}

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

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

相关文章

Metal之旅——数据

顶点数据 顶点数据&#xff08;Vertex Data&#xff09;是指一系列顶点的集合&#xff0c;这些顶点用于图形渲染管线的输入。每个顶点通常包含位置、颜色、纹理坐标等属性信息 mesh网络 Mesh网络是指metal中通过将不同数量形状的三角形拼在一起覆盖在要绘制图形表面的网络 顶…

007集—— 自动获取图形的外边界(外轮廓)(CAD—C#二次开发入门)

本文只适用于闭合多段线组成的图像,其他情况(圆、弧、椭圆、未封闭line)暂不支持。 效果如下图所示: 原始图: 代码运行后图: 附代码: public class 外轮廓{Database db = HostApplicationServices.WorkingDatabase;[CommandMethod("xx")]public void Demo(…

基于SSM车位租赁系统【附源码】

基于SSM车位租赁系统 效果如下&#xff1a; 注册页面 首页展示 车位租赁订单展示 车位列表页面 公告信息管理页面 公告类型管理界面 研究背景 随着经济的持续增长和城市化进程的加速&#xff0c;土地资源变得日益紧缺&#xff0c;停车难问题已成为许多城市面临的共同挑战。随…

【Redis】List类型的常用命令大全

这里的list列表相当于一个双端队列&#xff0c;也可以认为是双向链表&#xff0c;也可以认为是数组&#xff0c;后续的很多命令都使用到下标。 list的特点&#xff1a; list中的每个元素也都是String类型里面的元素可以重复列表中的元素是有序的&#xff0c;如果里面元素顺序进…

epoll究竟是同步的还是异步的?

简单说一句话&#xff0c;你需要分层看这个事&#xff1a; epoll 这个系统调用&#xff0c;是同步的&#xff0c;也就是必须等待操作系统返回值。 而底层用了 epoll 的封装后的框架&#xff0c;可以是异步的&#xff0c;只要你暴露给外部的接口&#xff0c;无需等待你的返回值…

DDD简介

概述 传统的数据驱动开发模式&#xff0c;View、Service、Dao这种三层分层模式&#xff0c;会很自然的写出过程式代码&#xff0c;这种开发方式中的对象只是数据载体&#xff0c;而没有行为&#xff0c;是一种贫血对象模型。以数据为中心&#xff0c;以数据库ER图为设计驱动&a…

什么是变阻器?

变阻器是一种电子元件&#xff0c;主要用于调整电路中的电阻值&#xff0c;从而实现对电流、电压等电学参数的控制。它在电路中起到非常重要的作用&#xff0c;广泛应用于各种电子设备和实验装置中。 变阻器的主要作用是改变电路中的电阻值。在电路中&#xff0c;电阻值的大小…

二部图简单理解

目录 二部图简单理解 一、定义 二、性质与定理 三、原理举例 四、应用 二部图简单理解 二部图(Bipartite Graph),又称二分图,是图论中的一种特殊模型。以下是对二部图的详细介绍及原理举例: 一、定义 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(…

目标检测or实例分割中AP、MAP的计算

参考链接&#xff1a; 目标检测中AP、MAP的计算_51CTO博客_目标检测map计算 举个例子&#xff1a;

【JVM】内存分析工具JConsole/Visual VM

1 缘起 日常补充JVM调优&#xff0c;调优实践前需要学习一些理论做支撑&#xff0c; JVM调优三步&#xff1a;理论>GC分析>JVM调优&#xff0c; 我们会有一些玩笑话说&#xff0c;做了这么久Java开发&#xff0c;做过JVM调优吗&#xff1f; 做过&#xff0c;面试时。当然…

【深度学习】yolov8n模型的剪枝操作记录

原始 剪枝微调后 可以看到模型大小了&#xff0c; 测试结果显示再cpu 上加速5%-10% from ultralytics import YOLOimport time # Load a pretrained YOLO11n model count_num 500 def test1():model YOLO("/home/justin/Desktop/code/v8_prun/runs/detect/train3/weig…

LC刷题专题:记忆化搜索

文章目录 576. 出界的路径数 本刷题专栏记录自己的记忆化搜索的做题。 576. 出界的路径数 题目链接及描述&#xff1a; https://leetcode.cn/problems/out-of-boundary-paths/description/ 第一次看到这个题目可能先入为主了&#xff0c;首先想到的是使用动态规划做&#xff…

19.安卓逆向-frida基础-hook分析调试技巧1-hookMD5

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。 工…

C#多线程基本使用和探讨

线程是并发编程的基础概念之一。在现代应用程序中&#xff0c;我们通常需要执行多个任务并行处理&#xff0c;以提高性能。C# 提供了多种并发编程工具&#xff0c;如Thread、Task、异步编程和Parallel等。 Thread 类 Thread 类是最基本的线程实现方法。使用Thread类&#xff0…

【题解】【模拟】—— [NOIP2013 普及组] 表达式求值

【题解】【模拟】—— [NOIP2013 普及组] 表达式求值 [NOIP2013 普及组] 表达式求值题目背景题目描述输入格式输出格式输入输出样例输入 #1输出 #1输入 #2输出 #2输入 #3输出 #3 提示 1.简单做法1.1.题意解析1.2.AC代码 2.使用栈的做法2.1.题意解析2.2.AC代码 [NOIP2013 普及组…

C高级--shell脚本实现分支判断

题目&#xff1a; 分支结构结合test指令完成一下编程 1>判断闰年 2>输入一个数判断是否为偶数 3>使用test指令实现等级判断 90--100A 60--89B 0-50C 其他错误 代码如下&#xff1a; #!/bin/bash read -p "请输入一个年份&#xff1a;" year if [ $((y…

Cisco Meraki平台登陆

登陆以下网址 https://n4.meraki.cn/ 输入之前注册的邮箱&#xff0c;点击Next 输入之前注册时输入的密码&#xff0c;注意不是企业邮箱的密码&#xff01; 查看邮箱&#xff0c;将验证码输入&#xff0c;点击Verify&#xff08;验证&#xff09;&#xff0c;此验证码10分…

C语言-文件IO

文件IO I :input 输入&#xff0c;从文件中读取数据到内存 O:output 输出&#xff0c;把数据写入到文件 Linux系统IO 和 c语言标准IO 1、linux系统IO 1.1 简介 linux操作系统把对文件的操作封装成了多个函数&#xff0c;统称为linux系统IO。 文件描述符(File descirptor)…

笔试算法day01

目录 1.除2 2.Fibonacci数列&#xff08;Fib 数列&#xff09; 3.单词搜索 1.除2 除2&#xff01; (nowcoder.com) 算法思路&#xff1a; 只需要对最大的n个偶数进行/2即可。 将所有的偶数存进大根堆中&#xff0c;执行k次操作即可 #include <iostream> #include <…

2024年AI知识库哪家强?8款主流软件对比分析

在当今这个信息爆炸的时代&#xff0c;如何高效地管理、搜索和共享知识成为了一个重要的问题。AI知识库作为一种先进的解决方案&#xff0c;正受到越来越多企业和个人的青睐。本文将对比分析8款主流的AI知识库软件&#xff0c;帮助大家找到最适合自己的工具。 1. HelpLook AI知…