【二分】NEERC15 L Landscape Improved(2015-2016 ACM-ICPC)(Codeforces GYM 100851)
题目链接:
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)相关推荐
- 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 ...
- 2016 ACM ICPC Asia Region - Tehran
2016 ACM ICPC Asia Region - Tehran A - Tax 题目描述:算税. solution 模拟. B - Key Maker 题目描述:给出\(n\)个序列,给定一个序 ...
- 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)
摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5 ...
- 【最短路】NEERC15 F Froggy Ford(2015-2016 ACM-ICPC)(Codeforces GYM 100851)
题目链接: http://codeforces.com/gym/100851 题目大意: 一只青蛙跳过宽为W的河,河中游N个石头,坐标xi,yi,现在往河中间添加一个石头,使得每次跳跃的最大的距离最小 ...
- 【最短路】NEERC15 F Froggy Ford (Codeforces GYM 100851)
题目链接: http://codeforces.com/gym/100851 题目大意: 一只青蛙跳过宽为W的河,河中游N个石头,坐标xi,yi,现在往河中间添加一个石头,使得每次跳跃的最大的距离最小 ...
- 2016 ACM/ICPC Asia Regional Shenyang Online
I:QSC and Master 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5900 题意: 给出n对数keyi,vali表示当前这对数的键值和权值 ...
- 2016 ACM/ICPC Asia Regional Dalian Online
1009 Sparse Graph(hdu5876) 由于每条边的权值都为1,所以最短路bfs就够了,只是要求转置图的最短路,所以得用两个set来维护,一个用来存储上次扩散还没访问的点,一个用来存储这 ...
- HDU - 5875 2016 ACM/ICPC 大连网络赛 H题 暴力
题目链接 题意:给你一个区间l,r一直将val[l]模上val[l+1],val[l+2]...val[r],因为一个模上比前一个数小数是没有意义的,所以需要将每一个点找到右边第一个小于他的点就行. ...
- HDU - 5876 Sparse Graph 2016 ACM/ICPC 大连网络赛 I题 bfs+set+补图最短路
题目链接 题意:给的补图,让你求一个源点到其他点的最短距离,因为图太稠密了, 用dij以及spfa根本不得行,这里只能用一种我不会方法来进行,这里用了bfs的方法以及set来维护,分别set维护一个未 ...
最新文章
- SQLPLUS命令的使用大全
- 用于软件包管理的21个Linux YUM命令
- Facebook利用Home平台加速进军移动领域
- Attention is all you need注意力机制代码解析
- 如果有什么想不开或者放不下的话,看看这里吧!(摘于网络)
- javascript中数组遍历问题
- windows--XP的140个技巧!
- 1.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。 这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?2.角谷定理。
- 加密播放器显示“DRMsoft.cn未注册”
- Freebie:专业业务信息图表模板
- 再爆 Bug!Windows 11 任务栏、菜单栏无故消失,怎么解?
- (加入显示电量功能)模仿魅族、华为、小米电池续航管理软件, 动态水波纹滚动的圆形小球View
- C语言结构体学生基本资料,用结构体定义10个学生基本信息
- 《深入解读Windows操作系统》之系统构架
- 计院生活--第一章 卧薪尝胆
- 墨画子卿第四章第4节:凝神期的劫云
- 云邦互联 免费空间 我来试一试
- 为电子书产品赋予新的定义,两款高端电子书横评
- linux查看通道的命令,10个Linux新手必须记住的Linux基本命令,快速入门通道!!...
- android采用MVP完整漫画APP、钉钉地图效果、功能完善的音乐播放器、仿QQ动态登录效果、触手app主页等源码
热门文章
- 开会”就是我们的课堂
- 《跨境电商 —— 阿里巴巴速卖通实操全攻略》一一1.2 账户的认证流程
- 解决:OpenCV: FFMPEG: tag 0x5634504d/‘MP4V‘ is not supported with codec id 12 and format ‘mp4 / MP4 (MP
- 华为WATCH D血压手表测量准确吗?
- Nature Medicine | 组学和人工智能推动肝病生物标志物的发现
- wget命令用法举例
- Vue2租车高德地图项目经验分享
- Tomcat工作原理 、JVM内存溢出及合理配置、配置文件详解
- python写入文件list,读取list方法
- 分享几个特别特别强的资源福利网站