CF 675E Trains and Statistic
草稿和一些题解而已
因为指针太恶心了
所以query决定还是要试试自己yy一下
#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
using namespace std;
int maxx[4000101],poss[4000101],n;
struct node{
int a,posl;
};
void pushup(int rt){
if (maxx[rt<<1]>maxx[rt<<1|1])maxx[rt]=maxx[rt<<1],poss[rt]=poss[rt<<1];
else maxx[rt]=maxx[rt<<1|1],poss[rt]=poss[rt<<1|1];
}
void build(int l, int r, int rt) {
if (l == r){
maxx[rt]=0;
poss[rt]=l;return ;
}
int m = (l + r) >> 1;
build(l,m,rt<<1);
build(m+1,r,(rt<<1)|1);
pushup(rt);
}
void update(int p,int c, int l,int r,int rt) {
if (l == r){
maxx[rt]=c;return ;
}
int m=(l+r)>>1;
if(p<=m)update(p,c,l,m,rt<<1);
else update(p,c,m+1,r,(rt<<1)|1);
pushup(rt);
}
node query(int L, int R, int l, int r, int rt){
if (L <= l&&r<= R){
node x;
x.a=maxx[rt];x.posl=poss[rt];
return x;
}
int m =(l+r)>>1;
node ans;ans.a=0;
if(L<=m){
node kk=query(L,R,l, m,rt<<1);if(kk.a>ans.a)ans=kk;
}
if(R>m){
node kk=query(L,R,m+1,r,(rt<<1)|1);if(kk.a>ans.a)ans=kk;
}
return ans;
}
ll a[101000],dp[101000];
int main(){
scanf("%d",&n);
memset(dp,0,sizeof(dp));
ll ans=0;
build(1,n,1);
for(int i=1;i<=n-1;i++)scanf("%lld",&a[i]);
update(n,n,1,n,1);
for(int i=n-1; i>=1;i--){
node temp=query(i+1,a[i],1,n,1);
dp[i]=dp[temp.posl]+(n-i)-(a[i]-temp.posl);
ans+=dp[i];
update(i,a[i],1,n,1);
}
printf("%lld",ans);
return 0;
}
yy完毕,写了个傻逼结构体
CF 675E Trains and Statistic的更多相关文章
- Codeforces 675E Trains and Statistic - 线段树 - 动态规划
题目传送门 快速的vjudge通道 快速的Codeforces通道 题目大意 有$n$个火车站,第$i$个火车站出售第$i + 1$到第$a_{i}$个火车站的车票,特殊地,第$n$个火车站不出售车票 ...
- Codeforces 675E Trains and Statistic(DP + 贪心 + 线段树)
题目大概说有n(<=10W)个车站,每个车站i卖到车站i+1...a[i]的票,p[i][j]表示从车站i到车站j所需买的最少车票数,求所有的p[i][j](i<j)的和. 好难,不会写. ...
- codeforces 675E Trains and Statistic 线段树+贪心统计
分析:这个题刚看起来无从下手 但是我们可以先简化问题,首先可以固定起点i,求出i+1到n的最小距离 它可以到达的范围是[i+1,a[i]],贪心的想,我们希望换一次车可以到达的距离尽量远 即:找一个k ...
- CodeForces 675E Trains and Statistic
贪心,递推,线段树,$RMQ$. 假设我们记$ans[i]$是以$i$点为起点对答案的贡献,那么答案就是$\sum\limits_{i = 1}^n {ans[i]}$. $ans[i]$怎么计算呢? ...
- codeforces 675E E. Trains and Statistic(线段树+dp)
题目链接: E. Trains and Statistic time limit per test 2 seconds memory limit per test 256 megabytes inpu ...
- Codeforces Round #353 (Div. 2) E. Trains and Statistic dp 贪心
E. Trains and Statistic 题目连接: http://www.codeforces.com/contest/675/problem/E Description Vasya comm ...
- 【34.54%】【codeforces 675E】Trains and Statistic
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 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的最短距离之 ...
- 【CF675E】Trains and Statistic(贪心,DP,线段树优化)
题意:a[i]表示从第i个车站可以一张票到第[i+1,a[i]]这些车站;p[i][j]表示从第i个车站到第j个车站的最少的票数,现在要求∑dp[i][j](1<=i<=n,i<j& ...
随机推荐
- 2040-亲和数(java)
http://acm.hdu.edu.cn/showproblem.php?pid=2040 import java.util.Scanner; public class Main{ public s ...
- Golang格式化小结
Golang的格式化使用了与c.python等语言类似的风格,但是更加丰富和通用.格式化函数在fmt包中,如:fmt.Printf,fmt.Fprintf,fmt.Sprintf,fmt.Printl ...
- 【洛谷】【st表+模拟】P1311 选择客栈
[题目描述:] 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖 ...
- PHP中对用户身份认证实现两种方法
用户在设计和维护站点的时候,经常需要限制对某些重要文件或信息的访问.通常,我们可以采用内置于WEB服务器的基于HTTP协议的用户身份验证机制. 当访问者浏览受保护页面时,客户端浏览器会弹出对话 ...
- Kubernetes 详解
Kubernetes主要由以下几个核心组件组成: etcd保存了整个集群的状态: apiserver提供了资源操作的唯一入口,并提供认证.授权.访问控制.API注册和发现等机制: controller ...
- 学习笔记——线程 Thread
Thread是.net1.0 1.1时出现的 主要了解线程等待.回调.前后台线程区别 1.实例: //定义:public delegate void ThreadStart(); ThreadStar ...
- [图解tensorflow源码] TF系统概述篇
Rendezvous 1. 定义在core/framework/rendezvous.h 2. A Rendezvous is an abstraction for passing a Tensor ...
- 404 Note Found队 福大助手项目测评
目录 第一部分 调研,评测 福大助手的bug IOS端 Android端 福大助手结构体系的思维导图 为什么开发人员没有发现这个bug 假设团队开发这款app,应注意哪些方面(架构.部署运维.微服务等 ...
- Spark MemoryManager内存模型
- ubuntu 9.10 切换到root用户
昨天装了ubuntu9.10,登陆后是普通用户,操作不方便,上网上查了资料,有很多方法,我发现最简单的方法 有些资料说,ubuntu每次重启root密码是随机的(当你没有设置密码时), 打开终端: $ ...