http://codeforces.com/contest/675/problem/E

题目大意:有n个车站,每个车站只能买一张票,这张票能从i+1到a[i]。定义p[i][j]为从i到j所需要买的最小票数。问sigma(p)的和是多少。

思路:感觉我的dp定义能力还是太弱了啊,我刚开始还定义成dp[i]表示1~i-1到i所需要的最小花费和,后来发现这样子我转移不了啊!!

于是重新定义dp[i]表示从i出发到i+1~n所需要的最小票数,然后这样定义就能很好的解决问题啦。然后我们每次贪心的选取j = i+1~a[i]中的a[j]跑的最远的那个,然后进行转移就好了,具体的用线段树维护一下区间吧。

TAT感觉是不难的题目

//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha\n")
const int maxn = 1e5 + ;
int a[maxn];
int n;
struct Tree{
int lpos, rpos;
Tree(int l = , int r = ): lpos(l), rpos(r){}
}tree[maxn << ]; inline void push_up(int o){
int lb = o << , rb = o << | ;
tree[o].rpos = max(tree[lb].rpos, tree[rb].rpos);
if (tree[lb].rpos >= tree[rb].rpos) {
tree[o].lpos = tree[lb].lpos;
}
else tree[o].lpos = tree[rb].lpos;
} void build_tree(int l, int r, int o){
if (l == r){
tree[o].rpos = a[l];
tree[o].lpos = l;
return ;
}
int mid = (l + r) / ;
if (l <= mid) build_tree(l, mid, o << );
if (r > mid) build_tree(mid + , r, o << | );
push_up(o);
} Tree query(int l ,int r, int ql, int qr, int o){
if (ql <= l && qr >= r){
return tree[o];
}
Tree ans, re;
ans.lpos = re.lpos = ans.rpos = re.rpos = ;
int mid = (l + r) / ;
if (ql <= mid)
ans = query(l, mid, ql, qr, o << );
if (qr > mid)
re = query(mid + , r, ql, qr, o << | );
if (ans.rpos < re.rpos) ans = re;
return ans;
} LL dp[maxn];///定义从i开始走到n所需要的最小花费
int main(){
scanf("%d", &n);
a[n] = n;
for (int i = ; i <= n - ; i++) scanf("%d", a + i);
memset(tree, , sizeof(tree));
build_tree(, n, );
LL ans = ;
for (int i = n - ; i > ; i--){
Tree pos = query(, n, i + , a[i], );
dp[i] = n - i + dp[pos.lpos] - (a[i] - pos.lpos);
ans += 1LL * dp[i];
}
printf("%lld\n", ans);
return ;
}

最新文章

  1. 异常处理_Maven之web项目java.lang.LinkageError
  2. android IOC框架学习记录
  3. HDU 1828 / POJ 1177 Picture --线段树求矩形周长并
  4. 最长连续回文串(最优线性时间O(n))
  5. java 语法糖
  6. C - Catch That Cow
  7. fopen 參数具体解释
  8. Fedora 17 下安装codeblocks
  9. 修改合同号的bapi
  10. SQL表连接
  11. Glide 这样用,更省内存!!!
  12. 小程序中曾经遇到的坑(1)----canvas画布
  13. Caused by: java.lang.ClassNotFoundException: org.apache.commons.fileupload.RequestContext
  14. Linux环境变量总结
  15. java实验四《Android程序设计》实验报告
  16. Tomcat 部署 Web 项目的本质理解
  17. Linux系统学习之网络管理
  18. donet core 2.1 DateTime ToString() 方法 在不同平台返回的时间格式不一样?
  19. 根据自定义区域裁剪ArcGIS切片地图服务
  20. Report_Report Builder的一些基本概念(概念)

热门文章

  1. LINQ 查询集合总的重复项
  2. UVa 1354 Mobile Computing | GOJ 1320 不加修饰的天平问题 (例题 7-7)
  3. php 随笔
  4. 关于Unity项目中创建项目遇到的一些问题
  5. JS 之完美运动框架
  6. 缓存HA的开源解决方案
  7. F - 小晴天老师系列——苹果大丰收
  8. CSSd的优先级别
  9. Yii2.0的安装与配置教程
  10. 远程桌面协议浅析(VNC/SPICE/RDP)