题解:

每一次最短的那块板合并

先装水到溢出

然后合并

代码:

#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的更多相关文章

  1. hdu5575 Discover Water Tank

    题意: 给出个水箱,水箱两侧有无限高的隔板,水箱内有整数高度的隔板将水箱分成n-1份,现在给出m个限制,每个限制表示某个位置的某个高度有水或没水,问最多能同时满足多少个限制.n,m<=2*10^ ...

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

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

随机推荐

  1. 二.re库介绍

    一.re库的主要功能函数 1.re.search()用法 2.re.match()的用法 >>> match=re.match(r'[1-9]\d{5}','BIT 100081') ...

  2. 【Loadrunner】性能测试:通过服务器日志获取性能需求

    性能测试:通过服务器日志获取性能需求          接触过性能测试的童鞋都知道,想要做好一个项目的性能测试,性能需求的获取至关重要~!如果公司有做过性能测试还好,大家可以拿之前的性能测试数据作为参 ...

  3. Sparsity稀疏编码(二)

           为了更进一步的清晰理解大脑皮层对信号编码的工作机制(策略),需要把他们转成数学语言,因为数学语言作为一种严谨的语言,可以利用它推导出期望和要寻找的程式.本节就使用概率推理(bayes v ...

  4. 画柱状图Java

    样例输入:THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.THIS IS AN EXAMPLE TO TEST FOR YOURHISTOGRAM PROGR ...

  5. (17)ClippingNode的使用

    概述 ClippingNode(裁剪节点)可以用来对节点进行裁剪,可以根据一个模板切割图片的节点,生成任何形状的节点显示. ClippingNode是Node的子类,可以像普通节点一样放入Layer, ...

  6. 141. Linked List Cycle(判断链表是否有环)

    141. Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up:Can you sol ...

  7. 如何使用科大 mirrors 加速 pip?

    编辑 ~/.pip/pip.conf 文件(如果没有则创建之),将 index-url 开头的一行修改为下面一行: index-url = https://pypi.mirrors.ustc.edu. ...

  8. MyEclipse优化,解决MyEclipse运行慢、卡顿问题

    工具: myeclipse2015 2.0 最近想用myeclipse做一下测试,发现myeclipse运行非常卡,直接影响代码的开发,而且还出现软件卡退的情况,让我十分恼火.   一.加大JVM的非 ...

  9. ubuntu14.04 安装apache+mysql+php

    1.安装apache sudo apt-get update sudo apt-get install apache2 这时http://你机器的ip,就可以访问了. 2.安装mysql sudo a ...

  10. Python笔记 #12# Dictionary & Pandas: Object Creation

    Document of Dictionaries 10 Minutes to pandas tutorialspoint import pandas as pd data = [['Alex',10] ...