不妨假定初始答案为所有的无水询问,因为这样一定没有冲突。

然后枚举有水询问、水位线到这里时,答案能否更优。

若水位线达到某一高度,则可能淹没旁边的水箱,那么实际就变成了一个大水箱,所以考虑用并查集来优化,为保证合并顺序正确,先对有水询问按水位高度排序。

下面思考更新答案,朴素的做法是枚举此水位线下的有水询问和无水询问的差,但实际上因为有水询问的水位高度已经排序,我们会做大量重复枚举,所以考虑排序后来做,但是因为有合并操作,所以考虑用左偏树来维护无水询问。

时间复杂度O(α(n) + mlogm)

#include <bits/stdc++.h>using namespace std;#define N 100010
#define INF INT_MAX
int n,m,l_b[N],r_b[N],l_t[N],r_t[N],x[N],o[N];int tot,v[N*2],l[N*2],r[N*2],d[N*2],heap[N*2];struct node
{int x,y;bool operator<(const node&b) const{return y == b.y ? x < b.x : y < b.y;}
}q[N*2];
int cnt,ans;
int fa[N];int merge(int x,int y)
{if(!x)return y;if(!y)return x;if(v[x] > v[y])swap(x,y);r[x] = merge(r[x],y);if(d[l[x]] < d[r[x]])swap(l[x],r[x]);d[x] = d[r[x]] + 1;return x;
}inline int init(int x)
{tot++;v[tot] = x;l[tot] = r[tot] = d[tot] = 0;return tot;
}inline int insert(int x,int y)
{return merge(x,init(y));
}inline int top(int x)
{return v[x];
}inline int pop(int x)
{return merge(l[x],r[x]);
}int getfa(int x)
{if(x == fa[x])return x;fa[x] = getfa(fa[x]);return fa[x];
}void mergeSet(int _x,int _y)
{_x = getfa(_x);_y = getfa(_y);if(_x == _y)return;fa[_x] = _y;if(_x < _y){l_b[_y] = l_b[_x];r_t[l_t[_x]] = _y;l_t[_y] = l_t[_x];}else{r_b[_y] = r_b[_x];l_t[r_t[_x]] = _y;r_t[_y] = r_t[_x];}heap[_y] = merge(heap[_x],heap[_y]);x[_y] += x[_x];o[_y] += o[_x];
}int main()
{int t;cin >> t;for(int ii = 1; ii <= t; ii++){ans = cnt = tot = 0;cin >> n >> m;memset(heap,0,sizeof(heap));memset(o,0,sizeof(o));memset(x,0,sizeof(x));int _x,_y,_z,_h;l_b[1] = INF;r_b[n] = INF;l_t[n] = n-1;for(int i = 1 ; i < n; i++){scanf("%d",&_x);l_b[i+1] = r_b[i] = _x;<span style="white-space:pre">                </span>//合并时需要的信息l_t[i] = i - 1;r_t[i] = i + 1;}for(int i = 0; i < m; i++){scanf("%d%d%d",&_x,&_y,&_z);if(_z == 0){ans++;heap[_x] = heap[_x] ? insert(heap[_x],_y) : init(_y);}else{cnt++;q[cnt].x = _x;q[cnt].y = _y + 1;}}for(int i = 1; i <= n; i++)fa[i] = i;sort(q+1,q+1+cnt);for(int i = 1; i <= cnt; i++){_h = q[i].y;_x = q[i].x;_x = getfa(_x);while(_h > l_b[_x]){mergeSet(l_t[_x],_x);_x = getfa(_x);}while(_h > r_b[_x]){mergeSet(r_t[_x],_x);_x = getfa(_x);}while(heap[_x] && top(heap[_x]) < _h) {   //x,o数组统计无水 有水询问的和heap[_x] = pop(heap[_x]);x[_x]++;}o[_x]++;if(o[_x] >= x[_x]) {ans += (o[_x] - x[_x]);o[_x] = x[_x] = 0;}}printf("Case #%d: %d\n",ii,ans);}return 0;
}

HDU 5575 Discover Water Tank 并查集+左偏树相关推荐

  1. HDU 5575 Discover Water Tank 并查集 树形DP

    题意: 有一个水槽,边界的两块板是无穷高的,中间有n-1块隔板(有高度),现有一些条件(i,y,k),表示从左到右数的第i列中,在高度为(y+0.5)的地方是否有水(有水:k = 1),问最多能同时满 ...

  2. hdu 5575 Discover Water Tank(可合并堆)

    题目链接:hdu 5575 Discover Water Tank 题意: 有一个大水箱,里面有N-1个隔板,将这个大水箱分成了N个小水箱,每个隔板有一定的高度. 现在有m条信息,每条信息表示第x个水 ...

  3. hdu 5575 Discover Water Tank 左偏树

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5575 题意: 现在有一个巨大的水库(可视为二维的),水库中间被 n−1n-1n−1 个挡板分成了 n ...

  4. HDU 5575 Discover Water Tank

    原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=5575 把每个水箱当作一个并查集,每个无水的探测当做一个左偏树.有水的探测则放在数组中.并用一个数组使水 ...

  5. 树形DP+并查集+左偏树, HDU-5575,Discover Water Tank,2015上海现场赛D题

    只是ACM/IICPC 2015 上海区域赛的一道题.原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=5575 题目描述 N-1个木板把一个水箱划分成了N ...

  6. HDU 5575 Discover Water Tank(线段树+自底向上dp+并查集)

    题意 给定n个挡板和m次回答,每次回答为x号水池的H+0.5高度是否有水,问这些回答互不矛盾的最大集合. 题解 设定状态dp[i][0-1]代表第i个区间枚举到当前回答后有水的最大不矛盾集合和没水的最 ...

  7. HDU 5575 Discover Water Tank(左偏树)

    https://vjudge.net/problem/HDU-5575 题意: 有一个水箱,被n-1块板子分成了n个部分,板子的高度不尽相同.现在有m次探测,每次探测在第x部分的y+0.5高度处是否有 ...

  8. HDU5575 Discover Water Tank 2015上海现场赛D题 (树形dp,并查集,左偏树)

    题目大意: 有一个1维的长度为N,高度无限的水柜,现在要用N-1个挡板将其分为N个长度为1的小格,然后向水柜中注水,水可以低于挡板也可以以溢出去(这样就要与旁边格子的水位相同),现在有M次探测,探测i ...

  9. HDU 1512 Monkey King 左偏树 + 并查集

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1512 题意:有n个猴子,一开始每个猴子只认识自己.每个猴子有一个力量值,力量值越大表示这个猴子打架越厉害. ...

最新文章

  1. 2010提高组-乌龟棋 [记忆优化搜索]
  2. 使用scipy实现简单神经网络
  3. Python Django HttpResponse响应对象
  4. VC内存泄露检查工具:Visual Leak Detector
  5. qt绘制一圈圆_Qt绘制圆
  6. 基于ConvLSTM的伦敦空气质量预测(1) 数据处理
  7. Cheatsheet: 2013 04.01 ~ 04.16
  8. 高中计算机网络说课,高一信息技术说课稿
  9. JSON_UNQUOTE 和JSON_EXTRACT 的简单认识
  10. 用Python实现温度转换程序
  11. python cnn 回归模型_【深度学习系列】CNN模型的可视化
  12. AE2022 Ver22.3内容更新点汇总 一文了解AE2022最新版本
  13. 声纹识别:自监督学习语音识别利于声纹识别Why does Self-Supervised Learning for Speech Recognition Benefit Speaker Recogni
  14. VUE 项目更新部署时,浏览器页面缓存问题
  15. linux网络编程中端口号和ip地址转换方法
  16. 盘点那些恶搞C++小程序
  17. React-Cropper实现图片裁剪
  18. 【简单数学】【NOIP 20008】笨小猴
  19. 编译原理chatpter04 文法的形式和文法的类型
  20. c++ 十六进制转字符串(ASCII码)

热门文章

  1. 深度学习100问之深度学习的本质
  2. 手机相机识别实现ar测距(AR尺子)
  3. 计算机组成中的阶符是什么意思,计算机中阶符,阶码,数符,尾数是什么?
  4. mysql中 translate_mysql实现oracle的decode和translate以及管道符拼接
  5. 朗润国际期货招商:历次科技风头下巨头的博弈
  6. Unity学习之预制件变体
  7. 什么是比特币之简单直白解释
  8. 岂止于跨境,独立站在国内市场的萌芽与发展态势
  9. 一进商场就迷路?谷歌用AR拯救路痴,起底室内导航黑科技
  10. 合盖计算机后,外接显示器不休眠