某一天,Rain Sure
同学来到一个豪华酒店,这个酒店可以提供各种正经服务。
这家酒店的计费方式如下:
你可以选择办理会员,会员每天需要交纳C元的会员费,成为会员后你可以随意享受各种服务。
并且,你可以任意选择在某天成为会员,或者在某天停止成为会员。Rain Sure
同学决定来体验n种服务,每种服务价钱如下所示:
对于第i项服务,Rain Sure
同学会在第ai天到第bi天进行享受,如果没有办理会员的话,那么每天需要支付ci元的费用。
请你帮助他计算一下,如果想要体验完这n项服务,最少需要花多少钱?
输入格式
第一行两个正整数,分别代表n和C。
后面n行,每行三个正整数,分别为ai,bi,ci
1≤n≤2×105
1≤C≤109
1≤ai≤bi≤109
1≤ci≤109
输出格式
输出一个整数,代表最少需要花费的钱。
测试样例一
2 6
1 2 4
2 2 4
10
说明:第一天花费4元体验服务1,第二天开会员花费6元体验服务1和服务2.
测试样例二
5 1000000000
583563238 820642330 44577
136809000 653199778 90962
54601291 785892285 50554
5797762 453599267 65697
468677897 916692569 87409
163089627821228
测试样例三
5 100000
583563238 820642330 44577
136809000 653199778 90962
54601291 785892285 50554
5797762 453599267 65697
468677897 916692569 87409
88206004785464
题目说的是在任意时候可以开启或取消会员,我一直认为只能开一次呢。。
这是请教了佬的AC代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
int n, C;cin >> n >> C;
map<int, int> mp;
while (n--)
{
int a, b, c;cin >> a >> b >> c;
mp[a] += c, mp[b + 1] -= c;
}
int sum = 0;
auto it = mp.begin();
while (it != mp.end())
{
sum += (next(it)->first - it->first) * min(C, it->second);
it++;
it->second += prev(it)->second;
}
cout << sum;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define int long long
const int N = 4e5+10;
int n,m;
int a,b,c;
struct node{
int x;
int money;
}s[N];
int cnt,sum,res,pre;
bool cmp(node n1,node n2)
{
return n1.x<n2.x;
}
signed main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
s[cnt].x=a,s[cnt++].money=c;
s[cnt].x=b+1,s[cnt++].money=-c;
}
sort(s,s+cnt,cmp);
pre = s[0].money;
res = min(pre,m);
for(int i=1;i<cnt;i++)
{
int d = s[i].x-s[i-1].x;
sum+=d*res;
pre += s[i].money;
res = min(pre,m);
}
cout<<sum;
return 0;
}