Day10

题目描述

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

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

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

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

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

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

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

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

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

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

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

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

小 \(C\) 开始了一局游戏并进行了$ n$ 次操作。

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

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

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

输入格式

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

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

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

输出格式

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

数据范围

对于所有测试数据

  • \(1≤c≤10^9,1≤m≤min(c,3×10^5),1≤n≤4m\);
  • \(1≤x,p≤c,1≤w≤4\);
  • 输入的所有 \(x\) 两两不同;
  • 对于每个输入的 \(p\),保证在对应操作时 \(p\) 内有水。
子任务编号 \(c \le\) \(m \le\) 特殊性质
\(1\) \(30\) \(30\)
\(2\) \(3000\) \(3000\)
\(3\) \(3000\) \(3000\)
\(4\) \(10^9\) \(3000\)
\(5\) \(3×10^5\) \(3×10^5\)
\(6\) \(10^9\) \(3×10^5\)
\(7\) \(10^9\) \(3×10^5\)

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

输入样例:

5 5 2
1 2
2 4
3 4
4 4
5 2
3
1

输出样例:

2
1

题目分析

一道模拟题,根据数据量的不同采用不同形式的数据结构维护格子水滴数量

我们直接来考虑最大的即可

\(c \le 10^9 , m \le 3×10^5\) 很明显,这个数据就是在告诉我们要去离散化有水滴的点

与此同时,我们还要维护水滴的点数,如果超过\(5\),就要清零并且左右都要++

那其实,用一个双向链表就可以维护这样一个有头有尾的序列了,清零后相当于要去删除这个点即可,然后再去搜索左面和右面的点,递归维护水滴点数和序列。

对于整个序列而言,长度为\(m\),所以再怎么做操作,对于\(n\)次的操作,最多就是把整个序列全部清空,也就是扫一遍整个序列,时间复杂度\(O(m)\),而对于其他步骤,一个是找到目标点,为了速度更快,直接使用哈希表存储编号和目标位置即可,另一个是对原有的水滴排序构造双向链表,排序\(O(mlogm)\),构造\(O(m)\),所以算法时间复杂度为\(O(mlogm)\)。

这里代码真正实现的时候,为了方便,我使用了map直接当作双向链表,因为它可以直接进行关键字的排序,更方便找前序和后继节点,其余部分不变,map的大小即为答案。

注意:Acwing上要开\(O(2)\)或\(O(3)\)优化,编译器没做到自动优化会爆内存。其余做过\(O(2)\)优化的就不用了

C++代码实现

#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
using namespace std; int c , m , n;
map<int , map<int , int>::iterator> mp;
map<int , int> s;
int x , w; void dfs(map<int , int>::iterator x)
{ // cout << "x : " << x->first << '\n'; bool flag_pre = (x == s.begin());
bool flag_last = (x == -- s.end()); auto pre = x;
if(!flag_pre) pre --, pre->second ++; auto last = x;
if(!flag_last) last ++ , last->second ++; s.erase(x); // for(auto [k , v] : s)
// cout << v << ' ';
// cout << '\n'; if(!flag_pre && pre->second >= 5)
dfs(pre);
else if(!flag_last && last->second >= 5)
dfs(last); } int main()
{
ios::sync_with_stdio(false);
cin.tie(0) , cout.tie(0); cin >> c >> m >> n;
while (m -- ){
cin >> x >> w;
mp[x] = s.insert({x , w}).first;
} int k;
while(n --)
{
cin >> k;
s[k] ++;
if(s[k] >= 5)
dfs(mp[k]);
cout << s.size() << '\n';
}
}

Day10 备战CCF-CSP练习的更多相关文章

  1. CCF CSP 认证

    参加第八次CCF CSP认证记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四 ...

  2. CCF CSP 201609-2 火车购票

    题目链接:http://118.190.20.162/view.page?gpid=T46 问题描述 请实现一个铁路购票系统的简单座位分配算法,来处理一节车厢的座位分配. 假设一节车厢有20排.每一排 ...

  3. CCF CSP 201703-3 Markdown

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201703-3 Markdown 问题描述 Markdown 是一种很流行的轻量级标记语言(l ...

  4. CCF CSP 201703

    CCF CSP 2017·03 做了一段时间的CCF CSP试题,个人感觉是这样分布的 A.B题基本纯暴力可满分 B题留心数据范围 C题是个大模拟,留心即可 D题更倾向于图论?(个人做到的D题基本都是 ...

  5. CCF CSP 201312-3 最大的矩形

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i( ...

  6. CCF CSP 201609-3 炉石传说

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-3 炉石传说 问题描述 <炉石传说:魔兽英雄传>(Hearthston ...

  7. CCF CSP 201403-3 命令行选项

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201403-3 命令行选项 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些 ...

  8. CCF CSP 201709-4 通信网络

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201709-4 通信网络 问题描述 某国的军队由N个部门组成,为了提高安全性,部门之间建立了M ...

  9. CCF CSP 201409-3 字符串匹配

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201409-3 字符串匹配 问题描述 给出一个字符串和多行文字,在这些文字中找到字符串出现的那 ...

  10. CCF CSP 201503-3 节日

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201503-3 节日 问题描述 有一类节日的日期并不是固定的,而是以“a月的第b个星期c”的形 ...

随机推荐

  1. AutoFac(三)——装配扫描(批量注册之扫描类型)

    一.装配扫描 Autofac允许通过常规组装的方式去注册组件(构造方法.实例.lambda表达式等),您可以扫描和注册单个类型,也可以具体的扫描Autofac模块去注册. 1.扫描类型 除了已知的的常 ...

  2. 轮播图导航组件 | 纯血鸿蒙组件库AUI

    摘要: 轮播图导航(A_SwiperNav):实现沉浸式体验的App全屏轮播引导页效果.可设置图片数据(含文本.图片地址.路由.标题.子标题),可设置按钮颜色. 一.在页面当中调用轮播图导航组件 打开 ...

  3. mssql sqlserver 使用xp_cmdShell运行时,报15281异常的处理办法

    下文讲述 使用xp_cmdshell运行时,出现消息异常的操作方法,如下所示:实验环境:sql server 2008 R2 今天在sql查询管理器中运行xp_cmdshell命令时,出现以下错误现象 ...

  4. C# 中 WebSocket 与 SignalR:实时通信的两种选择

    在现代 Web 应用中,实时通信变得越来越重要.无论是聊天应用.在线游戏.股票行情推送还是协作编辑工具,都需要服务器能够主动向客户端推送数据.在 .NET 生态系统中,WebSocket 和 Sign ...

  5. 第六章: SEO与交互指标

    第6章: SEO与交互指标 在当今的SEO环境中,Google越来越重视用户交互指标,如页面停留时长.交互性能等.本章将深入探讨如何优化网页速度和用户交互体验,以提升SEO效果和用户满意度. 1. G ...

  6. C++ 迭代器(STL迭代器)iterator详解

    要访问顺序容器和关联容器中的元素,需要通过"迭代器(iterator)"进行,迭代器是一个变量,相当于容器和操作容器的算法之间的中介.迭代器可以指向容器中的某个元素,通过迭代器就可 ...

  7. 网络编程:阻塞I/O和线程模型

    线程 进程模型在处理用户请求的过程中,进程切换上下文的代价比较高,而,一种轻量级的模型可以处理多用户连接请求,那就是线程模型. 线程(thread)是运行在进程中的一个"逻辑流", ...

  8. B1071 小赌怡情 (15 分)

    描述 常言道"小赌怡情".这是一个很简单的小游戏:首先由计算机给出第一个整数:然后玩家下注赌第二个整数将会比第一个数大还是小:玩家下注 t 个筹码后,计算机给出第二个数.若玩家猜对 ...

  9. Vue前端开发 转 React 指南

    JSX 先介绍 React 唯一的一个语法糖:JSX. 理解 JSX 语法并不困难,简单记住一句话,遇到 {} 符号内部解析为 JS 代码,遇到成对的 <> 符号内部解析为 HTML 代码 ...

  10. 防抖ref如何在vue中被定义

    本文由 ChatMoney团队出品 为什么ref要实现防抖 在vue的开发过程中,我们通常会使用到ref,但在我们需要对一个频繁的赋值操作做防抖操作时,我们通常只能通过编写一个独立的防抖函数来实现,这 ...