博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
269D Maximum Waterfall
阅读量:6341 次
发布时间:2019-06-22

本文共 1344 字,大约阅读时间需要 4 分钟。

题目大意

给出一些墙,水从高往低流,每次只能到达一面墙,选择一个路径,使得路径上的流量的最小值最大。

分析

这是一道经典的扫描线题,我们发现能够合法的线段对数至多只有n对。将一条线段拆成两个点,自左向右排序依次加入set中,按照高度关系将它们相连,详见代码(也可以用线段树做这道题,有时间再补吧qwq)。

代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define sp cout<<"---------------------------------------------------"<
ev;set
>s;vector
g[210000];vector
c[210000];int ans[210000],le[210000],ri[210000];inline int what(int x,int y){ return (min(ri[x],ri[y])-max(le[x],le[y]));}inline int work(int x){ if(ans[x]!=-1)return ans[x]; if(x==1)return inf; int res=0; for(int i=0;i<(int)g[x].size();i++) res=max(res,min(c[x][i],work(g[x][i]))); return ans[x]=res;}int main(){ int n,m,i,H,L,R; scanf("%d%d",&n,&m); n+=2; le[0]=le[1]=-inf; ri[0]=ri[1]=inf; for(i=2;i
>::iterator it= s.insert(make_pair(ev[i].h,ev[i].id)).first; int dw=(--it)->second; it++; int up=(++it)->second; if(g[up].size()&&g[up].back()==dw){ g[up].pop_back(); c[up].pop_back(); } g[up].push_back(ev[i].id); c[up].push_back(what(ev[i].id,up)); g[ev[i].id].push_back(dw); c[ev[i].id].push_back(what(ev[i].id,dw)); } } memset(ans,-1,sizeof(ans)); cout<
<

转载于:https://www.cnblogs.com/yzxverygood/p/9341265.html

你可能感兴趣的文章
python 字符编码
查看>>
269D Maximum Waterfall
查看>>
C++11 多线程
查看>>
sed-加速你在Linux的文件编辑
查看>>
HttpServer发送数据到kafka
查看>>
phpcms站---去除域名绑定目录中的HTML
查看>>
2017-5-3 打印控件、MDI 窗体容器
查看>>
20155303 2016-2017-2 《Java程序设计》第九周学习总结
查看>>
一次很失败的抄底
查看>>
数据结构C++(10)二叉树——链表实现(linkBinaryTree)
查看>>
利用Condition实现多线程交替执行
查看>>
里氏替换原则(设计模式原则2)
查看>>
lamp一键安装
查看>>
解决“iOS 7 app自动更新,无法在app中向用户展示更新内容”问题
查看>>
OpenCV——Haar-like特征
查看>>
HttpWebResponse发送post请求并接收
查看>>
python 相对路径和绝对路径的区别
查看>>
Day36 python基础--并发编程基础5
查看>>
《Python从小白到大牛》第6章 数据类型
查看>>
三层架构的是与非
查看>>