题:https://codeforces.com/contest/1236/problem/E

粗自:https://www.cnblogs.com/YSFAC/p/11715522.html

#include<bits/stdc++.h>
using namespace std;
#define lson root<<1,l,midd
#define rson root<<1|1,midd+1,r
typedef long long ll;
const int M=1e5+;
ll a[M],tree[M<<],lz[M<<];
ll L[M],R[M];
void build(ll root,ll l,ll r){
if(l==r){
tree[root]=l;
return ;
}
int midd=(l+r)>>;
build(lson);
build(rson);
}
ll query(ll pos,ll root,ll l,ll r){
if(l==r)
return tree[root]+lz[root];
ll midd=(l+r)>>;
if(pos<=midd)
return query(pos,lson)+lz[root];
else
return query(pos,rson)+lz[root];
}
void add(int L,int R,int c,int root,int l,int r){
if(L<=l&&r<=R){
lz[root]+=c;
return ;
}
int midd=(l+r)>>;
if(L<=midd)
add(L,R,c,lson);
if(R>midd)
add(L,R,c,rson);
}
int main(){
ll n,m;
scanf("%I64d%I64d",&n,&m);
for(int i=;i<=m;i++)
scanf("%I64d",&a[i]);
if(n==)
return cout<<"",;
//计算向右最多能走的距离
build(,,n);
for(int i=;i<=m;i++){
ll l=,r=n;
ll qul=,qur=;
while(l<=r){
ll midd=(l+r)>>;
if(query(midd,,,n)<a[i]-i)
qul=midd,l=midd+;
else
r=midd-;
}
qul++,l=,r=n;
while(l<=r){
ll midd=(l+r)>>;
if(query(midd,,,n)<=a[i]-i)
qur=midd,l=midd+;
else
r=midd-;
}
if(qul<=qur)
add(qul,qur,-,,,n);
}
for(int i=;i<=n;i++)
R[i]=min(query(i,,,n)+m+,n);
memset(tree,,sizeof(tree));
memset(lz,,sizeof(lz));
//计算向左最多能走的距离
build(,,n);
for(int i=;i<=m;i++){
ll l=,r=n;
ll qul=,qur=;
while(l<=r){
ll midd=(l+r)>>;
if(query(midd,,,n)<a[i]+i)
qul=midd,l=midd+;
else
r=midd-;
}
qul++,l=,r=n;
while(l<=r){
ll midd=(l+r)>>;
if(query(midd,,,n)<=a[i]+i)
qur=midd,l=midd+;
else
r=midd-;
}
if(qul<=qur)
add(qul,qur,,,,n);
}
for(int i=;i<=n;i++)
L[i]=max(query(i,,,n)-m-,1ll);
ll ans=;
for(int i=;i<=n;i++)
ans+=R[i]-L[i]+;
printf("%I64d",ans);
}

E. Alice and the Unfair Game(推导线段树)的更多相关文章

  1. 线段树(区间树)之区间染色和4n推导过程

    前言 线段树(区间树)是什么呢?有了二叉树.二分搜索树,线段树又是干什么的呢?最经典的线段树问题:区间染色:正如它的名字而言,主要解决区间的问题 一.线段树说明 1.什么是线段树? 线段树首先是二叉树 ...

  2. 【推导】【线段树】hdu5929 Basic Data Structure

    题意: 维护一个栈,支持以下操作: 从当前栈顶加入一个0或者1: 从当前栈顶弹掉一个数: 将栈顶指针和栈底指针交换: 询问a[top] nand a[top-1] nand ... nand a[bo ...

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

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

  4. HDU 5558 Alice's Classified Message(后缀数组+二分+rmq(+线段树?))

    题意 大概就是给你一个串,对于每个\(i\),在\([1,i-1]\)中找到一个\(j\),使得\(lcp(i,j)\)最长,若有多个最大\(j\)选最小,求\(j\)和这个\(lcp\)长度 思路 ...

  5. CH Round #52 还教室[线段树 方差]

    还教室 CH Round #52 - Thinking Bear #1 (NOIP模拟赛) [引子]还记得 NOIP 2012 提高组 Day2 中的借教室吗?时光飞逝,光阴荏苒,两年过去了,曾经借教 ...

  6. 【BZOJ-4515】游戏 李超线段树 + 树链剖分 + 半平面交

    4515: [Sdoi2016]游戏 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 304  Solved: 129[Submit][Status][ ...

  7. SPOJ COT3 Combat on a tree(Trie树、线段树的合并)

    题目链接:http://www.spoj.com/problems/COT3/ Alice and Bob are playing a game on a tree of n nodes.Each n ...

  8. HDU 4614 Vases and Flowers (2013多校2 1004 线段树)

    Vases and Flowers Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others ...

  9. 数据结构(树链剖分,线段树):SDOI 2016 游戏

    4515: [Sdoi2016]游戏 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 351  Solved: 157[Submit][Status][ ...

随机推荐

  1. 布局基础<kotlin>2,自定义控件(整理自网络)

    引导页 传送门 Android vector标签 PathData 画图 ViewPager 代码清单 activity_main.xml <?xml version="1.0&quo ...

  2. 使用Object类为实例定义方法和属性

    1.1 可以使用 Object 类直接定义个实例,并且为该对象赋属性和方法,例如: var person_1 = { nickName:"xiaowu", age:28, show ...

  3. Dlib笔记二:matrix或array2d与cv::Mat的互转

    因为经常习惯的用OpenCV来做图像处理,所以难免希望将其他库的图像数据与OpenCV互转,所以今天就记录下这种互转的方法. 1.dlib::matrix/dlib::array2d转cv::Mat ...

  4. Intellij IDEA破解方法

    1.破解(参考网站) http://idea.lanyus.com/ 2. Intellij idea使用教程 https://github.com/tengj/IntelliJ-IDEA-Tutor ...

  5. 教你如何使用JavaScript入门

    JavaScript简介   JavaScript是NetScape公司为Navigator浏览器开发的,是web前端卸载HTML文件中的一种脚本语言,能实现网页内容的交互显示.当用户在客户端显示该网 ...

  6. import datetime

    import datetimenow = datetime.datetime.now()print('当前时间:',now) 当前时间: 2019-11-21 11:11:58.093122

  7. vue累加计数器

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. java8+tomcate8仅支持TLSv1.2

    1.编辑$tomcat_home/conf/server.xml <Connector protocol="org.apache.coyote.http11.Http11NioProt ...

  9. 04-for循环的各个语句及list列表学习

    目录 04-for循环的各个语句及list列表学习 1. for循环 2. range()函数 3. 循环语句中的break.continue.pass 4. list列表 5. 列表生成式 6. 实 ...

  10. Java中的四种引用类型比较

    1.引用的概念 引用这个概念是与JAVA虚拟机的垃圾回收有关的,不同的引用类型对应不同的垃圾回收策略或时机. 垃圾收集可能是大家感到难于理解的较难的概念之一,因为它并不能总是毫无遗漏地解决Java运行 ...