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 勤奋的农夫约翰想要修建一个 ...
随机推荐
- BeautifulSoup爬网页图片
#-*- coding: utf-8 -*- import urllib2 import urllib import os from BeautifulSoup import BeautifulSou ...
- 转化.vdi到.vmdk
OracleVirtualBox转化.vdi到.vmdk E:\Genymotion-deployed\CentOS_7_64>"D:/Program Files/Oracle/Vir ...
- CentOS 6.6 系统升级到 CentOS 6.7
1.利用Centos6.7 ISO镜像挂载为本地镜像 创建一个挂载目录 CentOS 6.6 系统升级到 CentOS 6.7 mkdir /mnt/data 2.挂载镜像(远程镜像) mount - ...
- PowerPoint 中插入 Latex 公式
做 PPT 用 Latex Beamer 毕竟还是太麻烦,Beamer 毕竟还是更适合学术性的,各种定义各种公式的那种,遇到要画各种图,插入各种图片,进行错综复杂的排版就比较棘手了. 最终还是 Pow ...
- 开发一个项目之css
background属性 5+3 image,color,position,repeat,attachment size: 保持纵横比 contain 再发大就cover了 clip:背景绘制区域 b ...
- module.ngdoc
译自Angular's module docs 1.模块 大部分的应用都有一个主要的方法来实例化,链接,引导.angular应用没有这个方法,而是用模块声明来替代. 这种方式的优点: *程序的声明越详 ...
- Uncaught DOMException: Failed to construct 'WebSocket': The URL
生成socket对象地址有误
- m3u8下载转码一次完成
最近看到有部分网站开始加入视频解析服务,虽然这种服务会损害土豆优酷等视频托管商的权益,但是,烦人的广告也让我们开始寻找有没有什么比较靠谱的解决方法~实际上很多网站都在使用m3u8文件格式,里面都是视频 ...
- 03中间件mycat对pxc集群的分片处理
安装第二个pxc集群 作为mycat的第二个分片 直接拷贝其中的一个虚拟机,然后还原到最初的状态,这样会小很多,启动改一下IP和基础配置,然后再次拷贝这个虚拟机两份改IP重启即可 正常安装pxc集群即 ...
- 基于物品的协同过滤item-CF 之电影推荐 python
推荐算法有基于协同的Collaboration Filtering:包括 user Based和item Based:基于内容 : Content Based 协同过滤包括基于物品的协同过滤和基于用户 ...