题面

比较明显地能看出二分来,但是检查函数很难写。对于二分出的一个$mid$,我们要让它满足在$m$次操作内令序列中存在一个为零的位置,同时使得任意相邻的两项之差不超过$mid$

第二项的检查比较好做,我们正反各扫一遍然后把扫到的上一个数对当前数与$mid$之差取最小值,就是满足条件的最小代价

对于第一项的检查,我们发现可以将原数列修改成一段段的等差数列,这样在存在零的情况下是最优的。我们枚举这个变成零的位置,然后找出$h_l-k-l*mid>0$和$h_r-r-k*mid>0$的$l,r$,这两个端点具有单调性,可以用双指针扫描解决

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
long long h[N],tmp[N],fsum[N],cst[N];
long long n,m,l,r,f,b,ans1,ans2;
long long check(long long x)
{
long long tep=;
for(int i=;i<=n;i++) tmp[i]=h[i];
for(int i=;i<=n;i++)
if(tmp[i]>tmp[i-]+x)
tep+=tmp[i]-tmp[i-]-x,tmp[i]=tmp[i-]+x;
for(int i=n-;i;i--)
if(tmp[i]>tmp[i+]+x)
tep+=tmp[i]-tmp[i+]-x,tmp[i]=tmp[i+]+x;
if(m<tep) return ;
for(int i=;i<=n;i++) fsum[i]=fsum[i-]+tmp[i];
memset(cst,,sizeof cst); f=,b=n;
for(int i=;i<n;i++)
{
while(f<=i&&tmp[f]<=1ll*(i-f+)*x) f++;
cst[i+]+=fsum[i]-fsum[f-]-1ll*(i-f+)*(i-f+)*x/;
}
for(int i=n+;i>=;i--)
{
while(b>=i&&tmp[b]<=1ll*(b-i+)*x) b--;
cst[i-]+=fsum[b]-fsum[i-]-1ll*(b-i+)*(b-i+)*x/;
}
for(int i=;i<=n;i++)
if(tep+cst[i]+tmp[i]<=m) return i;
return ;
}
int main ()
{
scanf("%lld%lld",&n,&m);
for(int i=;i<=n;i++)
scanf("%lld",&h[i]),r=max(r,h[i]);
while(l<=r)
{
long long mid=(l+r)/;
if(check(mid)) r=mid-,ans2=mid; else l=mid+;
}
ans1=check(ans2);
printf("%lld %lld",ans1,ans2);
return ;
}

解题:POI 2012 Well的更多相关文章

  1. 解题:POI 2012 Cloakroom

    题面 首先,单独处理每个询问复杂度显然不可承受,还是考虑通过排序使得限制更容易达到:按照$a$将物品排序,按照$m$将询问排序,这样肯定是要不断添加物品才能达到要求,顺着做一遍就行了 然后发现$b$的 ...

  2. 【BZOJ 2803】【POI 2012】Prefixuffix

    http://www.lydsy.com/JudgeOnline/problem.php?id=2803 核心思想是利用单调性. 因为长度为L的前缀和后缀循环同构是AB和BA的形式,我们设\(f(i) ...

  3. [ POI 2012 ] Letters

    \(\\\) \(Description\) 给出两个长度为 \(N\) 的字符串\(S_1,S_2\),且保证两个字符串中每一个字符出现次数相同. 现在一次操作可以交换相邻的两个字符,问将 \(S_ ...

  4. POI题解整合

    我也不知道为啥我就想把POI的题全都放到一篇blog里写完. POI 2005 SAM-Toy Cars 贪心,每次选下次出现最晚的. POI 2006 KRA-The Disks 箱子位置单调,所以 ...

  5. 解题:POI 2016 Nim z utrudnieniem

    题面 出现了,神仙题! 了解一点博弈论的话可以很容易转化题面:问$B$有多少种取(diu)石子的方式使得取后剩余石子异或值为零且取出的石子堆数是$d$的倍数 首先有个暴力做法:$dp[i][j][k] ...

  6. 2012 East Central Regional Contest 解题报告

    昨晚各种莫名其妙卡题. 不过细看这套题还挺简单的.全是各种暴力. 除了最后一道题计算几何看起来很麻烦的样子,其他题都是很好写的吧. A. Babs' Box Boutique 题目大意是给出不超过10 ...

  7. Regionals 2012, Asia - Jakarta 解题报告

    啥都不会做了.. 做题慢死 A.Grandpa's Walk 签到题. 直接DFS就行. 注意先判断这个点可以作为一个路径的起点不. 然后再DFS. 否则处理起来略麻烦 #include <io ...

  8. Regionals 2012, North America - Greater NY 解题报告

    这套题..除了几何的都出了 完全没时间学几何.杯具 A,B,J 水题不解释 C.Pen Counts 这题的话 写几个不等式限制边得范围就行了 然后枚举最小边 D.Maximum Random Wal ...

  9. 解题:NOI 2012 骑行川藏

    题面 入手点是每段路程中能量$e$与时间$t$的关系,$t-e$这个函数的导数对于各个路段一样,否则我们可以从导数大的一段路抽出一部分能量分给导数小的,这样会更优 毕姥爷在考场上的做法:猜一猜,然后拿 ...

随机推荐

  1. gulp + angular + requirejs 简单学习

    一.安装gulp(已经安装了node环境) npm  install -g gulp 二.在package.json文件中配置依赖插件 { "name": "xxxx&q ...

  2. sar命令详解

    基础命令学习目录首页 原文链接:http://lovesoo.org/linux-sar-command-detailed.html sar(System Activity Reporter系统活动情 ...

  3. NABC for Teamproject

     “教育是一个社会发展的支柱, 你和我能看到并理解这个博客, 教育功不可没. 高等教育的形式并不是一成不变的, 高等教育一直在演进.”邹欣老师在博客上如此写道.为了迎合信息化时代的特色,网络上的知识传 ...

  4. Scrum Meeting 10.27

    1.会议内容: 姓名 今日任务 明日任务 预估时间(h) 徐越 配置SQLserver 学习本地和服务器之间的通信 4 卞忠昊 找上届代码的bug 学习安卓布局(layout)的有关知识,研究上届学长 ...

  5. second scrum meeting - 151026

    摘要:这一周的工作其实进行的并没有很迅速~不过我们团队的每个人都在慢慢进行自己的工作,并且我们也完成了大致的页面设计,开发了主页面的框架,并且我们也会开始着手学习服务器的操作,还有更加完善主页面的框架 ...

  6. 结对项目:SudokuGame

    1. Github项目地址:https://github.com/ZiJiaW/SudokuGame GUI在BIN目录下的SudokuGUI.rar中,解压后打开SudokuGame.exe即可.2 ...

  7. 初涉JSP+JDBC 基于SQL2008的登陆验证程序

    简单的以代码的形式纪念一下,因为现在还没有解决SQL2008驱动的问题,并且有好多东西要学,所以日后会有更新~ 所安装的软件有:SQL2008,eclipse,tomcat,JDK,涉及环境配置.等等 ...

  8. struts2.3.16.1+hibernate4.3.4+spring4.0.2

    把之前的老项目用新的改了 发现新的有点很方便啊 Struts2+Hibernate+Spring整合     用的是      struts2.3.16.1      hibernate4.3.4   ...

  9. week3c:个人博客作业

    程序测试: 一个基本的测试. 在Visual Studio 2013 中使用C++单元测试 操作如下: 这是我学到的过程. 有复杂程序的测试.以后有时间再弄.

  10. spring ioc和aop的理解

    IOC,依赖倒置的意思,所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B.所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如 ...