题意:一条路,
一道贪心题。很明显在低价充电站多充电比高价充电站更优。对于每一个充电站
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<ctime>
#define INF 1e9
using namespace std;
const int maxn=500010;
const double Pi=acos(-1.0);
template<class T>void read(T &x)
{
x=0;int f=0;char ch=getchar();
while(ch<'0'||ch>'9') {f|=(ch=='-');ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
x=f?-x:x;
return;
}
int n,t,d[maxn],p[maxn],nxt[maxn];
long long dis[maxn],now,ans,stack[maxn],top;
int main()
{
scanf("%d%d",&n,&t);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&d[i],&p[i]);
dis[i+1]=dis[i]+d[i];
}
for(int i=n;i>=1;i--)
{
while(top>0&&p[stack[top]]>=p[i])
top--;
nxt[i]=stack[top];
stack[++top]=i;
if(!nxt[i])
nxt[i]=n+1;
}
for(int i=1;i<=n;i++)
{
now-=d[i-1];
if(now<0)
{
printf("-1");
return 0;
}
long long q=min(dis[nxt[i]]-dis[i],(long long)t);
if(now<q)
{
ans+=p[i]*(q-now);
now=q;
}
}
printf("%lld",ans);
return 0;
}