题解:

每一次最短的那块板合并

先装水到溢出

然后合并

代码:

#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. CSRF攻击详解(转)

    原文:http://www.django-china.cn/topic/580/ 一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称 ...

  2. ManyToMany参数(through,db_constraint)

    through : 指定自己写好的第三张表,我们可以给第三张表添加字段了(告诉Django不用建第三张表了,我们都给他配好了) class Book(models.Model): name=model ...

  3. mysql 取当前日期对应的周一或周日

    select subdate(curdate(),date_format(curdate(),'%w')-1)//获取当前日期在本周的周一 select subdate(curdate(),date_ ...

  4. 三个小时学会wordpress模板制作

    最近接了一个项目需要用wordpress建站,版面相对简单,ytkah就琢磨着自己来设计wordpress模板,首页栏目页文章页(很多网站无外乎就这些页面),其中栏目页和首页又很像,都是调用文章列表. ...

  5. Jetty:配置概览-怎么配置Jetty

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/liuy_98_1001/article/details/27544671 Jetty POJO配置 ...

  6. java-基础-【二】内部类与静态内部类

    一.说明 java允许我们在一个类里面定义静态类.比如内部类(nested class).把nested class封闭起来的类叫外部类.在java中,我们不能用static修饰顶级类(top lev ...

  7. Spring源码解析(五)循环依赖问题

    引言 循环依赖就是多个类之间互相依赖,比如A依赖B,B也依赖A,如果日常开发中我们用new的方式创建对象,这种循环依赖就会导致不断的在创建对象,导致内存溢出. Spring是怎么解决循环依赖的问题的? ...

  8. Python扩展之类的魔术方法

    Python中类的魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic method ...

  9. PAT 1105 Spiral Matrix[模拟][螺旋矩阵][难]

    1105 Spiral Matrix(25 分) This time your job is to fill a sequence of N positive integers into a spir ...

  10. 生成对抗网络(Generative Adversarial Network)阅读笔记

    笔记持续更新中,请大家耐心等待 首先需要大概了解什么是生成对抗网络,参考维基百科给出的定义(https://zh.wikipedia.org/wiki/生成对抗网络): 生成对抗网络(英语:Gener ...