思路

首先按照坐标x排序,从左到右。
时间可以直接除以二,因为拿回来摆放积木需要来回移动,就需要距离的两倍作为移动时间,因此可以将总时间和移动的时间同时除以二,即,移动时间为距离,总时间除以二。
贪心选取最近的积木:由于所有积木得分都是一样的(权值相同),而时间则是近的比远的少,所以在可以选择两种不同的积木的时候,优先选择距离当前点近的,不会得到更差的结果。
在每一个节点,对于固定的时间,可以找到最远的距离,使得在这个距离内的所有积木都拿完,然后使用剩下的时间拿(当前距离+1)上的积木,拿到的积木个数是剩余时间当前距离+1\frac{剩余时间}{当前距离+1}当前距离+1剩余时间​。显然这部分积木无法拿光,因为如果拿光这个距离就不再是最远的。特别地,如果这个距离内已经拿走了所有积木,也不可以继续拿积木了,可以对答案做一个与积木总数取最小值处理。
那么我们需要维护一下拿完一段区间所有积木所需要的时间花费。这个花费就是这个位置的积木个数乘距离差。我将左右两侧分开维护,以右侧为例,一个数组ry维护积木个数的前缀和,一个数组rs维护积木个数与第一个点距离差的前缀和。查询时只要用rs的区间和减去ry的区间和与当前点和第一个点距离差的乘积就可以得到这部分时间花费。左侧与右侧对称即可,即前缀和变后缀和。
有了这样的预处理,就可以先枚举每一个位置作为起点,再二分距离,找上述最远距离。二分距离的过程中,再分别二分获取左右两侧到达的最远的下标(有距离但是要知道不超过距离的最大下标是多少),然后用这个区间更新答案。
目前时间复杂度为O(nlogmlogn)O(nlogmlogn)O(nlogmlogn),其中m为x的最大值,但是这个时间还是过不去
考虑两次二分的关系,第一次二分使得答案范围缩小一半的同时,也缩小了第二次二分的答案范围,采取nl1,nr1等存储当前的二分答案范围,如果该侧范围缩小,则使其等于l1或r1,否则,使l1或r1等于当前的范围,这样复杂度可以进一步降低,能在1s内运行结束。

代码

由于时间比较极限,我开了所有能想到的优化常数的方法,因此可读性会有所降低,这些方法包括O3,register,定义放在循环外节省开空间的时间,fread,define替代变量赋值;而int128主要为了防止出现炸long long的情况。

#pragma GCC optimize(3)
#include  <bits/stdc++.h>
#define rint register int
using namespace std;
typedef long long ll;
const int N=5e5+5;
const int inf=0x3f3f3f3f;
struct ios {inline char gc(){static const int IN_LEN=1<<18|1;static char buf[IN_LEN],*s,*t;return (s==t)&&(t=(s=buf)+fread(buf,1,IN_LEN,stdin)),s==t?-1:*s++;}template <typename _Tp> inline ios & operator >> (_Tp&x){static char ch,sgn; ch = gc(), sgn = 0;for(;!isdigit(ch);ch=gc()){if(ch==-1)return *this;sgn|=ch=='-';}for(x=0;isdigit(ch);ch=gc())x=x*10+(ch^'0');sgn&&(x=-x); return *this;}
} io;
int n;
ll t;
struct data
{int a,x;
}a[N];
bool cmp(data a,data b)
{return a.x<b.x;
}
__int128 rs[N],ls[N],ry[N],ly[N];
int l,r,l1,r1,l2,r2,mid,m1,m2,lf,rt,nl1,nl2,nr1,nr2;
int main()
{#ifndef ONLINE_JUDGEfreopen("in","r",stdin);
#endif__int128 ans=0;io>>n>>t;t/=2;for(rint i=1;i<=n;i++)io>>a[i].x;for(rint i=1;i<=n;i++)io>>a[i].a;sort(a+1,a+1+n,cmp);lf=a[1].x,rt=a[n].x;for(rint i=1;i<=n;i++){rs[i]=__int128(a[i].x-lf)*a[i].a+rs[i-1],ry[i]=a[i].a+ry[i-1];}for(rint i=n;i>=1;i--){ls[i]=__int128(rt-a[i].x)*a[i].a+ls[i+1],ly[i]=a[i].a+ly[i+1];}for(rint i=1;i<=n;i++){l=0,r=max(a[i].x-lf,rt-a[i].x),l1=i,r1=1,l2=i,r2=n,nl1=i,nr1=1,nl2=i,nr2=n;while(l<r){mid=(l+r+1)>>1;while(l1>r1){m1=(l1+r1)>>1;if(a[i].x-a[m1].x>mid) r1=m1+1;else l1=m1;}while(l2<r2){m2=(l2+r2+1)>>1;if(a[m2].x-a[i].x>mid) r2=m2-1;else l2=m2;}
#define sumr ((rs[l2]-rs[i])-(ry[l2]-ry[i])*(a[i].x-lf))
#define suml ((ls[l1]-ls[i])-(ly[l1]-ly[i])*(rt-a[i].x))if(suml+sumr>t){r=mid-1,l1=nl1,l2=nl2,nr1=r1,nr2=r2;}else{l=mid,r1=nr1,r2=nr2,nl1=l1,nl2=l2;}}
#define mid lwhile(l1<r1){m1=(l1+r1)>>1;if(a[i].x-a[m1].x>mid) r1=m1+1;else l1=m1;}while(l2<r2){m2=(l2+r2+1)>>1;if(a[m2].x-a[i].x>mid) r2=m2-1;else l2=m2;}//cout<<i<<' '<<(ll)((t-suml-sumr)/(l+1))<<' '<<(ll)(ry[r2]-ry[l1-1])<<endl;ans=max(ans,(t-suml-sumr)/(l+1)+ry[r2]-ry[l1-1]);ans=min(ans,ry[n]);}printf("%lld",(ll)ans);
}

13946 问题 E: 积木游戏相关推荐

  1. c语言幼儿园积木游戏,幼儿园《积木游戏》课件【三篇】

    [导语]课件制作本身就是作者综合素养的一种体现,它显现出制作者对教育.教学.教材改革方向的把握,对课堂教学的理解,对现代教育技术的领悟.因此教师在设计课件时一定要吃透教学内容,设计出符合教学的方案用于 ...

  2. 计算机积木游戏,乐高积木模拟器

    乐高积木模拟器是一款非常好玩的休闲小游戏,超好玩的拼积木游戏玩法,玩家需要将一个个积分方块拼接在一起,看似简单的玩法实则充满着挑战性,非常考验玩家的耐心.充分发挥自己的想象力,在这个游戏世界中玩耍,加 ...

  3. vijos 1464 积木游戏 DP

    描述 积木游戏 SERCOI 最近设计了一种积木游戏.每个游戏者有N块编号依次为1 ,2,-,N的长方 体积木.对于每块积木,它的三条不同的边分别称为"a边"."b边&q ...

  4. [NOI 1997] 积木游戏(dp)

    ·题目描述 一种积木游戏,游戏者有N块编号依次为1,2,-,N的长方体积木.第I块积木通过同一顶点三条边的长度分别为ai,bi,ci(i=1,2,-,N),如图1所示: 游戏规则如下: 1 从N块积木 ...

  5. #bzoj2240#积木游戏(DP? 贪心?)

    2240: 积木游戏 时间限制: 1 Sec  内存限制: 128 MB 题目描述 小时候我们都喜欢玩积木.这里的积木都是单位边长的正方体块,多个积木可以堆成一个"高木",&quo ...

  6. 积木游戏 (Standard IO)

    题意/Description: 在一个N*N的区域玩积木游戏,每个单元格正好跟积木的底面相等,每个单元格里放有若干个积木,Alice想重新摆放积木,使得每个单元格最多只能放一个积木,并且所有积木正好形 ...

  7. 华为机试真题 Python 实现【相同数字的积木游戏】【2022.11 Q4 新题】

    目录 题目 思路 考点 Code 题目 题目描述 小华和小薇一起通过玩积木游戏学习数学. 他们有很多积木,每个积木块上都有一个数字,积木块上的数字可能相同. 小华随机拿一些积木挨着排成一排,请小薇找到 ...

  8. 算法提高 盾神与积木游戏

    算法提高 盾神与积木游戏   时间限制:1.0s   内存限制:256.0MB 问题描述 最近的m天盾神都去幼儿园陪小朋友们玩去了~ 每个小朋友都拿到了一些积木,他们各自需要不同数量的积木来拼一些他们 ...

  9. 题目0171-相同数字的积木游戏1

    相同数字的积木游戏1 题目描述 小华和小薇一起通过玩积木游戏学习数学. 他们有很多积木,每个积木块上都有一个数字, 积木块上的数字可能相同. 小华随机拿一些积木挨着排成一排,请小薇找到这排积木中数字相 ...

  10. 基于egret引擎、P2物理库的搭积木游戏

    最近更新源代码: https://github.com/lixintong1992/egret_game 最近不务正业,参加了一个HTML5游戏设计比赛.速成了一个搭积木游戏. http://dev. ...

最新文章

  1. 金蝶中间件部署报栈溢出_京东618压测时自研中间件暴露出的问题,压测级别数十万/秒...
  2. c#关于JWT跨域身份验证解决方案
  3. PUTTY登录树莓派Network error:Software caused connection abort
  4. 汇编语言 + Visual Studio 2019——Visual Studio 2019 中汇编语言环境解决方案
  5. java设计模式_模版模式
  6. NET问答: 如何从 string 中挖出所有的 number ?
  7. win10文件显示后缀名_win10系统,如何去除“此电脑” 里的6个多余文件夹
  8. Qt5:Qt中图片的翻转,旋转,缩放,扭曲操作
  9. GIS案例练习-----------第五天
  10. 鸿蒙系统激活炼妖壶设备管理员实现应用双开(微信,QQ三开)以及常见问题解决
  11. eyoucms破解授权
  12. bzoj 3237: [Ahoi2013]连通图 并查集+线段树分治
  13. 教皇修改之后丢失的十天
  14. 不用深厚的数学功底也不用深厚的金融知识,用python也能炒股?
  15. 分享两套模板,zblog模板和emlog模板。
  16. android 高德地图录制视频,《高德地图》录制导航录音包方法教程
  17. 利用七牛存储7天远程自动备份LINUX服务器
  18. java // for // 俄文字母表
  19. 【素描基础】大师素描及素描抽象明…
  20. 使用flex 布局让子元素 左右间距相等

热门文章

  1. python是低级语言吗_低级语言和高级语言的区别
  2. 关于我对游戏开发的理解
  3. shiro的受权管理
  4. css文字不换行显示、超出显示点点点等实用性小记
  5. 20180310华为面试
  6. elementUI的tree组件搜索过滤,可识别拼音,且不区分大小写
  7. STM32串口IAP
  8. 强制横屏java_Android强制设定横屏时,SurfaceView一直黑屏
  9. vue制作子组件以及在父组件中引入子组件
  10. 关于网络小说均订的那些事:有些已成历史,有些在不断打破纪录