YACS 2023年8月月赛 乙组 T3 香槟塔 题解

题目链接

乙组中比较好的一道思维题。

首先考虑暴力,如果没满就倒满了就往下继续倒,直到倒完或溢出为止,但如果开始就全满然后每次都从最上面倒那么 O(n2) 就超时了。

我们希望找到一个数据结构(当然不是也行)能够快速得到从某个位置向下(包括当前位置)第一个没满的香槟塔,显然并查集。

初始时每个点指向自己,如果它满了就指向下一个,每个杯子只会满一次,所以时间复杂度为 O(n)

代码:

复制代码
#include<iostream>
using namespace std;
int n,q,x,y;
int w[100005],f[100005],fa[100005];
char c;
int find(int x){
    if(fa[x]==x)return x;
    fa[x]=find(fa[x]);
    return fa[x];
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>w[i];
        fa[i]=i;
    }
    fa[n+1]=n+1;
    cin>>q;
    while(q--){
        cin>>c>>x;
        if(c=='A'){
            cin>>y;
            while(x!=n+1&&f[x]+y>w[x]){
                y-=w[x]-f[x];
                f[x]=w[x];
                fa[x]=x+1;
                int fx=find(x);
                x=fx;
            }
            f[x]+=y;
        }else cout<<f[x]<<"\n";
    }
    return 0;
}
复制代码

 

posted @   Xy_top  阅读(86)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示