正题

题目链接:https://www.luogu.com.cn/problem/AT3949


题目大意

长度为\(L\)的坐标轴上,给出\(n\)个点,每个点\(x_i\)需要购物\(t_i\)的时间,一辆车在\(0\sim L\)折返跑,求从\(0\)出发购物完回到\(0\)的最短时间。

\(n\in[1,3\times 10^5],L\in[1,10^9]\),输入的\(x_i\)单调递增。


解题思路

挺奇妙的题目,\(WC2021\)讲课的题。

首先每个\(t_i\)先\(\%\)上一个\(2\times L\)。然后把那些\(2\times L\)加到答案里先,这些无可避免。

然后考虑一个点,如果从右边进只需要到达一次端点就视为左括号,如果从右边进只需要到达一次端点就视为右括号。

先默认每个点的贡献都是\(2\times L\),显然一个左括号和一个右括号匹配可以减少\(2\times L\)的贡献,因为如果先走右边那个再来走左边那个,这样他们的贡献和就是\(2\times L\)。

而有些点既可以视为左又可以视为右,此时我们需要最大化匹配数。

其实还有一个性质,如果一个节点开始固定作为左括号,那么它后面的一定不会有固定作为右括号的(拿作为左右括号的条件看一下就能理解了)。所以不会有两个固定的括号匹配。

然后就可以直接贪心匹配了,时间复杂度\(O(n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=3e5+10;
int n,len,x[N],t[N],l[N],r[N],ans;
int main()
{
scanf("%d%d",&n,&len);
for(int i=1;i<=n;i++)scanf("%d",&x[i]);
for(int i=1;i<=n;i++)scanf("%d",&t[i]);
for(int i=1;i<=n;i++){
ans+=t[i]/(2*len);t[i]%=2*len;
if(!t[i]){ans--;continue;}
l[i]=(t[i]<=x[i]*2);
r[i]=(t[i]<=(len-x[i])*2);
}
int lim=n,L=0,R=0;ans+=n+1-r[n];
for(int i=1;i<n;i++){
if(!l[i]&&!r[i])continue;
if(!r[i]){lim=i;break;}
if(!l[i]&&L)L--,ans--;
else if(l[i]) L++;
}
for(int i=n-1;i>=lim;i--){
if(!l[i]&&!r[i])continue;
if(!l[i])break;
if(!r[i]&&R)R--,ans--;
else if(r[i]) R++;
}
ans-=(L+R)>>1;
printf("%lld\n",2ll*ans*len);
return 0;
}

最新文章

  1. 一步步学习javascript基础篇(4):面向对象设计之创建对象(工厂、原型和构造函数等模式)
  2. IOS 开发中 Whose view is not in the window hierarchy 错误的解决办法
  3. Android真机访问PC端服务器
  4. 一个不错的loading效果--IT蓝豹
  5. 响应式框架pure--来自雅虎
  6. springMVC中传值的时候的乱码问题
  7. Qt编程18:Qt调色板QPalette的使用
  8. 无责任共享 Coursera、Udacity 等课程视频
  9. UVA 10400 Game Show Math (dfs + 记忆化搜索)
  10. 2014年同年CFA考试中哪些CFA资料没有变化?
  11. MySQL账户管理
  12. Web云笔记--CSS
  13. angular学习笔记01
  14. Linux 允许或者禁止ping
  15. Win10系统简单开启热点
  16. HR_Hash Tables: Ransom Note
  17. CSS图形——实现圆角
  18. hash 在 perl 中的用法(转载)
  19. 如何用MoveIt快速搭建机器人运动规划平台?
  20. c++中的类(class)-----笔记(类多态)

热门文章

  1. .NET WebApi 实战第五讲之EntityFramework事务
  2. C 静态存储动态存储
  3. io中的特殊流Properties
  4. 刷题-力扣-264. 丑数 II
  5. Hadoop及Hbase部署
  6. 01_Keil与Proteus联合仿真的注意事项
  7. Linux学习笔记 - Linux快捷操作及常用命令
  8. eBPF 安全项目 Tracee 初探
  9. [编译] 10、kconfig 入门指导教程
  10. Powershell配合word伪装木马执行