给出一个竖着的n个容器每个容器的容积,从上到下分别是1,2,3,4,,n,从某点开始浇水,保证该层满了后水能流向下一层,一层一层,直到不再溢出或者最底下都装满了留到地上去了为之。

给出n个操作/询问

在x点浇p的水

查询x点的水量

这题平妈想的,用并查集来做。

很容易想到暴力的方法,就是,如果是从m点开始浇水,则,我一个一个来处理m以后的点,如果这点点满了就下一个,一直到找到没满的点,慢慢地放置这些水。

这里有个很需要优化的量,我怎么快速知道从某个点开始距离它最近的有水的点位是什么(因为就算后面有的位置是满水的,如果我们走到那个位置,就会把它连成一片)。

可以用并查集实现,如果有一个位置被水填满了的话,就把它和它前一个位置连起来(如果它前一个位置是空的话)

#include <cstdio>
#include <climits>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define in(x)   scanf("%d",&(x))
const int NN=551111;
int f[NN];
int ff[NN];
int par[NN];
void init(int n){for(int i=1;i<=n;i++) par[i]=i;
}
int findx(int x){if(par[x]==x) return x;else return par[x]=findx(par[x]);
}
void unite(int x,int y){x=findx(x);y=findx(y);if(x==y) return;int maxn=max(x,y);int minn=min(x,y);par[minn]=maxn;
}int main(){
#ifndef ONLINE_JUDGEfreopen("G:/in.txt","r",stdin);
#endifint n;//cin>>n;in(n);init(n);for(int i=1;i<=n;i++) cin>>f[i];for(int i=1;i<=n;i++) ff[i]=f[i];int m;//cin>>m;in(m);for(int i=1;i<=m;i++){int kind;cin>>kind;if(kind==1){int p,x;//cin>>p>>x;in(p);in(x);if(x>f[p]){x-=f[p];f[p]=0;if(p>=2 && p<=n && f[p-1]==0){unite(p,p-1);}int st=findx(p)+1;//unite(st,st-1);while(x>=f[st] && st<=n){unite(st,st-1);x-=f[st];f[st]=0;st++;}if(x && st<=n)f[st]-=x;}else if(x<f[p]){f[p]-=x;}else{x=0;f[p]=0;if(p>=2 && p<=n && f[p-1]==0){unite(p,p-1);}}}else{int p;in(p);//cout<<ff[p]-f[p]<<endl;printf("%d\n",ff[p]-f[p]);}}return 0;
}

CF 371D Vessels 【并查集】相关推荐

  1. D. Vessels(并查集+模拟)

    https://codeforces.com/problemset/problem/371/D 题意:给一个从上到下容积依次增大的容器,多次操作,给某个容器倒水,如果这个容器满了就会溢出,直到最后一个 ...

  2. 【CodeForces - 371D】Vessels(思维,元素合并,并查集)

    题干: There is a system of n vessels arranged one above the other as shown in the figure below. Assume ...

  3. CodeForces - 371D Vessels 【并查集】

    Vessels 题意: 自上而下的n个碗,向某个碗中倒水,如果溢出,则会流向它之下的下一个未满的碗.有两种操作:1 p x表示往第p个碗中导入x的水,2 p表示询问此时第p个碗中的水量. 题解: 未经 ...

  4. Codeforces 371D. Vessels【并查集】

    题目大意: 给出一堆从上到下叠起来的容器,有两种操作:第一种是在编号为i的容器中加入x的水(保证水溢出之后会流到下一个最近的容器(如果存在)中):第二种是查询编号为i的容器中有多少水. 做法: 首先, ...

  5. CF思维联系--CodeForces - 218C E - Ice Skating (并查集)

    题目地址:24道CF的DIv2 CD题有兴趣可以做一下. ACM思维题训练集合 Bajtek is learning to skate on ice. He's a beginner, so his ...

  6. D. Vessels(并查集)

    传送门:Problem - 371D - Codeforces. 这题就是给你如上图所示的向下链接的容器,每一层都将给出最大容积. 接下来给出两种操作,第一种为向里面的某一层注入一定水.如果水满了就会 ...

  7. 【CF#505B】Mr. Kitayuta's Colorful Graph (并查集或Floyd或BFS)

    题干: Mr. Kitayuta has just bought an undirected graph consisting of n vertices and m edges. The verti ...

  8. CF 1253D-Harmonious Graph-并查集+贪心

    Description You're given an undirected graph with n nodes and m edges. Nodes are numbered from 1 to ...

  9. Codeforces Round #218 (Div. 2) D. Vessels(思维 并查集)

    题意:从上到下有n个杯子,编号从1到n.每个杯子有一定体积v[i]. 两种操作:1 x y, 向x水杯倒y水; 2 x, 询问x水杯有多少水. (水杯水溢出会往下流) n,q <= 2e5 思路 ...

最新文章

  1. vue对象深拷贝_Vue 对数据对象实现深拷贝赋值
  2. 防火墙firewalld
  3. java 课后习题 月历打印
  4. 漫步凸分析六——凸集的相对内点
  5. MYSQL Too many connections错误的解决办法
  6. 计算机垃圾回收的过程,计算机体系 – 垃圾收集器
  7. G++和C++区别和评测注意事项
  8. 【COCOS2DX-LUA 脚本开发之十二】Hybrid模式-利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)...
  9. 快捷键 自动调整顺序_关于代码自动补全快捷键无法使用的新解决方案
  10. python解释器配置_Python解释器的配置
  11. 获取淘宝服务器时间,用于淘宝、天猫秒杀
  12. 安装 VS2005 安装库 遇到vcredist.msi找不到问题
  13. 《惢客创业日记》2019.01.23(周三) 太苦涩的人生也会让人麻木
  14. office2020与2016版的不同_如何解决Office2020与office2020兼容问题
  15. printf二进制输出
  16. 多传感器融合综述---FOV与BEV
  17. 介绍一个关于小米Zigbee的开源项目
  18. C++ 0xc0000417 错误
  19. JavaScript实现图结构
  20. MATLAB基础--MATLAB图像处理基础

热门文章

  1. 用毕安格将投影坐标的3dmax模型转换为3dtiles
  2. 深入实践 ES6 Proxy Reflect
  3. Git(5) SourceTree安装使用
  4. c++STL 一级、二级空间配置器
  5. 获取图像的Hu不变矩
  6. GD32 ADC功能及代码详解
  7. html5 播放进度,获取并设置HTML5 Video的当前进度
  8. Au 效果器详解:单频段压缩器
  9. 百择电商:抖音什么情况下会被限流?
  10. 「炼丹」AutoDL炼丹日记