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

浙公网安备 33010602011771号