hdu5575
题解:
每一次最短的那块板合并
先装水到溢出
然后合并
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int,int> mp;
const int N=;
vector<mp> vec;
int LH[N],RH[N],L[N],R[N],O[N],X[N],heap[N],l[N],r[N],dist[N];
int T,kase,v[N],f[N],tot,n,m,x,y,z;
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
int merge(int x,int y)
{
if (!x||!y)return x+y;
if (v[x]>v[y])swap(x,y);
r[x]=merge(r[x],y);
if (dist[l[x]]<dist[r[x]])swap(l[x],r[x]);
dist[x]=dist[r[x]]+;
return x;
}
void Union(int x,int y)
{
x=find(x);y=find(y);
if (x==y)return;
f[y]=x;
if (x<y)
{
RH[x]=RH[y];
L[R[x]]=x;
R[x]=R[y];
}
else
{
LH[x]=LH[y];
R[L[x]]=x;
L[x]=L[y];
}
heap[x]=merge(heap[x],heap[y]);
X[x]+=X[y];
O[x]+=O[y];
}
int pop(int x){return merge(l[x],r[x]);}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
int ans=;LH[]=RH[n]=1e9;L[n]=n-;
for (int i=;i<n;i++)
{
scanf("%d",&RH[i]);
LH[i+]=RH[i];
L[i]=i-;R[i]=i+;
}
vec.clear();
memset(heap,,sizeof(heap));
tot=;
while(m--)
{
scanf("%d%d%d",&x,&y,&z);
if (z)vec.push_back(mp(y+,x));
else
{
++ans;
v[++tot]=y;
l[tot]=r[tot]=dist[tot]=;
heap[x]=heap[x]?merge(heap[x],tot):tot;
}
}
for (int i=;i<=n;i++) f[i]=i;
sort(vec.begin(),vec.end());
for (int i=;i<=n;i++) O[i]=X[i]=;
for (int i=;i<vec.size();i++)
{
int x=find(vec[i].second),y=vec[i].first;
while(y>LH[x])Union(x,L[x]),x=find(x);
while(y>RH[x])Union(x,R[x]),x=find(x);
while(heap[x]!=&&v[heap[x]]<y)
{
heap[x]=pop(heap[x]);
++X[x];
}
if (++O[x]>=X[x])
{
ans+=(O[x]-X[x]);
O[x]=X[x]=;
}
}
printf("Case #%d: %d\n",++kase,ans);
}
}
hdu5575的更多相关文章
- hdu5575 Discover Water Tank
题意: 给出个水箱,水箱两侧有无限高的隔板,水箱内有整数高度的隔板将水箱分成n-1份,现在给出m个限制,每个限制表示某个位置的某个高度有水或没水,问最多能同时满足多少个限制.n,m<=2*10^ ...
- HDU 5575 Discover Water Tank(左偏树)
https://vjudge.net/problem/HDU-5575 题意: 有一个水箱,被n-1块板子分成了n个部分,板子的高度不尽相同.现在有m次探测,每次探测在第x部分的y+0.5高度处是否有 ...
随机推荐
- CentOS 6.4下Squid代理服务器的安装与配置(转)
add by zhj: 其实我们主要还是关注它在服务器端使用时,充当反向代理和静态数据缓存.至于普通代理和透明代理,其实相当于客户端做的事,和服务端没有什么关系.另外,Squid的缓存主要是缓存在硬盘 ...
- Shell特殊变量介绍与实践 $0
2.$0特殊变量的作用及变量实践$0的作用为取出执行脚本的名称(包括路径) ,下面是该功能的实践.范例4-4:获取脚本的名称及路径. [root@salt-client- sh1]# cat n1.s ...
- ROS,launch学习
想象一下,如果一个ros工程里包含几十个节点,我们在命令行窗口一个个的开启它们,是一件多么耗时间,多么没有意义的浪费. launch功能可以解决这一问题,启动launch文件时ROS中非常重要的,有用 ...
- HDU1796How many integers can you find(容斥原理)
在计数时,必须注意无一重复,无一遗漏.为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计 ...
- 感知机PLA算法实现[转载]
转自:https://blog.csdn.net/u010626937/article/details/72896144#commentBox 1.实现原始形式 import numpy as np ...
- PAT 1132 Cut Integer[简单]
1132 Cut Integer(20 分) Cutting an integer means to cut a K digits lone integer Z into two integers o ...
- mysql++使用
Mysql++是官方发布的.一个为MySQL设计的C++语言的API.Mysql++为Mysql的C-Api的再次封装,它用STL(Standard Template Language)开发并编写,并 ...
- Status Code状态码详解对照表
状态码 含义 100 客户端应当继续发送请求.这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝.客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应.服务器必须在 ...
- 手把手教你学node.js 之使用 eventproxy 控制并发
使用 eventproxy 控制并发 目标 建立一个 lesson4 项目,在其中编写代码. 代码的入口是 app.js,当调用 node app.js 时,它会输出 CNode(https://cn ...
- Linux_Chrome出现Adobe Flash Player is out of date解决方法
在安装Google的Chrome后都有出现Adobe Flash Player is out of date的问题. Chrome浏览器用的播放器插件是PepperFlashPlayer.而且是内置的 ...