首页 > 其他分享 >Day10 备战CCF-CSP练习

Day10 备战CCF-CSP练习

时间:2024-10-21 09:31:49浏览次数:1  
标签:10 last 格子 水滴 爆开 Day10 操作 CCF CSP

Day10

题目描述

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

CSP202403-4-0.jpeg

小 \(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';
    }
}

标签:10,last,格子,水滴,爆开,Day10,操作,CCF,CSP
From: https://www.cnblogs.com/mathblog/p/18488359

相关文章

  • CSP2024 前集训:多校A层冲刺NOIP2024模拟赛08
    前言先痛骂没良心出题人,T1\(n\sqrtn\)多大你刚好给多大,一点不多给,T2才是签到题,因为放了T2位置打了暴力就去想T3了,我是唐氏,谁让你T1、T2swap的?T3实则三道题。但是还是感觉T1更简单啊,\(5e4\)搁哪儿摆着呢一眼\(O(n\sqrtn)\),甚至空间也是这么多,太明显了。挂分挂......
  • 对于 CF,AT,CSP-S,NOIP,我想说
    尽管我是div2一题水平,但是......
  • CSP-S前总复习
    里面大概有一两个星期吧,挑一些有价值的写。[ABC369F]GatherCoins来补的题目。先考虑不输出方案的写法。排序过后可以用一个DP实现。注意到DP的转移方程只和max有关,所以可以用数据结构优化。排序过后保证横坐标不降,所以只需要对纵坐标开一个树状数组,维护最大值,能做到......
  • CSP 模拟 51
    A排列最小生成树(pmst)首先想到\(n^2\)建边的做法,然后最小生成树的所有边权都小于\(n\),直接从头到尾连都能轻松满足这个。所以很多边是无用的,只要找边权小于\(n\)的边即可。所以对于位置差和权值差在\(\sqrtn\)以下的都找一遍即可,然后桶排跑MST即可。赛时根号都写脸......
  • 『模拟赛』信友队2024CSP-S第二轮(复赛)模拟赛
    Rank意外地好A.坦白签。首先对\(m=0\)很好求,正着跑一遍就行。接着考虑\(m\lt0\)时什么时候遗忘会更优。发现是\(\oplus\)操作,因此答案为偶时(即事件为奇时)遗忘会使答案+1。为判断是否比原先优,我们提前处理出后缀和即可。这题关键在想出一个性质,\(m=i\)是由\(m=i-......
  • csp2024 游记
    前言今年赛前这段时间或许算得上是我OI生涯中最摆的一段时间了。每天到机房无非就是胡乱的看一些题,趴在桌子上,或者是写whk作业。当然这可能也和最近的状态有关。或许我也只有在刚开始的那几天的在线的,其它时候基本上啥都没干。本来今年是不太想停课的,可最终因为种种原因还是......
  • 信友队2024CSP-S第二轮(复赛)模拟赛
    2024CSP-S第二轮(复赛)模拟赛\(T1\)A.坦白\(30pts\)部分分\(30pts\):爆搜。点击查看代码llans[300010];chars[300010];intmain(){freopen("confess.in","r",stdin);freopen("confess.out","w",stdout);llt,n,cn......
  • csp-s 模拟 12
    csp-s模拟12T小h的几何whk我能说什么呢...T小w的代数仙人掌,DP,计数题本题部分分较有启发意义考虑是一棵树怎么做注意到\(n\)比较小,直接想想比较暴力的做法,可以用\(O(n^2)\)的复杂度枚举起点和终点,而由于是一棵树,两点之间的路径是唯一的,并且本题要求点集不重,......
  • 【信奥赛·C++基础语法】CSP-J C++ STL 标准模板库 - 算法
    序言标准模板库(STL)的算法部分提供了一系列强大的工具,用于对各种容器中的数据进行操作。这些算法可以大大提高编程效率,减少代码重复,使程序更加简洁、高效和可读。无论是处理简单的数据结构还是复杂的大规模数据,STL算法都能发挥重要作用。一、STL算法的分类排序算法快速......
  • [DMY]2024 CSP-S 模拟赛 Day 18
    今天打的虽然有遗憾,但是也在情理之中。赛时看了眼T1,没有别人的犹豫,第一眼就看到了\(n\le5000\),然后开始写最短路。算了一下dijkstra根本跑不满,无需deque的01bfs。写完以后大概40min,改一下longlong就扔了。赛后没挂,100pts。T2一开始没有思路,在纸上画画图感觉可以......