Codeforces Round #353 (Div. 2) E. Trains and Statistic dp 贪心
E. Trains and Statistic
题目连接:
http://www.codeforces.com/contest/675/problem/E
Description
Vasya commutes by train every day. There are n train stations in the city, and at the i-th station it's possible to buy only tickets to stations from i + 1 to ai inclusive. No tickets are sold at the last station.
Let ρi, j be the minimum number of tickets one needs to buy in order to get from stations i to station j. As Vasya is fond of different useless statistic he asks you to compute the sum of all values ρi, j among all pairs 1 ≤ i < j ≤ n.
Input
The first line of the input contains a single integer n (2 ≤ n ≤ 100 000) — the number of stations.
The second line contains n - 1 integer ai (i + 1 ≤ ai ≤ n), the i-th of them means that at the i-th station one may buy tickets to each station from i + 1 to ai inclusive.
Output
Print the sum of ρi, j among all pairs of 1 ≤ i < j ≤ n.
Sample Input
4
4 4 4
Sample Output
6
Hint
题意
你可以从第i个城市买的从i到[i+1,a[i]]的车票,现在Pij表示从i到j的最小车票花费
现在让你求sigma p[i][j]
题解:
考虑 dp[i]表示从i到[i+1,n]的p[i][j]和
那么如果j<=a[i]的话,就+=1,否则就贪心找到[i+1,a[i]]里面a[i]最大的那个车站,转移到这个车站去
dp[i][j] = dp[m][j]+1,这样贪心肯定是最小的
然后根据这个莽一波dp就好了
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
typedef pair<int,int> SgTreeDataType;
struct treenode
{
    int L , R  ;
    SgTreeDataType sum;
    void update(int v)
    {
        sum=make_pair(v,L);
    }
};
treenode tree[maxn*4];
inline void push_down(int o)
{
}
inline void push_up(int o)
{
    if(tree[2*o].sum.first<=tree[2*o+1].sum.first)
        tree[o].sum.second=tree[2*o+1].sum.second;
    else
        tree[o].sum.second=tree[2*o].sum.second;
    tree[o].sum.first = max(tree[2*o].sum.first,tree[2*o+1].sum.first);
}
inline void build_tree(int L , int R , int o)
{
	tree[o].L = L , tree[o].R = R,tree[o].sum = make_pair(0,0);
	if (R > L)
	{
		int mid = (L+R) >> 1;
		build_tree(L,mid,o*2);
		build_tree(mid+1,R,o*2+1);
	}
}
inline void update(int QL,int QR,int v,int o)
{
	int L = tree[o].L , R = tree[o].R;
	if (QL <= L && R <= QR) tree[o].update(v);
	else
	{
		push_down(o);
		int mid = (L+R)>>1;
		if (QL <= mid) update(QL,QR,v,o*2);
		if (QR >  mid) update(QL,QR,v,o*2+1);
		push_up(o);
	}
}
inline pair<int,int> query(int QL,int QR,int o)
{
	int L = tree[o].L , R = tree[o].R;
	if (QL <= L && R <= QR) return tree[o].sum;
	else
	{
		push_down(o);
		int mid = (L+R)>>1;
		SgTreeDataType res = make_pair(-1,0);
		if (QL <= mid)
        {
            pair<int,int> tmp = query(QL,QR,2*o);
            if(res.first<=tmp.first)
                res=tmp;
        }
		if (QR > mid)
        {
            pair<int,int> tmp = query(QL,QR,2*o+1);
            if(res.first<=tmp.first)
                res=tmp;
        }
		push_up(o);
		return res;
	}
}
long long dp[maxn];
int a[maxn];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n-1;i++)scanf("%d",&a[i]);
    a[n]=n;
    build_tree(1,n,1);
    for(int i=1;i<=n;i++)update(i,i,a[i],1);
    long long ans = 0;
    for(int i=n-1;i>=1;i--)
    {
        pair<int,int> tmp = query(i+1,a[i],1);
        int m=tmp.second;
        dp[i]=dp[m]-(a[i]-m)+n-i;
        ans+=dp[i];
    }
    cout<<ans<<endl;
}Codeforces Round #353 (Div. 2) E. Trains and Statistic dp 贪心的更多相关文章
- 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的最短距离之 ... 
- Codeforces Round #288 (Div. 2)  E. Arthur and Brackets [dp 贪心]
		E. Arthur and Brackets time limit per test 2 seconds memory limit per test 128 megabytes input stand ... 
- Codeforces Round #367 (Div. 2) C. Hard problem(DP)
		Hard problem 题目链接: http://codeforces.com/contest/706/problem/C Description Vasiliy is fond of solvin ... 
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
		Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ... 
- Codeforces Round #353 (Div. 2)
		数学 A - Infinite Sequence 等差数列,公差是0的时候特判 #include <bits/stdc++.h> typedef long long ll; const i ... 
- Codeforces Round #353 (Div. 2)  C	 Money Transfers
		题目链接: http://www.codeforces.com/contest/675/problem/C 题意: 给一个数组,每个数与他相邻的数相连,第一个与最后一个相连,每个数的数值可以左右移动, ... 
- Codeforces Round #353 (Div. 2) D. Tree Construction 二叉搜索树
		题目链接: http://codeforces.com/contest/675/problem/D 题意: 给你一系列点,叫你构造二叉搜索树,并且按输入顺序输出除根节点以外的所有节点的父亲. 题解: ... 
- Codeforces Round #353 (Div. 2) C. Money Transfers (思维题)
		题目链接:http://codeforces.com/contest/675/problem/C 给你n个bank,1~n形成一个环,每个bank有一个值,但是保证所有值的和为0.有一个操作是每个相邻 ... 
- Codeforces Round #353 (Div. 2) D. Tree Construction (二分,stl_set)
		题目链接:http://codeforces.com/problemset/problem/675/D 给你一个如题的二叉树,让你求出每个节点的父节点是多少. 用set来存储每个数,遍历到a[i]的时 ... 
随机推荐
- aarch64_fc26_url
			http://linux.yz.yamagata-u.ac.jp/pub/linux/fedora-projects/fedora-secondary/releases/26/Everything/a ... 
- ModelState验证部分属性
			ModelState.Remove("Name") 去掉不需要验证的属性. 
- 03 Editor plugins and IDEs 编辑器插件和 ide
			Editor plugins and IDEs 编辑器插件和 ide Introduction 介绍 Options 选项 Introduction 介绍 This document list ... 
- SQL Server 2000中查询表名,列名及字段类型
			经常碰到一些忘记表名称的情况,此时只记得个大概,此时可通过查询系统表Sysobjects找到所要的表名,如要查找包含用户的表名,可通过以下SQL语句实现, Select * From sysobjec ... 
- InterSystems Ensemble学习笔记(一) Ensemble介绍及安装
			系列目录 InterSystems Ensemble学习笔记(一) Ensemble介绍及安装InterSystems Ensemble学习笔记(二) Ensemble创建镜像, 实现自动故障转移 一 ... 
- 【LOJ】#2127. 「HAOI2015」按位或
			题解 听说这是一道论文题orz \(\sum_{k = 1}^{\infty} k(p^{k} - p^{k - 1})\) 答案是这个多项式的第\(2^N - 1\)项的系数 我们反演一下,卷积变点 ... 
- C#实例  Unity依赖注入使用
			Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入.Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问 题.构建一个成功应用程序的关键是实现非常松散的耦合设计 ... 
- Gitlab管理用户、组、权限(二)
			一. 保护主要分支 保护某个分支,不让项目中其它的成员进行改变里面的内容,和不允许他们进行和保护的分支进行合并.当某个分支设置为保护的时候,那么拥有开者者权限或以下的权限都会受到影响. 执行步骤: 1 ... 
- PHP isset和empty 详细比较
			找了几篇博文,这应该是说的最清楚的.链接如下:http://blog.chinaunix.net/uid-25311424-id-3966622.html 
- QString::arg()//用字符串变量参数依次替代字符串中最小数值
			QString i = "iTest"; // current file's number QString total = "totalTest&qu ... 
