设第$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 : 篱笆的更多相关文章

  1. [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 ...

  2. POJ 3253 Fence Repair(修篱笆)

    POJ 3253 Fence Repair(修篱笆) Time Limit: 2000MS   Memory Limit: 65536K [Description] [题目描述] Farmer Joh ...

  3. 洛谷P2738 [USACO4.1]篱笆回路Fence Loops

    P2738 [USACO4.1]篱笆回路Fence Loops 11通过 21提交 题目提供者该用户不存在 标签USACO 难度提高+/省选- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 ...

  4. BZOJ3397: [Usaco2009 Feb]Surround the Islands 环岛篱笆

    3397: [Usaco2009 Feb]Surround the Islands 环岛篱笆 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 11  So ...

  5. bzoj:3397 [Usaco2009 Feb]Surround the Islands 环岛篱笆

    Description     约翰在加勒比海买下地产,准备在这里的若干个岛屿上养奶牛.所以,他要给所有岛屿围上篱笆.每个岛屿都是多边形.他沿着岛屿的一条边界朝一个方向走,有时候坐船到另一个岛去.他可 ...

  6. 【BZOJ】3397: [Usaco2009 Feb]Surround the Islands 环岛篱笆(tarjan)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3397 显然先tarjan缩点,然后从枚举每一个scc,然后向其它岛屿连费用最小的边,然后算最小的即可 ...

  7. 洛谷 P2738 [USACO4.1]篱笆回路Fence Loops

    P2738 [USACO4.1]篱笆回路Fence Loops 题目描述 农夫布朗的牧场上的篱笆已经失去控制了.它们分成了1~200英尺长的线段.只有在线段的端点处才能连接两个线段,有时给定的一个端点 ...

  8. 编程算法 - 篱笆修理(Fence Repair) 代码(C)

    篱笆修理(Fence Repair) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 把一块木板切成N块, 每次切两块, 分割的开销是木板长度, ...

  9. cogs 184. [USACO Oct08] 搭建篱笆

    184. [USACO Oct08] 搭建篱笆 ★★   输入文件:quad.in   输出文件:quad.out   简单对比时间限制:1 s   内存限制:128 MB 勤奋的农夫约翰想要修建一个 ...

随机推荐

  1. R猜拳游戏解释

    R猜拳游戏解释 作者:梁 蓉 猜拳游戏大概解释: 搜集齐数据框,for循环在三个随机数里抽俩个,抽出的数据放回,继续抽取剪刀石头布,机器人出剪刀石头布,我出对应压制机器人的方法来赢取胜利,我给机器人发 ...

  2. jQuery循环遍历取值

    1:循环遍历取值 var arr = new Array(); $(".plus-tag a span").each(function(i) { arr[i] = $(this). ...

  3. list转换string

    方法1 "".join 若list中为字符型 str = "".join(list) >>> L=['a','b','c'] >> ...

  4. Redis 简介与命令操作

    redis 是 key-value 的数据,所以每个数据都是一个键值对,键的类型是字符串: 值的类型分为五种:string.hash.list.set(集合).zset(有序集合). 数据操作的全部命 ...

  5. Ajax数据爬取

    Ajax的基本原理 以菜鸟教程的代码为例: XMLHTTPRequest对象是JS对Ajax的底层实现: var xmlhttp; if (window.XMLHttpRequest) { // IE ...

  6. python中的operator.itemgetter函数

    operator.itemgetter函数operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号.看下面的例子 a = [,,] >>> b=) ...

  7. 将mysql中的一张表中的一个字段数据根据条件导入另一张表中

    添加字段:alter table matInformation add facid varchar(99)  default ''; 导入数据:update matInformation m set ...

  8. SpringJUnit4ClassRunner (单元测试)

    1.在Maven的pom.xml中加入 <dependency> <groupId>junit</groupId> <artifactId>junit& ...

  9. MUI上传图片之选择相册和相机上传

    1.因为项目中有三处地方需要上传,所以html中存在三处地方.身份证正反面为上传一张,发票限制上传9张. <div class="action1"> <!--展示 ...

  10. pod BaiduMapKit 报错解决方案

    错误信息 [!] Error installing BaiduMapKit [!] /usr/bin/git clone https://github.com/BaiduLBS/BaiduMapKit ...