一道差分的题
Posted 他不是混子QAQ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一道差分的题相关的知识,希望对你有一定的参考价值。
某一天,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;
一道很搞的题
https://c.runoob.com/compile/14 在线输入代码验证
using System;
namespace HelloWorldApplication
{
class HelloWorld
{
static void Main(string[] args)
{
Model m=new Model();
m.Name="aa";
Console.WriteLine("aa:"+m.GetHashCode());
change(ref m);
Console.WriteLine(m.Name); //输出?
Console.ReadKey();
}
static void change(ref Model m){
//m=new Model(); //1
m.Name="bb";
m=new Model(); //2
//m=null; //3
////Console.WriteLine("bb:"+m.GetHashCode());
}
}
public class Model
{
public string Name{get;set;}
}
}
1,2处位置互换
3处注释放开
ref去掉
结果分别是什么
以上是关于一道差分的题的主要内容,如果未能解决你的问题,请参考以下文章