分析:这个题刚看起来无从下手

但是我们可以先简化问题,首先可以固定起点i,求出i+1到n的最小距离

它可以到达的范围是[i+1,a[i]],贪心的想,我们希望换一次车可以到达的距离尽量远

即:找一个k,使得i+1<=k<=a[i],a[k]的值最大,就可以保证,换一次车,可以到达的距离最

找k的操作可以用线段树来完成

统计当前dp[i]=dp[k]+(n-i)-(a[i]-k),因为当前区间内的点在[k+1,a[i]]的点多计了一次,所以减去

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
#include <map>
#include <queue>
#include <set>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const int N=1e5+;
int c[N<<],a[N];
LL dp[N];
void up(int rt){
if(a[c[rt<<]]>=a[c[rt<<|]])
c[rt]=c[rt<<];
else c[rt]=c[rt<<|];
}
void build(int rt,int l,int r){
if(l==r){c[rt]=l;return;}
int m=(l+r)>>;
build(rt<<,l,m);
build(rt<<|,m+,r);
up(rt);
}
int ask(int rt,int l,int r,int x,int y){
if(x<=l&&r<=y)return c[rt];
int ls=-,rs=-,m=(l+r)>>;
if(x<=m)ls=ask(rt<<,l,m,x,y);
if(y>m)rs=ask(rt<<|,m+,r,x,y);
if(ls==-)return rs;
if(rs==-)return ls;
if(a[ls]>=a[rs])return ls;
else return rs;
}
int main(){
int n;
scanf("%d",&n);
for(int i=;i<n;++i)
scanf("%d",&a[i]);
a[n]=n;
LL ret=;
build(,,n);
for(int i=n-;i>;--i){
int pos=ask(,,n,i+,a[i]);
dp[i]=dp[pos]+(n-i)-(a[i]-pos);
ret+=dp[i];
}
printf("%I64d\n",ret);
return ;
}

codeforces 675E Trains and Statistic 线段树+贪心统计的更多相关文章

  1. Codeforces 675E Trains and Statistic - 线段树 - 动态规划

    题目传送门 快速的vjudge通道 快速的Codeforces通道 题目大意 有$n$个火车站,第$i$个火车站出售第$i + 1$到第$a_{i}$个火车站的车票,特殊地,第$n$个火车站不出售车票 ...

  2. Codeforces 675E Trains and Statistic(DP + 贪心 + 线段树)

    题目大概说有n(<=10W)个车站,每个车站i卖到车站i+1...a[i]的票,p[i][j]表示从车站i到车站j所需买的最少车票数,求所有的p[i][j](i<j)的和. 好难,不会写. ...

  3. codeforces 675E E. Trains and Statistic(线段树+dp)

    题目链接: E. Trains and Statistic time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  4. CodeForces 675E Trains and Statistic

    贪心,递推,线段树,$RMQ$. 假设我们记$ans[i]$是以$i$点为起点对答案的贡献,那么答案就是$\sum\limits_{i = 1}^n {ans[i]}$. $ans[i]$怎么计算呢? ...

  5. Codeforces Round #353 (Div. 2) E. Trains and Statistic 线段树+dp

    题目链接: http://www.codeforces.com/contest/675/problem/E 题意: 对于第i个站,它与i+1到a[i]的站有路相连,先在求所有站点i到站点j的最短距离之 ...

  6. BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心

    BZOJ_1826_[JSOI2010]缓存交换 _线段树+贪心 Description 在计算机中,CPU只能和高速缓存Cache直接交换数据.当所需的内存单元不在Cache中时,则需要从主存里把数 ...

  7. Bzoj5251 线段树+贪心

    Bzoj5251 线段树+贪心 记录本蒟蒻省选后的第一篇题解!国际惯例的题面:首先这个东西显然是一棵树.如果我们把数值排序,并建立这棵树的dfs序,显然dfs序上的一个区间对应数值的一个区间,且根为数 ...

  8. 2018.10.20 NOIP模拟 蛋糕(线段树+贪心/lis)

    传送门 听说是最长反链衍生出的对偶定理就能秒了. 本蒟蒻直接用线段树模拟维护的. 对于第一维排序. 维护第二维的偏序关系可以借助线段树/树状数组维护逆序对的思想建立权值线段树贪心求解. 代码

  9. codeforces Good bye 2016 E 线段树维护dp区间合并

    codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...

随机推荐

  1. POJ1321棋盘问题

    http://poj.org/problem?id=1321 题意 : 我能说这是迄今为止见到的POJ上第二道中文题吗,既然是中文也很好理解,就不详述了 思路 : 典型的深搜DFS ; #includ ...

  2. hdu 4676 Sum Of Gcd

    离线+分块!! 思路:序列a[1],a[2],a[3]……a[n] num[i]表示区间[L,R]中是i的倍数的个数:euler[i]表示i的欧拉函数值. 则区间的GCD之和sum=∑(C(num[i ...

  3. 2013 ACM-ICPC长沙赛区全国邀请赛—Special equations

    ……但是没仔细看,直接跳过了 这题直接枚举就可以过了 ;}

  4. asp.net后台获取路径的各种方法归纳

    asp.net后台获取路径的各种方法归纳   1.Request.CurrentExecutionFilePath    获取当前请求的虚拟路径,不同于 FilePath,差别在于如果请求已在服务器代 ...

  5. 欧拉工程第60题:Prime pair sets

    题目链接 五个数,任意两个数的任意链接后的数还是质数 满足这个条件的最小五个数的和是多少? 结果:26033 纯暴力破解: package projecteuler51to60; import jav ...

  6. Mmap的实现原理和应用

    http://blog.csdn.net/edwardlulinux/article/details/8604400 很多文章分析了mmap的实现原理.从代码的逻辑来分析,总是觉没有把mmap后读写映 ...

  7. MySQL 5.7 SYS scheme解析

    sys 库是MySQL 5.7其中的一个系统库,里面有很多很好用的跟性能相关的视图.函数和存储过程, 增强MySQL的易用性 例如:哪些语句使用了临时表,哪个用户请求了最多的io,哪个线程占用了最多的 ...

  8. flume介绍以及环境的部署

    收集.聚合时间流数据分布式框架.通常用户log数据 采用ad-hoc方案,明显有点如下: 可靠的.可伸缩.可管理.可定制.高性能 声名式配置,可以动态配置 提供上下文路由功能 支持负载均衡和故障转移 ...

  9. oracle lsnrctl status|start|stop

    [oracle@redhat4 ~]$ lsnrctl status LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 06-OCT-2015 ...

  10. 域名服务器--DNS

    .域名 .DNS.DNS 端口号 .DNS服务器 .域名解析过程及原理 .动态域名解析(DDNS)服务的原理 域名 域名是与主机名称一一对应的一个名字.使得人们可以通过ip的名字来访问ip,域名就是为 ...