传送门

首先可以注意到对于固定的起点 $S$ ,它最终能走到的终点一定是一段区间

这个用反证法容易证明,假设合法区间存在断点,这个点左右都可以作为终点

那么分成区间断点在起点左边和起点右边讨论一下即可,起点本身显然一定可以作为终点

然后现在只要考虑从每个起点出发能走到的最左和最右的位置即可算出答案

首先考虑往右(以下为了方便把第 $i$ 次询问说成第 $i$ 天)

设起点为 $x$ 那么我们可以一直往右走直到遇到某一天刚好询问原本要走的下一个位置,那么此时就要停一次

设连续走了 $y$ 天遇到这个情况,那么有 $x+y=a[y]$ ,即 $x=a[y]-y$,然后等完一步以后我们就要找到下一个 $y$ 使得 $x+1+y=a[y]$

设 $f(x,y)$ 表示在第 $y$ 天从 $x$ 出发最右能到达的位置,那么只要求出 $f(x,y)$ 往右第一个停止位置那么就变成了位置更右,天数更大的的子问题

设 $z$ 为最小的满足 $x+z=a[y+z]$ 的数,那么转化一下等价于 $x-y=a[y+z]-(y+z)$

往右第一个停止位置显然是可以维护的,只要按时间倒过来一个个考虑,用一个 $map$ 维护一下当前时间往后最左的第一个 $a[i]-i$ 的询问

同时注意到只有当恰好在位置 $a[i]-1$,时间在 $i$ 时才会停止一次,那么我们想要知道的位置就只和询问时间有关,所以维护时间即可

那么总结一下就是按时间 $i$ 从大到小枚举 ,搞个 $map$ 维护一下当前最小的 $j>i$ 使得 $a[j]-j==(a[i]-1)-i$

然后就可以求出 $R[i]$ 表示往右走刚好在时间 $i$ 停止一天后继续走能走到的最右端($R[i]=R[j]$,$j=map[(a[i]-1)-i]$,意思就是找到下一个停止的时间点转移)

当然如果 $map$ 里没有合法的 $j$ ,那么就说明不用停,走到时间结束即可

对于往左也是同样的做法,学着上面的思路自己推一下吧

事实上 $map$ 完全可以用桶替代,只要把下标集体加 $m$ 即可

代码参考: Farhod_Farmon

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=1e5+;
int n,m,A[N],L[N],R[N];
map <int,int> ml,mr;
inline int find_r(int x,int i) { return mr[x-i] ? R[mr[x-i]] : min(x+(m-i)+,n); }
inline int find_l(int x,int i) { return ml[x+i] ? L[ml[x+i]] : max(x-(m-i)-,); }
int main()
{
n=read(),m=read();
for(int i=;i<=m;i++) A[i]=read();
if(n==) { printf("0\n"); return ; }
for(int i=m;i>=;i--)
{
L[i]=find_l(A[i]+,i); R[i]=find_r(A[i]-,i);
ml[A[i]+i]=i; mr[A[i]-i]=i;
}
ll ans=;
for(int i=;i<=n;i++)
ans+=find_r(i,)-i++i-find_l(i,);//中间那个+1是起点本身作为终点的贡献
printf("%lld\n",ans);
return ;
}

Codeforces 1236E. Alice and the Unfair Game的更多相关文章

  1. Codeforces - 346A - Alice and Bob - 简单数论

    http://codeforces.com/problemset/problem/346/A 观察了一下,猜测和他们的最大公因数有关,除以最大公因数前后结果是不会变的. 那么怎么证明一定是有n轮呢?我 ...

  2. CodeForces 346A Alice and Bob (数学最大公约数)

    题意:有一堆数,然后有两个人轮流从中取出两个数,这两个数的差的绝对值不在这个集合,然后把这个数放进这个集合,如果哪个人不能拿了,就是输了,问你谁赢. 析:当时连题意都没看好,以为拿出两个数,就不放回了 ...

  3. Codeforces Round #392 (Div. 2) Unfair Poll

    C. Unfair Poll time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  4. E. Alice and the Unfair Game(推导线段树)

    题:https://codeforces.com/contest/1236/problem/E 粗自:https://www.cnblogs.com/YSFAC/p/11715522.html #in ...

  5. Codeforces 1236F - Alice and the Cactus(期望+分类讨论)

    Codeforces 题面传送门 & 洛谷题面传送门 期望好题. 首先拆方差: \[\begin{aligned} &E((x-E(x))^2)\\ =&E(x^2)-2E(x ...

  6. [cf 1236 E] Alice and the Unfair Game

    题意: 给定一个长度为m的序列$A$,你有一个长度为n的棋盘,可以任选一个位置x作为起点. 在时刻$[1,m+1]$你可以向左或向右移动一格. 设时刻i你移动后所在的位置为$B_i$,你需要满足对于任 ...

  7. Codeforces 1236D. Alice and the Doll

    传送门 注意到每个位置只能右转一次,首先考虑如果图没有障碍那么显然要走螺旋形的 然后现在有障碍,容易发现对于某个位置如果既可以直走又可以右转,那么一定会选择直走 因为如果转了以后就一定没法走到原本直走 ...

  8. Codeforces 1236B. Alice and the List of Presents

    传送门 显然每种礼物是互相独立的,一个礼物的分配不会影响另一个礼物 对于某个礼物 $x$ , 对于每个盒子来说,要么选要么不选,那么可以看成长度为 $m$ 的二进制序列 这个序列第 $i$ 位的数就代 ...

  9. Codeforces Round #593 (Div. 2)

    传送门 A. Stones 签到. B. Alice and the List of Presents 单独考虑每个数的贡献即可. 答案为\((2^{m}-1)^n\). C. Labs 构造就类似于 ...

随机推荐

  1. ACM之路(14)—— 线段树的日常(上)

    我的线段树简直有毒,各种错误都能忙上半天.做了kuangbin的线段树专题的一半,还有一半留到以后去做. 链接:http://acm.hust.edu.cn/vjudge/contest/view.a ...

  2. 在iOS开发中使用icon font的方法

    http://iconfont.cn/help/iconuse.html 在开发阿里数据iOS版客户端的时候,由于项目进度很紧,项目里的所有图标都是用最平常的背景图片方案来实现.而为了要兼容普通屏与R ...

  3. python 牛顿迭代法

    使用牛顿迭代法求方程  在x附近的一个实根. 赋值X,即迭代初值:用初值x代入方程中计算此时的f(x)=(a * x * x * x + b * x * x + c * x + d)和f’(x)=(3 ...

  4. java代码实现简体繁体转换

    汉字分为简体和繁体字,这是众所周知的,虽然繁体字中国大陆这边用的并不会太多,但时不时的还是会使用到.那么,如何做到简体字和繁体字的转换呢?其实很简单,这里附上一个java版本的简繁体转换,用网上找的接 ...

  5. Web实现前后端分离,前后端解耦

    一.前言 ”前后端分离“已经成为互联网项目开发的业界标杆,通过Tomcat+Ngnix(也可以中间有个Node.js),有效地进行解耦.并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务架构 ...

  6. MongoDB的安装及配置(Win7)

    一.下载MongoDB 登录Mongodb官网https://www.mongodb.com/download-center#community 二.安装MongoDB 安装真的比较简单 next就可 ...

  7. delphi 中Adoquery ,在打开时能否让记录指针不移动? [问题点数:40分,结帖人microd]

    delphi 中Adoquery ,在打开时能否让记录指针不移动?由于数据集Adoquery 时,它的针指称动会废时,能否在打开完成之前不让记录指针不移动.打开完毕之后再回复移动? 这样用:self. ...

  8. Java日志体系(五)logback

    1.1 简介 师出同门,与log4j一样,logback也是由Ceki Gülcü开发的开源日志组件,可以说是log4j的改进版:在现如今的项目中,logback的出现次数越来越多,是目前主流首选的日 ...

  9. Spring-Kafka —— 实现批量消费和手动提交offset

    spring-kafka的官方文档介绍,可以知道自1.1版本之后, @KafkaListener开始支持批量消费,只需要设置batchListener参数为true 把application.yml中 ...

  10. Spring Boot Mybatis简单使用

    Spring Boot Mybatis简单使用 步骤说明 build.gradle:依赖添加 application.properties:配置添加 代码编写 测试 build.gradle:依赖添加 ...