ZOJ 3632 Watermelon Full of Water(dp+线段树 单点修改)

题意:

一共有n天

每天西瓜售价为dp[i]元

该天的西瓜能吃v[i]天 而且这天如果买了西瓜之前的西瓜就要扔掉

问每天都吃到西瓜的最小花费是多少

思路:

从最后一天开始dp最小花费

并用线段树单点更新来维护

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define ll long long
#define INF 1e10
ll dp[50000+100];//从后往前 dp[i]必买西瓜的最小花费
int v[50000+100];
ll sum[200000+100];
int n;
void push(int rt)
{
    sum[rt]=min(sum[rt<<1],sum[rt<<1|1]);
}
void build(int l,int r,int rt)
{
    sum[rt]=INF;
    if(l==r)
    {
       return ;
    }
    int m=(l+r)>>1;
    build(l,m,rt<<1);
    build(m+1,r,rt<<1|1);
    push(rt);
}
void update(int key,ll add,int l,int r,int rt)
{
    if(l==r)
    {
        sum[rt]=min(sum[rt],add);
        return ;
    }
    int m=(l+r)>>1;
    if(key<=m) update(key,add,l,m,rt<<1);
    else update(key,add,m+1,r,rt<<1|1);
    push(rt);
}
ll query(int L,int R,int l,int r,int rt)
{
    if(L<=l&&r<=R)
    {
        return sum[rt];
    }
    ll res1=INF,res2=INF;
    int m=(l+r)>>1;
    if(L<=m)
    {
        res1=query(L,R,l,m,rt<<1);
    }
    if(R>m)
    {
        res2=query(L,R,m+1,r,rt<<1|1);
    }
    return min(res1,res2);
}
int main()
{
    int i,j,k;
    while(scanf("%d",&n)!=EOF)
    {
        build(1,n+1,1);
        for(i=1;i<=n;i++)
        {
            scanf("%lld",&dp[i]);
        }
        for(i=1;i<=n;i++)
        {
            scanf("%d",&v[i]);
        }
        dp[n+1]=0;
        update(n+1,dp[n+1],1,n+1,1);
        for(i=n;i>=1;i--)
        {
            int r=i+v[i];
            if(r>n+1) r=n+1;
            ll next=query(i+1,r,1,n+1,1);
            dp[i]+=next;
            update(i,dp[i],1,n+1,1);
        }

        printf("%lld\n",dp[1]);
    }
    return 0;
}
时间: 2024-08-09 06:16:44

ZOJ 3632 Watermelon Full of Water(dp+线段树 单点修改)的相关文章

ZOJ 3632 Watermelon Full of Water (线段树 区间更新 + dp)

题目大意: 让每天都能吃到西瓜.最少需要花多少钱. 思路分析: dp[pos] 就表示  要让 前i天每天都有西瓜吃,最少需要花多少钱. 那么如果你买这个西瓜的话.那么这个西瓜能吃的持续时间都要更新一下. 然后再在每个西瓜的更新部分取最小的,就可以是这个点所能得到的最小值. 其实就是 dp[i] = min (dp[i] , dp[ j - k +1] + a[j]); 但是枚举前面的时候会超时,就用线段树维护. 5 1 2 3 4 5 1 2 2 2 2 给出这组数据是说,每次买西瓜的时候,都

【模板】线段树-单点修改,区间查询

容易理解但是难打(又长又难调)------仅代表个人观点 (能别打就别打) 线段树是什么? 大概长这样?(表示区间1到6) 线段树是一颗二叉树,是通过二分思想建立的一颗表示区间关系的树形结构.(总之记住它很好用就对了) 怎样建一颗线段树 大概思路: 二分+递归 没什么好讲的,具体看代码吧.. //建树 struct node { int a,b; }tree[100001]; void make_tree(int p,int x,int y)//p为当前节点编号,x,y为区间的左右端点 { tr

ZOJ 3632 Watermelon Full of Water(dp+线段树或单调队列优化)

Watermelon Full of Water Time Limit: 3 Seconds      Memory Limit: 65536 KB Watermelon is very popular in the hot summer. Students in ZJU-ICPC Team also love watermelon very much and they hope that they can have watermelon to eat every day during the

ZOJ 3650(多米诺骨牌 dp + 线段树优化)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3650 题意: 给你n个骨牌,每个骨牌有一个在x轴上的位置和高度,每个骨牌可以想左推也可以向右推,问最少多少步可以把骨牌全部推倒. 思路: 之前Goodbye 2014 上的E题就是一道多米诺骨牌的题目,虽然跟这道题目不太一样但是还是提供了一下思路, 附题解的链接: http://blog.csdn.net/u013649253/article/details/4

hdu1166 线段树单点修改与区间查询

基本上就是个简单的线段树的单点修改(update)与区间查询(query) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1166 连Lazy标记都不用 附上代码 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=50000+1

HDU 1754 I Hate It 【线段树单点修改 区间查询】

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 102825    Accepted Submission(s): 38669 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,

HDU - 1166 敌兵布阵 (线段树+单点修改,区间查询和)

C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视. 中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Derek问:“Tidy,马上汇

敌兵布阵 HDU - 1166 (线段树单点修改)

敌兵布阵 HDU - 1166 题目链接:https://vjudge.net/problem/HDU-1166 题目: C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视. 中央情报局要研究敌人

POJ 2763 Housewife Wind(树链剖分)(线段树单点修改)

Housewife Wind Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 10378   Accepted: 2886 Description After their royal wedding, Jiajia and Wind hid away in XX Village, to enjoy their ordinary happy life. People in XX Village lived in beauti