BZOJ2567 : 篱笆
设第$i$个区间的左端点为$a[i]$,区间长度为$len$,要覆盖的部分的长度为$all$,因为区间左端点递增,所以最优方案中它们的位置仍然递增。
对于链的情况,要满足三个条件:
1. 区间$i$可以接上区间$i-1$
设$f[i]$表示最优解中第$i$个区间左端点的位置,则$f[i]=\min(f[i-1]+len,a[i]+ans)$且$f[i]\geq a[i]-ans$。
所以$ans\geq\max(a[i]-f[i])=\max(a[i]-a[j]-ans-(i-j)\times len)$,
即$ans\geq\frac{\max(a[i]-a[j]-(i-j)\times len)}{2}(l\leq j\leq i\leq r)$。
2. 可以覆盖位置$0$
即$f[l]\leq 0$,所以$a[i]+ans-(i-l)\times len\leq 0$,
故$ans\geq\max(a[i]-(i-l)\times len)$。
3. 可以覆盖位置$all$
即$f[r]\geq all-len$,所以$a[i]+ans+(r-i)\times len\geq all-len$,
故$ans\geq\max(all-len-a[i]-(r-i)\times len)$。
对于环的情况,只需要把区间复制一份,那么只需要满足条件1就能保证没有死角:
即$ans\geq\frac{\max(a[i]-a[j]-(i-j)\times len)}{2}(l\leq j\leq i\leq r)$,
且$ans\geq\frac{\max(a[i]+all-a[j]-(r-l+1-(j-i))\times len)}{2}(l\leq i<j\leq r)$。
以上所有信息都可以通过线段树进行区间合并,时间复杂度$O(m\log n)$。
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=120010,M=262150,BUF=30000000;
const ll inf=1LL<<60;
int T,n,m,type,i,x,y;ll all,r,len,a[N],b[N],ans;bool flag;char Buf[BUF],*buf=Buf;
struct P{
ll v,w,ma,mi;
void set(ll b){v=w=0,ma=mi=b;}
P operator+(const P&b){
P c;
c.v=max(max(v,b.v),b.ma-mi);
c.w=max(max(w,b.w),ma-b.mi);
c.ma=max(ma,b.ma);
c.mi=min(mi,b.mi);
return c;
}
}v[M],val;
inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
inline void read(ll&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
void build(int x,int a,int b){
if(a==b){v[x].set(::b[a]);return;}
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b);
v[x]=v[x<<1]+v[x<<1|1];
}
void ask(int x,int a,int b,int c,int d){
if(c<=a&&b<=d){
if(!flag)val=v[x];else val=val+v[x];
flag=1;
return;
}
int mid=(a+b)>>1;
if(c<=mid)ask(x<<1,a,mid,c,d);
if(d>mid)ask(x<<1|1,mid+1,b,c,d);
}
inline void query(int x,int y){
flag=0;
ask(1,1,n,x,y);
if(type==1){
ans=val.v;
ans=max(ans,(val.ma+len*x)*2);
ans=max(ans,(all-len-val.mi-len*y)*2);
}else ans=max(val.v,val.w-len*(y-x+1)+all);
printf("%lld.%lld0000\n",ans/2,ans%2*5);
}
int main(){
fread(Buf,1,BUF,stdin);read(T);
while(T--){
read(n),read(all),read(r),read(m),read(type);
len=r*2;
for(i=1;i<=n;i++)read(a[i]),a[i]-=r,b[i]=a[i]-len*i;
build(1,1,n);
query(1,n);
while(m--)read(x),read(y),query(x,y);
}
return 0;
}
BZOJ2567 : 篱笆的更多相关文章
- [LeetCode] Paint Fence 粉刷篱笆
There is a fence with n posts, each post can be painted with one of the k colors. You have to paint ...
- POJ 3253 Fence Repair(修篱笆)
POJ 3253 Fence Repair(修篱笆) Time Limit: 2000MS Memory Limit: 65536K [Description] [题目描述] Farmer Joh ...
- 洛谷P2738 [USACO4.1]篱笆回路Fence Loops
P2738 [USACO4.1]篱笆回路Fence Loops 11通过 21提交 题目提供者该用户不存在 标签USACO 难度提高+/省选- 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 ...
- BZOJ3397: [Usaco2009 Feb]Surround the Islands 环岛篱笆
3397: [Usaco2009 Feb]Surround the Islands 环岛篱笆 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 11 So ...
- bzoj:3397 [Usaco2009 Feb]Surround the Islands 环岛篱笆
Description 约翰在加勒比海买下地产,准备在这里的若干个岛屿上养奶牛.所以,他要给所有岛屿围上篱笆.每个岛屿都是多边形.他沿着岛屿的一条边界朝一个方向走,有时候坐船到另一个岛去.他可 ...
- 【BZOJ】3397: [Usaco2009 Feb]Surround the Islands 环岛篱笆(tarjan)
http://www.lydsy.com/JudgeOnline/problem.php?id=3397 显然先tarjan缩点,然后从枚举每一个scc,然后向其它岛屿连费用最小的边,然后算最小的即可 ...
- 洛谷 P2738 [USACO4.1]篱笆回路Fence Loops
P2738 [USACO4.1]篱笆回路Fence Loops 题目描述 农夫布朗的牧场上的篱笆已经失去控制了.它们分成了1~200英尺长的线段.只有在线段的端点处才能连接两个线段,有时给定的一个端点 ...
- 编程算法 - 篱笆修理(Fence Repair) 代码(C)
篱笆修理(Fence Repair) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 把一块木板切成N块, 每次切两块, 分割的开销是木板长度, ...
- cogs 184. [USACO Oct08] 搭建篱笆
184. [USACO Oct08] 搭建篱笆 ★★ 输入文件:quad.in 输出文件:quad.out 简单对比时间限制:1 s 内存限制:128 MB 勤奋的农夫约翰想要修建一个 ...
随机推荐
- console.log()在IE下不兼容问题解决
样式改的顺风顺水,到了IE果然出了问题(奇怪,我为什么要说‘果然’?),如果在JS文件中写了console.log()方法,样式就会有缺陷,但是打开IE下的开发者工具就没问题(IE这都是什么鬼!!), ...
- flask+mod_wsgi+apache在windows上的布署
已经安装过python3.5 1.安装flask: pip install flask 2.安装apache: Apache是开源软件,针对windows环境,它不直接提供编译版本.可以在http:/ ...
- 基于注解的SpringMVC添加其他的Servlet、Filter以及Listener
我们可以在AbstractAnnotationConfigDispatcherServletInitializer的实现类中重写onStartup(ServletContext servletCont ...
- TableView+Button
local MainScene = class("MainScene", cc.load("mvc").ViewBase) function MainScene ...
- C# Bitmap生成base64码
public static string ImgToBase64String(Bitmap bmp) { try { MemoryStream ms = new MemoryStream(); bmp ...
- Go依赖模块版本之Module避坑使用详解
前提 对于Go的版本管理主要用过 glide,下面介绍 Go 1.11 之后官方支持的版本管理工具 mod. 关于 mod 官方给出了三个命令 go help mod.go help modules. ...
- 对oracle用户创建asm磁盘
--root用户执行vi /etc/sysctl.conf #Install oracle settingfs.aio-max-nr = 1048576fs.file-max = 6815744#ke ...
- 如何选择 Apache Tomcat 与 JDK 版本
Apache Tomcat Version
- python脚本--mysql数据库升级、备份
在公司经常要做测试环境的升级.备份.维护:升级后台的应用,不可避免要进行数据库的升级与备份,花了一个上午琢磨了一个脚本分享给大家. ToB的业务,在做环境维护的时候,有初始化环境和增量升级的环境,在测 ...
- python读取uti-8格式ini配置文件出现UnicodeDecodeError: 'gbk' codec can't decode byte 0xba in position 367: illegal multibyte sequence错误解决方法
出现这种错误只需要在read下添加encoding='utf-8' 如: from configparser import ConfigParser cf = ConfigParser() cf.re ...