题目链接:

  http://codeforces.com/gym/100851

题目大意:

  一个宽度为N的网格图,i上有h[i]高的方块。现在你有W个方块,问怎么放使得最终的最高点最高。

  只要一个格子的下方,左下方和右下方都有方块那么久可以把方块放到这个格子上。最左端和最右端不能放方块。

  (N<=100000,W<=1018,h[i]<=109

题目思路:

  【二分】

  这题很容易就想到二分。但是怎么判断当前高度可行不太好想。

  首先二分答案H,而对于当前高度,需要枚举这个H是在哪一个宽度I上,还要从当前I往两旁递减直到碰到已经存在的方块,这时候统计答案。

  但是这样的做法明显超时,不如反过来想。

  L[i]表示在高度H下I达到高度H时最左端的位置,R[i]为最右端的位置。

  可以通过O(n)的时间得到L,R(每个节点在当前高度开始分别向左右+1扩展到最高高度H时所在的位置先记为L,R,但是这样有可能会在途中遇到更高的方块而被挡住,所以最后要取L最大值和R最小值,这个可以自己画一画)

  这样最后在I填充的就变成h[L[i]],h[L[i]]+1,...H-1,H,H-1,...h[R[i]]+1,h[R[i]].计算两个公差为1的数列和,在扣除L[i]~R[i]已经有的方块数即可。

  

 1 //
 2 //by coolxxx
 3 //#include<bits/stdc++.h>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<string>
 7 #include<iomanip>
 8 #include<map>
 9 #include<stack>
10 #include<queue>
11 #include<set>
12 #include<bitset>
13 #include<memory.h>
14 #include<time.h>
15 #include<stdio.h>
16 #include<stdlib.h>
17 #include<string.h>
18 //#include<stdbool.h>
19 #include<math.h>
20 #define min(a,b) ((a)<(b)?(a):(b))
21 #define max(a,b) ((a)>(b)?(a):(b))
22 #define abs(a) ((a)>0?(a):(-(a)))
23 #define lowbit(a) (a&(-a))
24 #define sqr(a) ((a)*(a))
25 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
26 #define mem(a,b) memset(a,b,sizeof(a))
27 #define eps (1e-8)
28 #define J 10
29 #define mod 1000000007
30 #define MAX 0x7f7f7f7f
31 #define PI 3.14159265358979323
32 #define N 100004
33 using namespace std;
34 typedef long long LL;
35 int cas,cass;
36 int n,m,lll,ans;
37 LL aans;
38 LL a[N],sum[N],l[N],r[N];
39 bool judge(LL h)
40 {
41     int i,j;
42     mem(l,0);mem(r,0x7f);
43     for(i=1;i<=n;i++)
44         if(i+h-a[i]<=n)l[i+h-a[i]]=i;//i往右每次+1扩展达到H时的位置为j=i+h[i]-a[i],则L[j]即为i
45     for(i=n;i;i--)
46         if(i-h+a[i]>0)r[i-h+a[i]]=i;//同上,i往左每次+1扩展
47     for(i=1;i<=n;i++)l[i]=max(l[i],l[i-1]);//有可能在下降的过程中遇到比预期高度更高的,需要改为在更高的位置停止
48     for(i=n;i;i--)r[i]=min(r[i],r[i+1]);//比如当前高度是3,下一个高度是5,最终肯定是在5停下来而不是3
49     for(i=1;i<=n;i++)
50     {
51         if(l[i]==0 || r[i]==r[N-1])continue;
52         aans=1LL*(a[l[i]]+h)*(i-l[i]+1)/2;
53         aans+=1LL*(a[r[i]]+h-1)*(r[i]-i)/2;
54         aans-=sum[r[i]]-sum[l[i]-1];
55         if(aans<=m)return 1;
56     }
57     return 0;
58 }
59 int main()
60 {
61     #ifndef ONLINE_JUDGE
62 //    freopen("1.txt","r",stdin);
63 //    freopen("2.txt","w",stdout);
64     #endif
65     int i,j,k;
66     LL l,r,mid;
67 //    for(scanf("%d",&cass);cass;cass--)
68 //    for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
69 //    while(~scanf("%s",s+1))
70     while(~scanf("%d",&n))
71     {
72         scanf("%d",&m);
73         sum[0]=0;l=0;
74         for(i=1;i<=n;i++)
75         {
76             scanf("%I64d",&a[i]);
77             sum[i]=sum[i-1]+a[i];
78             l=max(l,a[i]);
79         }
80         r=2000000000;
81         while(l<r)
82         {
83             mid=(l+r+1)>>1;
84             if(judge(mid))l=mid;
85             else r=mid-1;
86         }
87         printf("%I64d\n",r);
88     }
89     return 0;
90 }
91 /*
92 //
93
94 //
95 */

View Code

转载于:https://www.cnblogs.com/Coolxxx/p/5824855.html

【二分】NEERC15 L Landscape Improved(2015-2016 ACM-ICPC)(Codeforces GYM 100851)相关推荐

  1. 2016 ACM / ICPC Asia dalian Regional Contest 题解(11 / 11)【每日亿题2021 / 2 / 17】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A .(2017 ACM ICPC dalian H)To begin or not to be ...

  2. 2016 ACM ICPC Asia Region - Tehran

    2016 ACM ICPC Asia Region - Tehran A - Tax 题目描述:算税. solution 模拟. B - Key Maker 题目描述:给出\(n\)个序列,给定一个序 ...

  3. 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

    摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...

  4. 【最短路】NEERC15 F Froggy Ford(2015-2016 ACM-ICPC)(Codeforces GYM 100851)

    题目链接: http://codeforces.com/gym/100851 题目大意: 一只青蛙跳过宽为W的河,河中游N个石头,坐标xi,yi,现在往河中间添加一个石头,使得每次跳跃的最大的距离最小 ...

  5. 【最短路】NEERC15 F Froggy Ford (Codeforces GYM 100851)

    题目链接: http://codeforces.com/gym/100851 题目大意: 一只青蛙跳过宽为W的河,河中游N个石头,坐标xi,yi,现在往河中间添加一个石头,使得每次跳跃的最大的距离最小 ...

  6. 2016 ACM/ICPC Asia Regional Shenyang Online

    I:QSC and Master 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5900 题意: 给出n对数keyi,vali表示当前这对数的键值和权值 ...

  7. 2016 ACM/ICPC Asia Regional Dalian Online

    1009 Sparse Graph(hdu5876) 由于每条边的权值都为1,所以最短路bfs就够了,只是要求转置图的最短路,所以得用两个set来维护,一个用来存储上次扩散还没访问的点,一个用来存储这 ...

  8. HDU - 5875 2016 ACM/ICPC 大连网络赛 H题 暴力

    题目链接 题意:给你一个区间l,r一直将val[l]模上val[l+1],val[l+2]...val[r],因为一个模上比前一个数小数是没有意义的,所以需要将每一个点找到右边第一个小于他的点就行. ...

  9. HDU - 5876 Sparse Graph 2016 ACM/ICPC 大连网络赛 I题 bfs+set+补图最短路

    题目链接 题意:给的补图,让你求一个源点到其他点的最短距离,因为图太稠密了, 用dij以及spfa根本不得行,这里只能用一种我不会方法来进行,这里用了bfs的方法以及set来维护,分别set维护一个未 ...

最新文章

  1. SQLPLUS命令的使用大全
  2. 用于软件包管理的21个Linux YUM命令
  3. Facebook利用Home平台加速进军移动领域
  4. Attention is all you need注意力机制代码解析
  5. 如果有什么想不开或者放不下的话,看看这里吧!(摘于网络)
  6. javascript中数组遍历问题
  7. windows--XP的140个技巧!
  8. 1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。 这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?2.角谷定理。
  9. 加密播放器显示“DRMsoft.cn未注册”
  10. Freebie:专业业务信息图表模板
  11. 再爆 Bug!Windows 11 任务栏、菜单栏无故消失,怎么解?
  12. (加入显示电量功能)模仿魅族、华为、小米电池续航管理软件, 动态水波纹滚动的圆形小球View
  13. C语言结构体学生基本资料,用结构体定义10个学生基本信息
  14. 《深入解读Windows操作系统》之系统构架
  15. 计院生活--第一章 卧薪尝胆
  16. 墨画子卿第四章第4节:凝神期的劫云
  17. 云邦互联 免费空间 我来试一试
  18. 为电子书产品赋予新的定义,两款高端电子书横评
  19. linux查看通道的命令,10个Linux新手必须记住的Linux基本命令,快速入门通道!!...
  20. android采用MVP完整漫画APP、钉钉地图效果、功能完善的音乐播放器、仿QQ动态登录效果、触手app主页等源码

热门文章

  1. 开会”就是我们的课堂
  2. 《跨境电商 —— 阿里巴巴速卖通实操全攻略》一一1.2 账户的认证流程
  3. 解决:OpenCV: FFMPEG: tag 0x5634504d/‘MP4V‘ is not supported with codec id 12 and format ‘mp4 / MP4 (MP
  4. 华为WATCH D血压手表测量准确吗?
  5. Nature Medicine | 组学和人工智能推动肝病生物标志物的发现
  6. wget命令用法举例
  7. Vue2租车高德地图项目经验分享
  8. Tomcat工作原理 、JVM内存溢出及合理配置、配置文件详解
  9. python写入文件list,读取list方法
  10. 分享几个特别特别强的资源福利网站