Day10 备战CCF-CSP练习
Day10
题目描述#
十滴水是一个非常经典的小游戏。
小
我们通过一个例子描述游戏的基本规则。
游戏在一个
网格内
在我们的例子中,
玩家可以进行若干次操作,每次操作中,玩家选择一个有水的格子,将格子的水滴数加一。
任何时刻若某个格子的水滴数大于等于
此时,这个格子的水被清空,同时对于左方、右方两个方向同时进行以下操作:找到当前格子在对应方向上最近的有水的格子,如果存在这样的格子,将这个格子的水滴数加一。
若在某个时刻,有多个格子的水滴数大于等于
在我们的例子中,若玩家对第三格进行操作,则其水滴数变为
此时第二格和第四格的水滴数均大于等于
小
小
小
保证这
输入格式#
输入的第一行三个整数
接下来
接下来
输出格式#
输出
数据范围#
对于所有测试数据
; ;- 输入的所有
两两不同; - 对于每个输入的
,保证在对应操作时 内有水。
子任务编号 | 特殊性质 | ||
---|---|---|---|
有 | |||
有 | |||
无 | |||
无 | |||
无 | |||
有 | |||
无 |
特殊性质:在游戏的任意时刻(包括水滴爆开的连锁反应过程中),只有至多一个格子的水滴数大于等于
输入样例:#
5 5 2
1 2
2 4
3 4
4 4
5 2
3
1
输出样例:#
2
1
题目分析#
一道模拟题,根据数据量的不同采用不同形式的数据结构维护格子水滴数量
我们直接来考虑最大的即可
与此同时,我们还要维护水滴的点数,如果超过++
。
那其实,用一个双向链表就可以维护这样一个有头有尾的序列了,清零后相当于要去删除这个点即可,然后再去搜索左面和右面的点,递归维护水滴点数和序列。
对于整个序列而言,长度为
这里代码真正实现的时候,为了方便,我使用了map
直接当作双向链表,因为它可以直接进行关键字的排序,更方便找前序和后继节点,其余部分不变,map
的大小即为答案。
注意:Acwing上要开
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';
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端