YACS 2023年8月月赛 乙组 T3 香槟塔 题解
乙组中比较好的一道思维题。
首先考虑暴力,如果没满就倒满了就往下继续倒,直到倒完或溢出为止,但如果开始就全满然后每次都从最上面倒那么
我们希望找到一个数据结构(当然不是也行)能够快速得到从某个位置向下(包括当前位置)第一个没满的香槟塔,显然并查集。
初始时每个点指向自己,如果它满了就指向下一个,每个杯子只会满一次,所以时间复杂度为
代码:
#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; }
分类:
YACS乙组月赛题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)