[cf 1236 E] Alice and the Unfair Game
题意:
给定一个长度为m的序列$A$,你有一个长度为n的棋盘,可以任选一个位置x作为起点。
在时刻$[1,m+1]$你可以向左或向右移动一格。
设时刻i你移动后所在的位置为$B_i$,你需要满足对于任意$1\leq i\leq m$,$A_{i}\neq B_{i}$。
求有多少对有序数对$(x,y)$,使得以x为起点且以y为终点的合法移动路径存在。
$n,m\leq 10^{5},1\leq A_{i}\leq n$。
题解:
首先观察出一个性质:设x向左最远走到l,向右最远走到r,则$[l,r]$中的位置都可以走到。
为什么呢?我们总可以在不超过m步走到这些位置,然后通过“反复横跳”的操作来躲避$A_{i}$(第m+1步的移动保证了这一点)。
考虑如何求出右边界$r(x)$,首先我们可以按照题意直接走。复杂度为$O(n^2)$貌似自闭。
当什么时候我们这一步走不了呢?设当前时间为t,走到了xt。
那么如果$t$后面的一个$i$能挡住我当且仅当其满足$A_{i}-xt=i-t$。
移个项,$A_{i}-i=xt-t$,那么将这两项视为两个点$(i,A_{i})$和$(t,xt)$,限制条件就相当于他们在同一条斜率为1的直线上。
那么现在就有两种做法,一种是维护这些直线然后$O(n)$线性处理,另外一种是用线段树模拟每一步走的操作。
观察博客的题目可知,我写的是后一种。
考虑在线段树中维护每个点x的位置$pos_{x}$,问题需要我们每次将所有能走的点往右走一步,也就是pos整体+1。
运用lazy标记的思想,我们可以每次仅将不能走的点-1,最后把pos整体+m即可。
如果这样处理的话,那么对于每个限制,(由第一个公式)它影响的就是所有$(pos+lazy)-t=A_{i}-i$的点。
因为增量lazy和t恰好抵消,于是每个限制影响的就是$pos=A_{i}-i$的点。
那么我们直接二分找到这样的一段(注意是一段),然后将其整体-1即可。
最终x的右边界就是$r(x)=seg(x)+m+1$,左边界处理方法类似,但注意移项出来是$A_{i}+i$。
复杂度$O(nlogn)$。
代码:
#include<bits/stdc++.h>
#define maxn 100005
#define maxm 500005
#define inf 0x7fffffff
#define ll long long using namespace std;
ll N,M,A[maxn],B[maxn],tr[maxn<<];
ll R[maxn],L[maxn],lz[maxn<<]; inline ll read(){
ll x=,f=; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
} inline void build(ll l,ll r,ll k){
if(l==r){tr[k]=l;return;}
ll mid=l+r>>;
build(l,mid,k<<);
build(mid+,r,k<<|);
return;
}
inline void add(ll l,ll r,ll x,ll y,ll v,ll k){
if(x<=l && r<=y){lz[k]+=v;return;}
ll mid=l+r>>;
if(x<=mid) add(l,mid,x,y,v,k<<);
if(y>mid) add(mid+,r,x,y,v,k<<|);
return;
}
inline ll query(ll l,ll r,ll p,ll k){
if(l==r) return tr[k]+lz[k];
ll mid=l+r>>;
if(p<=mid) return query(l,mid,p,k<<)+lz[k];
else return query(mid+,r,p,k<<|)+lz[k];
} int main(){
N=read(),M=read();
for(ll i=;i<=M;i++) A[i]=read();
if(N==){cout<<""<<endl;return ;}
build(,N,);
for(ll i=;i<=M;i++){
ll l=,r=N,ansl=,ansr=;
while(l<=r){
ll mid=l+r>>;
if(query(,N,mid,)<A[i]-i) ansl=mid,l=mid+;
else r=mid-;
}
ansl++,l=,r=N;
while(l<=r){
ll mid=l+r>>;
if(query(,N,mid,)<=A[i]-i) ansr=mid,l=mid+;
else r=mid-;
}
if(ansl<=ansr) add(,N,ansl,ansr,-,);
}
for(ll i=;i<=N;i++) R[i]=min(query(,N,i,)+M+,N);
memset(tr,,sizeof(tr));
memset(lz,,sizeof(lz));
build(,N,);
for(ll i=;i<=M;i++){
ll l=,r=N,ansl=,ansr=;
while(l<=r){
ll mid=l+r>>;
if(query(,N,mid,)<A[i]+i) ansl=mid,l=mid+;
else r=mid-;
}
ansl++,l=,r=N;
while(l<=r){
ll mid=l+r>>;
if(query(,N,mid,)<=A[i]+i) ansr=mid,l=mid+;
else r=mid-;
}
if(ansl<=ansr) add(,N,ansl,ansr,,);
}
for(ll i=;i<=N;i++) L[i]=max(query(,N,i,)-M-,1ll*);
ll ans=;
for(ll i=;i<=N;i++) ans+=R[i]-L[i]+;
cout<<ans<<endl;
return ;
}
E
[cf 1236 E] Alice and the Unfair Game的更多相关文章
- E. Alice and the Unfair Game(推导线段树)
题:https://codeforces.com/contest/1236/problem/E 粗自:https://www.cnblogs.com/YSFAC/p/11715522.html #in ...
- Codeforces 1236E. Alice and the Unfair Game
传送门 首先可以注意到对于固定的起点 $S$ ,它最终能走到的终点一定是一段区间 这个用反证法容易证明,假设合法区间存在断点,这个点左右都可以作为终点 那么分成区间断点在起点左边和起点右边讨论一下即可 ...
- Codeforces Round #593 (Div. 2)
传送门 A. Stones 签到. B. Alice and the List of Presents 单独考虑每个数的贡献即可. 答案为\((2^{m}-1)^n\). C. Labs 构造就类似于 ...
- cf C. Alice and Bob
http://codeforces.com/contest/347/problem/C 这道题就是求出n个数的最大公约数,求出n个数的最大值,总共有max1/gcd-n个回合.然后判断如果回合数%2= ...
- (中等) CF 585C Alice, Bob, Oranges and Apples,矩阵+辗转相除。
Alice and Bob decided to eat some fruit. In the kitchen they found a large bag of oranges and apples ...
- CF6C Alice, Bob and Chocolate
CF6C Alice, Bob and Chocolate 题目链接 写了一天搜索写的有点累了,就顺手水了一道CF的模拟题 这道题就是简单的模拟整个题的过程,注意最后输出的形式就好了QWQ AC代码如 ...
- CF #575 Div3
// 比赛链接:https://codeforces.com/contest/1196 // CF 2019.7.24 // 本想Div3手速场上分,结果卡在C题,掉了不少分. // 自闭了这么久,今 ...
- A - Alice and the List of Presents (排列组合+快速幂取模)
https://codeforces.com/contest/1236/problem/B Alice got many presents these days. So she decided to ...
- [cf]Codeforces Round #784(Div 4)
由于一次比赛被虐得太惨,,生发开始写blog的想法,于是便有了这篇随笔(找了个近期的cf比赛练练手(bushi))第一次写blog,多多包涵. 第二场cf比赛,第一场打的Div2,被虐太惨,所以第二场 ...
随机推荐
- 第09组 Alpha冲刺(1/6)
队名:观光队 组长博客 作业博客 组员实践情况 王耀鑫 过去两天完成了哪些任务 文字/口头描述 完成服务器连接数据库部分代码 展示GitHub当日代码/文档签入记录 接下来的计划 与服务器连接,配合前 ...
- Reconstructing Cloud-Contaminated Multispectral Images With Contextualized Autoencoder Neural Networks(自编码机重建云污染区)
1.逐像元输入输出与邻域输入输出,邻域处理是先flatten,再unflatten 2.用MDL方法(最小描述长度)寻找自编码机最佳隐藏层数 3.多目标优化方法寻找MDL方法的超参数,平衡MDL方法两 ...
- 【CSP膜你赛】柠檬的密码(manacher 二分 单调性 st表)
题目描述 Lemon觉得他需要一个复杂的密码来保证他的帐号的安全.他经过多日思考,决定使用一个长度为奇数的回文串来作为他的密码. 但是这个回文串太长了,Lemon记不住,于是Lemon决定把它记在本 ...
- Linux里使用rz和sz命令
lrzsz是一个unix通信套件提供的X,Y,和ZModem文件传输协议,官网:http://freecode.com/projects/lrzsz/ windows 需要向centos服务器上传文件 ...
- docker安装 与 基本配置
1.安装docker #yum remove docker \ docker-common \ container-selinux \ docker-selinux \ docker-engine \ ...
- [技术博客] win10下vagrant+centos7 rails虚拟开发机配置流程
由于少昂早年已经在此踩过坑了,因此在这里,我们现在直接贴上他早年的博客链接:https://www.cnblogs.com/HansBug/p/7403306.html
- java对象生成随意属性值
public class RandomObjectValue { public static <T> T getObject(Class<?> clazz) { T t = n ...
- Redis中删除过期Key的三种策略
转载自:http://blog.csdn.net/a_bang/article/details/52986935?locationNum=9&fps=1 项目中有个接口要频繁调用查询数据库中的 ...
- vue+elementui项目打包后样式变化问题
博主刚刚解决了index.html空白问题,刚打开项目页面又发现了样式出现了大问题,样式与开发版本有很大不同,有些样式没有生效.利用搜索引擎,找到了问题所在以及解决办法:main.js中的引入顺序决定 ...
- Xamarin.FormsShell基础教程(5)Shell项目内容新建页面
Xamarin.FormsShell基础教程(5)Shell项目内容新建页面 轻拍内容列表页面中的Add按钮后,进入内容新建页面,如图1.4和图1.5所示.在该页面中,用户可以设置新建内容的标题和具体 ...