博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj4476 [Jsoi2015]送礼物
阅读量:6731 次
发布时间:2019-06-25

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

化简式子

$M>=m+ans*(r-l+k)$

发现$M,m$确定时,总区间长度越小越好,于是假定右端点为最小值$M+ans*l>=m+ans*r+ans*k$,

右面都确定了,但最大值仍然有两种情况,一是最大值就在要求的区间内,二是在要求的区间右侧,

对于第一种情况,直接把每个点的val扔进单调队列就可以了,第二种呢,因为要求区间长度最小,所以左端点即为$r-L+1$,单调队列维护$i-L+1~i$的最大值即可,

左端点为最小值也一样。

而且不需要判断在我们选的区间内是否有比$a[i]$更小的,因为那一定比这优,考虑过,

所以每次check直接正反扫就好了。

2017.11.7更新

原程序被hack,因为如果只能全选的话,最小值又不在两边,就不会枚举到最优解,所以强行往两侧各添加n个0即可。

代码已更正,可放心食用

1 #include
2 #include
3 #include
4 #include
5 #include
6 #define N 150050 7 #define eps 1e-6 8 using namespace std; 9 int n,l,r,k;10 int a[N];11 double val[N];12 int q1[N],q2[N],head1,head2,tail1,tail2;13 bool check(double x){14 head1=head2=1;15 tail1=tail2=0;16 for(int i=1;i<=2*n;i++){17 int pos=i-l+1;18 double now=-1000000000;19 if(pos>0){20 val[pos]=a[pos]+x*pos;21 while(head1<=tail1&&val[pos]>val[q1[tail1]])tail1--;22 q1[++tail1]=pos;23 while(head1<=tail1&&q1[head1]<=i-r)head1++;24 now=max(now,val[q1[head1]]);25 }26 while(head2<=tail2&&a[i]>a[q2[tail2]])tail2--;27 q2[++tail2]=i;28 while(head2<=tail2&&q2[head2]<=i-l)head2++;29 if(i>n&&pos>0){30 now=max(now,a[q2[head2]]+x*(i-l+1));31 if(now>=a[i]+x*(i+k))return 1;32 }33 }34 head1=head2=1;35 tail1=tail2=0;36 for(int i=3*n;i>=n+1;i--){37 int pos=i+l-1;38 double now=-1000000000;39 if(pos<=3*n){40 val[pos]=a[pos]-x*pos;41 while(head1<=tail1&&val[pos]>val[q1[tail1]])tail1--;42 q1[++tail1]=pos;43 while(head1<=tail1&&q1[head1]>=i+r)head1++;44 now=max(now,val[q1[head1]]);45 }46 while(head2<=tail2&&a[i]>a[q2[tail2]])tail2--;47 q2[++tail2]=i;48 while(head2<=tail2&&q2[head2]>=i+l)head2++;49 if(i<=2*n&&pos<=3*n){50 now=max(now,a[q2[head2]]-x*(i+l-1));51 if(now>=a[i]-x*(i-k))return 1;52 }53 }54 return 0;55 }56 int main(){57 int T;scanf("%d",&T);58 while(T--){59 scanf("%d%d%d%d",&n,&k,&l,&r);60 for(int i=n+1;i<=2*n;i++)scanf("%d",&a[i]);61 double L=0,R=1000,M;62 while(L+eps
bzoj4476

转载于:https://www.cnblogs.com/Ren-Ivan/p/7778339.html

你可能感兴趣的文章
Android进阶笔记:AIDL内部实现详解 (一)
查看>>
五种常见的ASP.NET安全缺陷
查看>>
程序员每天该做的事
查看>>
函数Int3断点检测
查看>>
sqlserver 重建日志文件
查看>>
返回给定字符串中最长连续数字串
查看>>
SQL注入详解-4
查看>>
在ASP.NET MVC中对表进行通用的增删改
查看>>
jdbc创建后创建bean
查看>>
实现“新手引导”效果
查看>>
SQL Server中各个系统表的作用
查看>>
这里有一些图标资源
查看>>
linux xargs 命令及argument list too long 的处理方法
查看>>
基于STM32的uCGUI移植和优化
查看>>
读心或成现实,OpenBCI要将脑波传感技术用于VR中
查看>>
三年“苏宁之夏”,锐捷无线用才华“闪耀”狂欢夜
查看>>
CIO必须知道的关于数据中心宕机的10个问题
查看>>
MiniDao-PE精简版
查看>>
有关ssh隧道和代理
查看>>
VMware vCenter 5.5 – You do not have permission to login to the server
查看>>