2019 ICPC World Finals Problem B. Beautiful Bridges

2019 ICPC World Finals Problem B. Beautiful Bridges

Solution

太菜了,sbsbsb题调了一个下午。

首先有一个显然的O(n3)O(n^3)O(n3)dpdpdp,令fif_ifi表示最后一个桥柱在iii的最小代价,枚举上一个桥柱jjj,因为地面超过桥拱则必然存在一个关键点超过桥拱,因此可以暴力O(n)O(n)O(n)判断i..ji..ji..j可不可行,然后转移即可。

然后显然是要优化判断桥柱l,rl,rl,r能否装下lrl~rl r的所有地面的过程,我们知道l,rl,rl,r的桥拱形成了一个圆心为(l+r2,h−r−l2)(\frac{l+r}{2},h-\frac{r-l}{2})(2l+r,h2rl),半径为r−l2\frac{r-l}{2}2rl的圆。那么我们考虑固定rrr,则对于每一个点(x,y)(x,y)(x,y),其可行的lll一定在一个区间范围内,为什么呢?我们可以分两种情况讨论:

  • part1.part\;1.part1. (x,y)(x,y)(x,y)在两个桥柱组成的矩形内部:
    在这里插入图片描述
    这种情况成立的条件显然为h−r−l2≥yh-\frac{r-l}{2}\geq yh2rly,也就是l≥2y−2h+rl\geq 2y-2h+rl2y2h+r。注意此时需满足r−2(h−y)>=xr-2(h-y)>=xr2(hy)>=x,否则(x,y)(x,y)(x,y)不可能出现在矩形区域内,无解。

  • part2.part\;2.part2. (x,y)(x,y)(x,y)在两个桥柱组成的圆内部:
    在这里插入图片描述
    此时必然有(x−l+r2)2+(y−h+r−l2)2≤(r−l2)2(x-\frac{l+r}{2})^2+(y-h+\frac{r-l}{2})^2\leq (\frac{r-l}{2})^2(x2l+r)2+(yh+2rl)2(2rl)2
    整理成关于lll的二次方程:
    l2+(2r−4x−4h−4y)l+4(h−y)(h−y−r)+(2x−r)2≤0l^2+(2r-4x-4h-4y)l+4(h-y)(h-y-r)+(2x-r)^2\leq 0l2+(2r4x4h4y)l+4(hy)(hyr)+(2xr)20
    可解出l∈[l1,l2]l\in[l_1,l_2]l[l1,l2]

我们可以知道的是倘若part1part\;1part1part2part\;2part2的解有交,则交必然为(x,y)(x,y)(x,y)在下半圆的部分,也就是说交的部分必然为[l,l2][l,l_2][l,l2],且倘若part2part\;2part2无解,则part1part\;1part1必然无解。

因此倘若part2part\;2part2无解,那么l∈∅l\in\varnothingl
否则若part1part\;1part1无解,那么l∈[l1,l2]l\in[l_1,l_2]l[l1,l2]
否则l∈[l1,+∞]l\in[l_1,+\infty]l[l1,+]

到这里我们就可以O(1)O(1)O(1)计算一个jjj的可行区间,因此从大到小枚举jjj,对所有可行区间求交,若可行区间[l,r][l,r][l,r]包含了xjx_jxj,则用jjj更新iii的答案即可。

时间复杂度O(n2)O(n^2)O(n2)

Code

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=20005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
ll f[MAXN];
PR a[MAXN];
signed main()
{ll n=read(),h=read(),c1=read(),c2=read();for (int i=1;i<=n;i++) a[i].fi=read(),a[i].se=read(),f[i]=loo;f[1]=c1*(h-a[1].se);for (int i=2;i<=n;i++){double L=a[i].se*2-h*2+a[i].fi,R=a[i].fi,r=a[i].fi;for (int j=i-1;j>=1;j--){ll x=a[j].fi,y=a[j].se,b=-x*4+r*2-y*4+h*4,c=(h-y)*(h-y-r)*4+x*x*4-x*r*4+r*r,d=b*b-c*4;if (d<0) break;if (r-(h-y)*2>=x) upmax(L,(-b-sqrt(d))*0.5),upmin(R,(-b+sqrt(d))*0.5);else upmax(L,(-b-sqrt(d))*0.5);if (L-eps<x&&x<R+eps){ll t=c2*(a[i].fi-x)*(a[i].fi-x)+c1*(h-a[i].se)+f[j];upmin(f[i],t);}}}if (f[n]==loo) puts("impossible");else printf("%lld\n",f[n]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ac 梦幻布丁 启发式合并

题意&#xff1a;中文题。 对于每种颜色&#xff0c;我们都可以看成一个集合。让后把一种颜色变成另一种颜色就转换成了把两个集合的合并问题。显然我们有一个复杂度为O(NlogN)O(NlogN)O(NlogN)的启发式合并能完美的解决这个问题。 解决合并问题了&#xff0c;现在需要解决如何…

VS Code 1.35 发布!全新 logo 来临,远程开发进入稳定版

近期&#xff08; 北京时间 2019 年 6 月 6 日 &#xff09;&#xff0c;微软发布了 Visual Studio Code 1.35 版本&#xff0c;带来了众多更新。全新的 logo全新的图标来啦~ 这一次的图标更新历时两个月&#xff0c;VS Code 团队倾听了用户们的反馈。大家对新图标还喜欢吗&…

P2617 Dynamic Rankings 整体二分

树套树板子题&#xff0c;但是整体二分不管是时间复杂度还是空间复杂度都表现更优秀&#xff0c;所以用整体二分来水一波。 普通的整体二分是没有修改操作的。然鹅我们处理修改操作也比较容易&#xff0c;直接减上这个数&#xff0c;让后加上修改之后的数即可。这样按照时间戳来…

2019 ICPC World Finals Problem J. Miniature Golf

2019 ICPC World Finals Problem J. Miniature Golf Solution 设lll为l0l_0l0​时iii的总分为si,l0s_{i,l_0}si,l0​​&#xff0c;si,l0∑kmin(ai,k,l0)s_{i,l_0}\sum_k min(a_{i,k},l_0)si,l0​​∑k​min(ai,k​,l0​)&#xff0c;让lll从小到大依次变化&#xff0c;可以发…

基于Domain Driven Design&Clean Architecture原则分层的新启动模板

本文的内容将在0.18.0中发布. Abp中文网将同步更新框架.敬请期待...MVC应用程序启动模板介绍MVC应用程序启动模板是基于领域驱动设计(DDD)分层(或根据偏好分层)的应用程序结构.在这篇文档中详细介绍了解决方案结构和项目参阅ASP.NET Core MVC 模板入门创建此模板的新解决方案并…

CF 1475 F . Unusual Matrix 思维

传送门 大体题意&#xff1a;给定两个矩阵a和b&#xff0c;给定一个操作&#xff0c;这个操作可以将a矩阵任意一行或者任意一列取反&#xff0c;问能否将a变成b。 乍一看不是一个很难的题&#xff0c;但是想我这样思维不好的还是看不出来什么东西。让后看到了题解前几句话 “ …

NEERC 17 Problem I. Interactive Sort

NEERC 17 Problem I. Interactive Sort Solution 当写了两倍正解的代码使用了两倍于正解的操作步数…… 刚开始的想法是求出一个bbb&#xff0c;再求出一个aaa&#xff0c;依次轮换&#xff0c;分别维护当前知道确定值的a,ba,ba,b的有序序列&#xff0c;然后求aaa就在bbb的有…

.Net Core 微服务容器系列基础目录篇

1.开场白HI&#xff0c;各位老铁&#xff0c;大家端午好&#xff0c;之前写了些关于.net core商城系列的文章&#xff0c;有点乱&#xff0c;今天心血来潮想着整理一下&#xff08;今天只是先把目录列出来&#xff0c;后面的每篇文章这两天会进行重新修改的&#xff0c;目前先将…

CF 1475 D. Cleaning the Phone 思维模型

传送门 题意&#xff1a;一个人有n个程序&#xff0c;每个程序都有占的缓存和价值。现在要释放m及以上的缓存&#xff0c;求失去的价值的最小值。 题解 首先我们知道如果所有缓存加起来 < m 的话&#xff0c;直接输出 - 1 就行啦。 其次呢&#xff0c;我们发现价值只有1和2…

NEERC 17 G.The Great Wall

NEERC 17 G.The Great Wall Solution 这题的第一步tricktricktrick是&#xff1a;我们注意到取a,b,ca,b,ca,b,c的集合两两不交且并集为UUU&#xff0c;因此确定了b,cb,cb,c之后可以简单地唯一确定aaa&#xff0c;于是我们通过让bi−ai,ci−ai,Ans∑aib_i-a_i,c_i-a_i,Ans\sum…

感谢诸君的陪伴,见证微信 SDK 的成长,内含黑科技福利

Senparc.Weixin SDK5000Stars5000 Star5005005000 Stars今天 SDK 已经超过 5000 Stars在此感谢大家的每一份支持和一直以来的关注是你们的信任和陪伴给了我们前行的力量 在未来的日子里也希望大家能够继续支持我们我们将以优秀的产品和服务来回馈你们的支持&#xff01;愿我们携…

NEERC13 Problem H.Hack Protection

NEERC13 Problem H.Hack Protection Solution 注意到题目中的区间与&#xff0c;在左端点lll确定的情况下&#xff0c;对于所有r≥lr\geq lr≥l&#xff0c;ANDl,rAND_{l,r}ANDl,r​只有logloglog种取值&#xff0c;这是一个极为常见的性质。 于是我们从大到小枚举lll&#…

ABC 189 E - Rotate and Flip 矩阵转移

传送门 题意&#xff1a;给定n个点&#xff0c;m个操作&#xff0c;n和m都是1e5级别的。让后每个操作是将这个点绕原点顺时针、逆时针转90&#xff0c;将这个点按照 x p 或着 y p 做对称。再有q个询问&#xff0c;q也是1e5级别的。让后每个询问是问B这个点在第A次操作之后在…

我,宇宙最强编辑器,支持远程开发

Visual Studio Code 五月份更新之 1.35 版本已发布。此次更新的亮点包括更新 Visual Studio Code 图标 - 新版本更新了 logo。改进“转到定义&#xff08;Go to Definition&#xff09;”行为 - 通过多个定义的显示&#xff0c;更快速进行导航&#xff08;Navigation&#xff0…

ARC068C - Snuke Line

ARC068C - Snuke Line Description 其实就是给出nnn个区间[li,ri][l_i,r_i][li​,ri​]对于每一个i∈[1,M]i\in[1,M]i∈[1,M]&#xff0c;求&#xff1a; ∑j1n[⌊rji⌋−⌊lj−1i⌋≥1]\sum_{j1}^n[\lfloor \frac{r_j}{i}\rfloor-\lfloor \frac{l_j-1}{i}\rfloor\geq 1]j1∑…

.NET Core Run On Docker By Kubernetes 系列文章汇总

前言介绍.NET Core是微软新一代主力编程平台&#xff0c;开源、免费、跨平台、轻量级、高性能&#xff0c;支持Linux、Docker、k8s等环境&#xff0c;适合开发微服务、云原生、大型互联网应用、全开源解决方案。Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们…

HDU - 1811 Rank of Tetris 并查集 + 拓扑序 +me

link 题意&#xff1a; 首先看到排名自然想到拓扑序&#xff0c;但是存在等于的情况&#xff0c;这就启发我们把等于的情况缩成一个点&#xff0c;让后在缩点后的图中进行拓扑即可。 对于不合法的情况当然是拓扑序没有遍历到应该遍历的点&#xff0c;所以只需要检查遍历了几个…

[ARC072C]Alice in linear land(dp,贪心)

[ARC072C]Alice in linear land Description 给定a1...ana_1...a_na1​...an​和DDD&#xff0c;mmm轮询问&#xff0c;每轮询问给你一个qqq&#xff0c;可以让你任意修改aqa_qaq​的值&#xff0c;然后从小到大对于每一个iii让Dmin(D,D−ai)Dmin(D,D-a_i)Dmin(D,D−ai​)&am…

.NET Core 中使用 Humanizer 显示友好时间格式

今天在将一个 .net framework 项目迁移至 .net core 的过程中&#xff0c;在迁移到显示友好时间格式&#xff08;比如“1分钟前”&#xff0c;“1小时前”&#xff09;的代码时&#xff0c;找了找看有没有对应的开源库&#xff0c;结果找到了 Humanizer &#xff0c;顺手体验了…

Codeforces Round #698 (Div. 2)

B题 题意&#xff1a;定义一个牛逼的数是这个数十进制中至少包含一个数d。 现在给定d和若干询问&#xff0c;每个询问一个x&#xff0c;问x能否分解成若干d构成的牛逼的数之和。 看起来挺难搞的&#xff0c;不能快速的判断是否是牛逼的数而且也不能很好的挑选合适的数组成x。那…