shu_1078 vijos_1091(环城旅行)_单调队列

http://202.121.199.212/JudgeOnline/problem.php?cid=1078&pid=9

分析:

a[ i ] :  第i个城市的汽油与到下一个城市距离的差;

dis[ i ] : 第i个城市到下一个城市的距离;

s[ i ] : 前i个 a[ i ] 的和;

路径 i——》i+n 中间不断油,那么 T= ai + (ai+1)+ ...( ak)  对于任意的 i < k <=i+n, T都要大于0,

即, T= s[ k ]- s[ i-1 ] >0 ;

而只要所有的k中  min( s[ k ] ) > s[ i-1 ] 成立则满足条件,对于求区间的最值则利用单调队列。

代码:

#include <stdio.h>
#include <string.h>
#define MAXN 1000004

int n,l;
int dis[MAXN],gas[MAXN];
int a[MAXN],s[MAXN];
int cnt,ans[MAXN/2];

struct node
{
    int s,no;
}q[MAXN];

void init()
{
    int sum=0;
    scanf("%d%d",&n,&l);
    scanf("%d%d",&dis[n],&gas[1]);
    for(int i=2;i<=n;i++){
        scanf("%d%d",&dis[i-1],&gas[i]);
        sum+=dis[i-1];
    }
    dis[n]=l-sum;
    for(int i=1;i<=n;i++)       a[i]=gas[i]-dis[i];
    for(int i=n+1;i<=2*n-1;i++) a[i]=a[i-n];
    s[0]=0;
    for(int i=1;i<=2*n-1;i++)   s[i]=s[i-1]+a[i];
}

void single_queue()
{
    int top=0,tail=0;
    for(int i=1;i<=n-1;i++){
        while(tail>top && q[tail].s>s[i]) tail--;
        q[++tail].s=s[i];
        q[tail].no=i;
    }
    for(int i=n;i<=2*n-1;i++){
        while(q[top].no<=i-n && top<tail) top++;
        while(tail>top && q[tail].s>s[i]) tail--;
        q[++tail].s=s[i];
        q[tail].no=i;
        if(s[i-n]<=q[top].s)  {ans[cnt++]=i-n+1;}
    }
}

int main()
{
    //freopen("in.txt","r",stdin);

    init();
    cnt=0;
    single_queue();
    if(cnt==0) printf("-1\n");
    else{
        for(int i=0;i<cnt-1;i++)
            printf("%d ",ans[i]);
        printf("%d\n",ans[cnt-1]);
    }
    return 0;
}

shu_1078 vijos_1091(环城旅行)_单调队列,布布扣,bubuko.com

时间: 2024-10-08 06:27:18

shu_1078 vijos_1091(环城旅行)_单调队列的相关文章

BZOJ_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP

题意: N头牛,每头牛有一个权值,选择一些牛,要求连续的不能超过k个,求选择牛的权值和最大值 分析: 先考虑暴力DP,f[i] = f[j] + s[i]-s[j+1] (i-j-1<=k 1<=j<i) 意思是我们j+1不要,要j+2到i这部分 发现可以用单调队列优化一下 维护一个单调递减的单调队列,比较时用f[i]-s[i-1]比较 代码: #include <stdio.h> #include <string.h> #include <algorith

BZOJ_1342_[Baltic2007]Sound静音问题_单调队列

题意: 给出n个数,求∑[ max{a[i]~a[i+m-1]} - min{a[i]~a[i+m-1]} <= c ] 分析: 滑动窗口 我们维护两个单调队列,分别存最大,最小值 代码: #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define N

[bzoj1342][Baltic2007]Sound静音问题_单调队列

Sound静音问题 bzoj-1342 Baltic-2007 题目大意:给定一个n个数的序列,求所有的长度为m的区间,使得区间内最大值减去最小值不超过阈值c. 注释:$1\le n \le 10^6$,$1\le m\le 10^4$. 想法:单调队列裸题. 定长区间最值问题显然可以用单调队列维护. 最后,附上丑陋的代码... ... #include <iostream> #include <cstdio> #include <cstring> #include &

hdu 3401(单调队列优化dp)

注意:这题题意是有操作的天数相隔要大于w 然后列出状态转移方程就可以发现,可以用优点队列优化啦. 构造状态dp[i][j]表示第i 天拥有 j只股票的时候,赚了多少钱 状态转移有: 1.从前一天不买不卖: dp[i][j]=max(dp[i-1][j],dp[i][j]) 2.从前i-W-1天买进一些股: dp[i][j]=max(dp[i-W-1][k]-(j-k)*AP[i],dp[i][j]) 3.从i-W-1天卖掉一些股: dp[i][j]=max(dp[i-W-1][k]+(k-j)*

BZOJ_1096_[ZJOI2007]_仓库建设_(斜率优化动态规划+单调队列+特殊的前缀和技巧)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1096 有\(n\)个工厂,给出第\(i\)个工厂的到1号工厂的距离\(x[i]\),货物数量\(p[i]\),建设仓库所需花费\(c[i]\). 现在要把所有货物都装入仓库,第\(i\)号工厂的货物可以选择在\(i\)建仓库并存入,或者移动到\(k\)号仓库\((i<k<=n)\).移动的花费为数量与距离的乘积. 分析 我们来想一想dp方程. 用\(dp[i]\)表示前\(i\)个工厂,且

BZOJ_1010_[HNOI2008]_玩具装箱toy_(斜率优化动态规划+单调队列)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1010 给出\(n\)和\(l\).有\(n\)个玩具,第\(i\)个玩具的长度是\(c[i]\),要求将玩具分成若干段,从\(i\)到\(j\)分为一段的长度为\(x=j-i+\sum_(k=i)^jc[k]\),费用为\((x-l)^2\).求最小费用. 分析 用\(dp[i]\)表示前\(i\)个玩具所需的最小费用,则有$$dp[i]=min\{dp[j]+(sum[i]-sum[j]+

[ACM] poj 2823 Sliding Window (单调队列)

高一时,学校组织去韶山游玩,我没去,这次趁着五一,总算去了我心心念念的韶山.其实我知道所有的景点都是差不多的,可是因为电视剧<恰同学少年>,让我对毛泽东有了进一层的了解,所以,我一直都想去看看. 有两个同学一男一女是我理想的旅友,可是女生不想去,而男士回家了.所以,我独自一人去了. 准备工作:一小包饼干,一小包山楂片,两个苹果,一瓶水,帽子(防晒),墨镜(装酷) 早晨5:30起床了,洗漱完毕,吃完早餐,赶到公交车站牌那里,才6点过几分.公交车6:31才到,等了近半个小时(公交车上明明说是6:0

[ACM] hdu 3415 Max Sum of Max-K-sub-sequence (单调队列)

高一时,学校组织去韶山游玩,我没去,这次趁着五一,总算去了我心心念念的韶山.其实我知道所有的景点都是差不多的,可是因为电视剧<恰同学少年>,让我对毛泽东有了进一层的了解,所以,我一直都想去看看. 有两个同学一男一女是我理想的旅友,可是女生不想去,而男士回家了.所以,我独自一人去了. 准备工作:一小包饼干,一小包山楂片,两个苹果,一瓶水,帽子(防晒),墨镜(装酷) 早晨5:30起床了,洗漱完毕,吃完早餐,赶到公交车站牌那里,才6点过几分.公交车6:31才到,等了近半个小时(公交车上明明说是6:0

【BZOJ】1047: [HAOI2007]理想的正方形(单调队列/~二维rmq+树状数组套树状数组)

http://www.lydsy.com/JudgeOnline/problem.php?id=1047 树状数组套树状数组真心没用QAQ....首先它不能修改..而不修改的可以用单调队列做掉,而且更快,只有O(n^2).而这货是n^2log^2n的建树...虽然查询是log^2n...但是建树那里就tle了.. 那么说题解... 先orz下,好神.. 我怎么没想到单调队列orz 首先我们维护 行 的单调队列,更新每个点在 列 距离内的最小and最大的值 然后我们维护 列 的单调队列,更新每个点