称0到$L$的方向为左,同时为了方便,可以假设$0<t_{i}\le 2L$

当我们确定是进入店中的方向,根据这个店的位置以及购物时间,不难确定出来时火车经过0或$L$的次数,由于$0<t_{i}\le 2L$,因此总共至少有一次且分别不超过1次,即分以下三类讨论:

1.经过0未经过$L$,在该位置上标记为1

2.经过$L$未经过0,在该位置上标记为-1

3.经过$L$且经过0,在该位置上标记为1、-1

同时,对于坐在车上经过0或$L$,也可以看作0或$L$上有一个商店,即在0上记录1,$L$上记录-1

(特别的,对于初始位于0不记录,对于最后到达0记录)

最后,将0到$L$每一个位置上的序列连结起来,即构成一个由1、-1构成的序列

考虑这个序列的意义,每一个1即表示该次火车到0时自己所处的位置,-1类似

下面来考虑火车,对于每一趟,确定一对1和-1(即该次其到0和$L$时我的位置),并将这一对1和-1删去,不难发现要保证:

1.删去的1(的位置)必须在该对的-1之前,删去的-1必须在上一对(若存在)删去的1之后

(可以理解一下,否则我仍然在上一次的商店中)

2.最后一次删去的1必须在位置0上或为空(即最后要返回0)

同时,这一方案的所需时间为这个序列长度*L(每一个1或-1恰好对应$L$的路程),因此可以看作构造最短的1和-1的序列,使得其可以以上述方法删除:

先考虑上述删除的真正限制,首先仅考虑每一次1在-1,即要求前缀和非负,同时由于成对匹配,即1和-1的数量相同,整体前缀和为0

(可以以括号序列的方式理解,但注意,我们并不要求其1和-1要以括号序列的配对方式删除,即若将删去的一对括号看成一个区间,是可以有交的,那么就会有多种解)

同时,这并不充分,我们还要求其在0上存在1,且除去空前缀和整体以外,前缀和严格大于0

典型的例子是$\{1,-1,1,-1\}$,由于第一个1要最后删除,那么一定先删除3和4上的1和-1,那么根据第二点删去的-1必须在上一对删去的1之后,是无法删除第2个位置的

关于这个的证明,套用上面这个例子就可以了,对于前缀和为0的前缀,最左边的1必然要与这之前的-1匹配,由于这是最后一次匹配,那么上一次不在这个前缀中的匹配与下一次匹配就一定不合法了

同时,当满足这两条必要条件后,其是充分的,构造方案:

先将第一个1和最后一个-1在最后匹配,由于要求-1在上一次1之后,一定合法

接下来,由于本来前缀和大于0,现在即非负,那么从小到大枚举左括号去匹配最近的右括号即可(从小到大是为了防止下一次的右括号在这一次之前)

总结一下,根据$t_{i}$和$v_{i}$可以算出每一个节点的类型,即能否填写这三类中的一种(只要存在可能就可以,至于合法性后面会判),之后可以在0和$L$分别加上若干个1和-1(要求0上至少1个),使得其除去空前缀和整体以外,前缀和严格大于0,且整体和为0

0和$L$上添加1和-1肯定要尽量少,具体来说就是0上1的个数是$-\min(最小的非整体前缀和,0)+1$,$L$上-1的个数是添加上0的1后的整体的和

如果暴力dp的时间复杂度是$o(n^{2})$的,无法通过

简单贪心,可以发现如果能取1或-1一定不会填两个(最多会导致0和$L$一个上面多一个,这不劣),且对于自由的,必然是前缀选1,后缀选-1,枚举+前后缀和即可

(代码大概是有问题的,懒得查了)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 300005
4 vector<int>v;
5 int n,L,ans,x[N],t[N],vis[N][2],sum[N][2],mn[N][2];
6 long long tot;
7 int main(){
8 scanf("%d%d",&n,&L);
9 for(int i=1;i<=n;i++)scanf("%d",&x[i]);
10 for(int i=1;i<=n;i++)scanf("%d",&t[i]);
11 for(int i=1;i<=n;i++){
12 tot+=(t[i]-1)/(2*L);
13 t[i]=(t[i]-1)%(2*L)+1;
14 if (2*x[i]>=t[i])vis[i][0]=1;//可以填1
15 if (2*(L-x[i])>=t[i])vis[i][1]=1;//可以填-1
16 if ((!vis[i][0])&&(!vis[i][1]))tot++;
17 else{
18 if (!vis[i][0])v.push_back(1);//必须-1
19 if (!vis[i][1])v.push_back(0);//必须1
20 if ((vis[i][0])&&(vis[i][1]))v.push_back(2);//任意
21 }
22 }
23 tot=tot*2+v.size();
24 for(int i=0;i<v.size();i++){
25 int p=1;
26 if (v[i]==1)p=-1;
27 sum[i+1][0]=sum[i][0]+p;
28 mn[i+1][0]=min(mn[i][0],sum[i][0]);
29 }
30 for(int i=v.size()-1;i>=0;i--){
31 int p=1;
32 if (v[i])p=-1;
33 if (i==v.size()-1)mn[i][1]=0;//强制不为全体的最小前缀和
34 else mn[i][1]=min(mn[i+1][1]+p,0);
35 sum[i][1]=sum[i+1][1]+p;
36 }
37 //[0,i),[i,n)
38 ans=0x3f3f3f3f;
39 for(int i=0;i<=v.size();i++){
40 int s0=1-min(mn[i][0],sum[i][0]+mn[i][1]);
41 int s=sum[i][0]+sum[i][1]+s0;
42 ans=min(ans,s0+s);
43 }
44 printf("%lld",(ans+tot)*L);
45 }

[atAGC022D]Shopping的更多相关文章

  1. Shopping(山东省第一届ACM省赛)

    Shopping Time Limit: 1000MS Memory limit: 65536K 题目描述 Saya and Kudo go shopping together.You can ass ...

  2. sdutoj 2154 Shopping

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2154 Shopping Time Limit: ...

  3. Shopping(SPFA+DFS HDU3768)

    Shopping Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  4. eclipse中 起动tomcat时报Multiple Contexts have a path of "/shopping"

    eclipse中 启动tomcat时报Multiple Contexts have a path of "/shopping". 这个是由于你的server服务器中的server. ...

  5. 洛谷P2732 商店购物 Shopping Offers

    P2732 商店购物 Shopping Offers 23通过 41提交 题目提供者该用户不存在 标签USACO 难度提高+/省选- 提交  讨论  题解 最新讨论 暂时没有讨论 题目背景 在商店中, ...

  6. UVALive - 6572 Shopping Malls floyd

    题目链接: http://acm.hust.edu.cn/vjudge/problem/48416 Shopping Malls Time Limit: 3000MS 问题描述 We want to ...

  7. Codeforces Gym 100803C Shopping 贪心

    Shopping 题目连接: http://codeforces.com/gym/100803/attachments Description Your friend will enjoy shopp ...

  8. Codeforces Round #332 (Div. 2) A. Patrick and Shopping 水题

    A. Patrick and Shopping Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...

  9. poj 1170 Shopping Offers

    Shopping Offers Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4696   Accepted: 1967 D ...

随机推荐

  1. ReentrantLock可重入锁、公平锁非公平锁区别与实现原理

    ReentrantLock是lock接口的一个实现类,里面实现了可重入锁和公平锁非公平锁 ReentrantLock公平锁和不公平锁实现原理 公平锁会获取锁时会判断阻塞队列里是否有线程再等待,若有获取 ...

  2. NX开发 刀路生成

    此段是可以生成程序的完整代码,只有从坐标(10,10,10)到(500,500,500)一根刀轨.motion_ptr->feed_value 的值为0时生成G00,非0时生成G01.此代码只有 ...

  3. logging的基本使用

    logging模块打印log的时候主要有一下几个,级别顺序:CRITICAL>ERROR>WARNING>INFO>DEBUG: 1.日志输出到file: import log ...

  4. 【数据结构与算法Python版学习笔记】图——强连通分支

    互联网 我们关注一下互联网相关的非常巨大图: 由主机通过网线(或无线)连接而形成的图: 以及由网页通过超链接连接而形成的图. 网页形成的图 以网页(URI作为id)为顶点,网页内包含的超链接作为边,可 ...

  5. pagelayout中边界灵敏度动画时间kv

    <PageLayoutWidget>: # 默认是50dp 设置边界 border:'100dp' # 默认哪一页 page:2 # 设置翻页动画及持续时间 anim_kwargs:{'d ...

  6. 微信小程序的实现原理

    一.背景 网页开发,渲染线程和脚本是互斥的,这也是为什么长时间的脚本运行可能会导致页面失去响应的原因,本质就是我们常说的 JS 是单线程的 而在小程序中,选择了 Hybrid 的渲染方式,将视图层和逻 ...

  7. 2021.10.11考试总结[NOIP模拟74]

    T1 自然数 发现\(mex\)是单调不降的,很自然地想到用线段树维护区间端点的贡献. 枚举左端点,用线段树维护每个右端点形成区间的\(mex\)值.每次左端点右移相当于删去一个数. 记\(a_i\) ...

  8. STM32串口USART的使用方法和程序

    通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换. USART利用分数波特率发生器提供宽范围的波特率选择,支持同步单向通信和半 ...

  9. 零基础学习Linux所必备的七大习惯

    对于很多Linux初学者来说,在刚开始使用linux系统时会感到很多的不适.这里为大家整理了自己以前linux入门时别人告诉我的七个习惯.我相信如果你运用了这七个习惯,在你使用Linux时你会感觉更安 ...

  10. sql server 如何跟更新拼接的数据(cast用法)

    我们在实际中会做如下图的连接 执行以后这个连接就会报错了,如下图所示   然后我们用cast将数字转换为字符串在连接,如下图所示     这次连接的结果就没问题了,如下图所示     最后如果两个数字 ...