P3406 海底高铁

https://www.luogu.com.cn/problem/P3406
涉及知识点:差分,前缀和
黄色题
 
思路:
对于每一个区间,我们可以在其左端点加上区间增的权值,再在右端点+1的位置减去区间增的权值,最后对该区间进行求前缀和操作。这样,我们可以得到一样的结果。

#include<cstdio>
#include<iostream>
#include<algorithm>
typedef long long L;//给long long取一个别名
using namespace std;
L n,m;//long long n,m
L p[100005];
L a[100005],b[100005],c[100005];
L money;//最终的钱
L each[100005];//每段铁路经过的次数
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>p[i];
        if(i==1){
            continue;
        }
        each[min(p[i-1],p[i])]++;//差分
        each[max(p[i-1],p[i])]--;
    }
    for(int i=1;i<=n;i++){
        each[i]+=each[i-1];
    }
    for(int i=1;i<n;i++){
        cin>>a[i]>>b[i]>>c[i];
        money+=min((a[i]*each[i]),(b[i]*each[i]+c[i]));
    }
    cout<<money;//完美结束
    return 0;
}

注意:
1.由于给定的信息是端点(城市),但是要求的是区间(路段),所以循环次数应为城市数-1

2.对于端点的处理,要严格满足数学上的定义,小的在左端点,大的在右端点否则对于逆序信息,就相当于进行了区间减操作

posted @ 2022-07-19 17:17  -イレイナ  阅读(50)  评论(0)    收藏  举报