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. 智能语音备忘录:SpeechRecognition与gTTS的奇妙融合

    引言:智能语音备忘录的时代已经到来 在这个信息爆炸的时代,我们每天需要处理大量的事务和信息.传统的文字记录方式虽然可靠,但在效率上往往难以满足快节奏生活的需求.想象一下,如果你能在驾车.散步或是灵感突 ...

  2. python基础必练题!!

    水仙花数 水仙花数 info = 3 while info: # 用户输入数字 try: print(f"请输入数字,您有{info}次机会!!") num = int(input ...

  3. Spring AOP面向切面编程 通知类型

    Spring AOP面向切面编程 通知类型 通知分为: 前置通知 执行方法之前通知 后置通知 执行方法之后通知 异常通知 相当于cache里面的内容 最终通知 相当于finally 环绕通知 前四种通 ...

  4. 腾讯CodeBuddy,一款自带MCP市场的编程助手

    今天我发现了一个非常实用的腾讯云编程助手--CodeBuddy.之前它的名称是腾讯云代码助手,但现在已经正式更名为CodeBuddy,并且在更名的同时,其功能也得到了显著增强.今天,我们将详细了解一下 ...

  5. Web前端入门第 45 问:CSS 变量 var() 轻松实现主题换肤功能

    HELLO,这里是大熊的前端开发笔记. 曾经主题切换功能可以作为软件中亮眼的卖点存在,毕竟那时候要实现换肤可不容易,一套主题一套样式,这代码的重复率嗖嗖嗖的就涨上去了~~当然也可以借助 CSS 预编译 ...

  6. HUAWEI USG6505E 如何使用光电互斥口

    1.display ip interface brief 2.display int g0/0/4 查看端口 是否为光电互斥口,并确定端口当前状态 Copper  电口 Fiber 光口 3.inte ...

  7. 网络编程:UDP connect连接

    UDP connect的作用 UDP connect函数的调用,并不会引起像TCP连接那样,和服务器目标端网络交互,并不会触发所谓的"握手"报文发送和应答. UDP套接字进行con ...

  8. 阿里云部署Django主要注意事项

    (1)virtualenv 报错 os 没有 PathLike属性 阿里云ubuntu16.0服务器默认python版本分别是2.7.12,3.5.2,而PathLike是在python 3.6时才被 ...

  9. C#实现SSE通信方式的MCP Server

    前面的课程,我们使用MCP Server,用的是网络上魔搭提供的. 下面我们一起来实现,用C#实现自己的MCP Server. MCP Server通信方式支持SSE.Stdio. 下面我们先实现SS ...

  10. odoo里面的动作

    来源:Odoo中的五种action都是继承自ir.actions.actions模型实现的子类,共有五种,下面会一个一个给出具体例子 1.链接Action(ir.actions.act_url):ta ...