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高度处是否有 ...
随机推荐
- sailsjs入门到精通(一)
sailsjs 官方网站http://sailsjs.com/ 中文网站: http://sailsdoc.swift.ren/ 1 全局安装sails npm install sails@bet ...
- 小米范工具系列之十:小米范SSH批量命令执行工具
小米范SSH批量命令执行工具的主要功能是自动登录多台机器,并执行指定的命令,比如批量抓取shadow.批量获取系统版本.或者做基线时批量抓取配置等. 此工具使用java 1.8以上版本运行. 界面如下 ...
- DNS的MX记录和CNAME记录(转)
MX记录就是邮件域名对邮件服务器(域名)的映射.可以映射到多个邮件服务器,发送时会选择一台发送. 拿到新域名后,还要再查找DNS,将域名转不ip 原文:http://my.oschina.net/u/ ...
- 什么是虚拟DOM?
(摘抄自一篇文章,觉得这里写得非常不错,所以单独放出来,希望能对大家有帮助.)React为啥这么大?因为它实现了一个虚拟DOM(Virtual DOM).虚拟DOM是干什么的?这就要从浏览器本身讲起 ...
- Mysql中datetime和timestamp区别
DATETIME日期和时间的组合.支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'.MySQL以'YYYY-MM-DD HH:MM:SS'格式显示DA ...
- socket套接字TCP协议传输-案例测试
术语: 套接字接口:socket,是一个IP地址和一个端口号的组合,套接字可以唯一标识整个Internet中的一个网络进程. TCP连接:一对套接字接口(一个用于接收,一个用于发送)可定义面向连接的协 ...
- Spark ListenerBus 和 MetricsSystem 体系分析
转载自:https://yq.aliyun.com/articles/60196 摘要: Spark 事件体系的中枢是ListenerBus,由该类接受Event并且分发给各个Listener.Met ...
- [py]python的深拷贝和浅拷贝
Python深复制浅复制or深拷贝浅拷贝 简单点说 copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明 ...
- tcpdump-抓包工具-Linux
环境:VMware-Workstation-12-Pro,Windows-10,CentOS-6.9-x86_64,Xshell5 基本介绍 tcpdump是Linux自带的抓包工具,可以详细看到计算 ...
- django需要了解的
搞得差不多就去看看类和对象,看看oop是什么,多用lambda,学学md5加密. 你应当了解,django不是服务器,只提供服务.因此,学习nginx.或是apache是必要的.(IIS不了解,不过题 ...