题目:https://vijos.org/p/1901

题解:这题比较有意思。

经过一番思考之后我想出了下面的算法:

我们反着来推,按i从大到小

f[i]表示从>=m到 i 需要多长时间,则如果v[j]=i,则我们可以用f[i]+t[j] 去更新 r[j]-inf 的所有f值

由于f[i]是一个单调递减的函数,则我们只需要用它去更新r[j]-i-1即可

然后问题就变成了区间修改,单点查询,线段树即可

代码:

 #include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<string>
#define inf 100000000000000ll
#define maxn 250000
#define maxm 500+100
#define eps 1e-10
#define ll long long
#define pa pair<int,int>
#define for0(i,n) for(int i=0;i<=(n);i++)
#define for1(i,n) for(int i=1;i<=(n);i++)
#define for2(i,x,y) for(int i=(x);i<=(y);i++)
#define for3(i,x,y) for(int i=(x);i>=(y);i--)
#define mod 1000000007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=*x+ch-'';ch=getchar();}
return x*f;
}
int n,m,a[*maxn],b[*maxn],c[*maxn];
ll ti[maxn];
struct seg{int k,l,r;ll mi,tag;}t[*maxn];
inline void build(int k,int l,int r)
{
t[k].l=l;t[k].r=r;int mid=(l+r)>>;
t[k].mi=inf;t[k].tag=inf;
if(l==r)return;
build(k<<,l,mid);build(k<<|,mid+,r);
}
inline void update(int k,ll z)
{
t[k].tag=min(t[k].tag,z);
t[k].mi=min(t[k].mi,z);
}
inline void pushdown(int k)
{
if(t[k].tag==inf)return;
update(k<<,t[k].tag);
update(k<<|,t[k].tag);
t[k].tag=inf;
}
inline void pushup(int k)
{
t[k].mi=min(t[k<<].mi,t[k<<|].mi);
}
inline void change(int k,int x,int y,ll z)
{
int l=t[k].l,r=t[k].r,mid=(l+r)>>;
if(l==x&&r==y){update(k,z);return;}
pushdown(k);
if(y<=mid)change(k<<,x,y,z);
else if(x>mid)change(k<<|,x,y,z);
else change(k<<,x,mid,z),change(k<<|,mid+,y,z);
pushup(k);
}
inline ll query(int k,int x)
{
int l=t[k].l,r=t[k].r,mid=(l+r)>>;
if(l==r)return t[k].mi;
pushdown(k);
if(x<=mid)return query(k<<,x);else return query(k<<|,x);
}
inline bool cmp1(int x,int y){return a[x]<a[y];}
inline bool cmp2(int x,int y){return b[x]>b[y];}
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int cs=read(),mm=;
while(cs--)
{
n=read();m=read();
for1(i,n)a[i]=read(),a[n+i]=read(),ti[i]=read();a[*n+]=m;a[*n+]=;
for1(i,*n+)c[i]=i;
sort(c+,c+*n+,cmp1);
int tot=;
for1(i,*n+)
{
if(i==||a[c[i]]!=a[c[i-]])tot++;
b[c[i]]=tot;
}
for1(i,n)c[i]=i;
sort(c+,c+n+,cmp2);
build(,,tot);
change(,b[*n+],tot,);
for1(i,n)
{
ll x=query(,b[c[i]]);if(x==inf)continue;
if(b[c[i]]>b[n+c[i]])change(,b[n+c[i]],b[c[i]]-,x+ti[c[i]]);
}
ll ans=query(,b[*n+]);
printf("Case #%d: ",++mm);
if(ans==inf)printf("-1\n");else printf("%lld\n",ans);
}
return ;
}

vijosP1901学姐的钱包的更多相关文章

  1. Vijos1901 学姐的钱包

    描述 学姐每次出门逛街都要带恰好M元钱, 不过她今天却忘记带钱包了.可怜的doc只好自己凑钱给学姐, 但是他口袋里只有一元钱.好在doc的N位朋友们都特别有钱, 他们答应与doc作一些交换.其中第i位 ...

  2. cdoj 1328 卿学姐与诡异村庄 Label:并查集 || 二分图染色

    卿学姐与诡异村庄 Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  3. cdoj 1329 卿学姐与魔法 优先队列

    卿学姐与魔法 Time Limit: 1200/800MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  4. cdoj 1324 卿学姐与公主 线段树裸题

    卿学姐与公主 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit St ...

  5. vijosP1903学姐的实习工资

    描述 学姐去实习了, 一共实习了N天, 每一天都可以得到实习工资V[i], 这里V[1..N]被看作是整数序列.因为学姐很厉害, 所以V[1..N]是不下降的.也就是说学姐每天的工资只会越来越多, 不 ...

  6. vijos1891 学姐的逛街计划(线性规划)

    P1891学姐的逛街计划 描述 doc 最近太忙了, 每天都有课. 这不怕, doc 可以请假不去上课.偏偏学校又有规定, 任意连续 n 天中, 不得请假超过 k 天. doc 很忧伤, 因为他还要陪 ...

  7. 2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字

    美妙的数字(number.c/.cpp/.pas) 题目描述 黄巨大认为非负整数是美妙的,并且它的数值越小就越美妙.当然0是最美妙的啦. 现在他得到一串非负整数,对于每个数都可以选择先对它做二进制非运 ...

  8. UESTC - 1324 卿学姐与公主

    题目链接 某日,百无聊赖的卿学姐打开了某11区的某魔幻游戏 在这个魔幻的游戏里,生活着一个美丽的公主,但现在公主被关押在了魔王的城堡中. 英勇的卿学姐拔出利刃冲向了拯救公主的道路. 走过了荒野,翻越了 ...

  9. ATP学姐的模拟赛

    ATPの水题大赛 声明:不是我觉得这题水,这就是本场模拟赛的名称. T1:求所有的$n$位数中有几个数满足:每一位要么是$A$要么是$B$,并且这个$n$位数的每一位加起来是$A$或$B$的倍数. $ ...

随机推荐

  1. Mysql解压版的安装

    Mysql解压版的安装 ——@梁WP 1.解压mysql到合适的地方 2.右击计算机-属性-高级系统设置-高级-环境变量,弹出“环境变量”对话框,修改下面的系统变量 3.新建MYSQL_HOME变量, ...

  2. node安装 教程 + git初步

    我的系统是win8.1   64位 这个是对应的安装包:http://files.cnblogs.com/files/zxyun/node-v0.12.5-x64.zip 安装中有不懂可以参考下面的两 ...

  3. DBNull与Null

    DBNull与Null的区别在于,DBNull代表该字段在数据库中根本不存在,Null代表该字段在数据库中没有值.

  4. MyXLS案例

    using System; using System.Data; using org.in2bits.MyXls; namespace Maticsoft.Common { /// <summa ...

  5. AndroidStudio中 R文件缺失的办法

    AndroidStudio中 R文件缺失 找不到R文件的原因有如下两类: 1:IDE或代码问题,非个人原因: 2:个人误操作导致IDE不予提示R文件: 下面是解决办法: 第一种 ①首先确保资源文件是否 ...

  6. Javascript基础学习(2)_表达式和运算符

    1.==和===的区别(!=和!==是相反的比较) 它们采用了同一性的两个不同定义.==是相等性,===是等同性. ①“===”进行两个值的比较 两个值的类型不同,就不相等 两个值是数字,并且值相同, ...

  7. HTML基础(1) 全局架构标签,特殊字符

    最基本的网页文件组成部分 其中 <head></head> 这个标签对中内容不会显示在网页中 <body></body> 中的内容可以显示在网页中. b ...

  8. jQuery easyUI框架中经常出现的问题

    相信开发者对于我们jquery来说都不会陌生吧,jquery为我们的开发提供了很多各式各样的库,满足各种开发的需求,其中我们知道的有轻量级的,但是也有一些基于富客服端的一些重量级库,顾名思义,当我们在 ...

  9. tomcat gc问题总结

    Java内存泄露监控工具:JVM监控工具介绍  http://developer.51cto.com/art/201203/321431.htm 关于施用full gc频繁的分析及解决  http:/ ...

  10. php中的NOTICE 的错误解决方法

    PHP新手NOTICE错误,特此写给那些遇到和我一样错误的朋友.   刚学习PHP,不久 最近在整留言板,刚才遇到个问题. 页面中,好多类似 Notice: in D:\wamp\www\study\ ...