3 条题解

  • 8
    @ 2026-7-11 11:41:26
    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=1e5+5;
    int a[N],b[N],d[N];//B铁路经过次数,D是B的差分数组,A是路线数组
    int main(){
    	int n,m;
    	cin>>n>>m;
    	for(int i=1;i<=m;i++) cin>>a[i];//输入路线数组
    	for(int i=1;i<m;i++){//遍历路线,m个城市,走m-1段铁路
    		int l=a[i],r=a[i+1];//l为当前城市,r为要去的城市
    		if(l>r) swap(l,r);//如果当前城市大于要去的城市,交换编号,方便差分操作
    		d[l]++;//差分基操
    		d[r-1+1]--;//l城市r城市,需要经过l到r-1段铁路,差分基操
    	}
    	ll ans=0;//统计总钱数
    	for(int i=1;i<n;i++){//n个城市,一共有n-1段铁路
    		b[i]=b[i-1]+d[i];//还原每条铁路经过的次数
    		ll x,y,z;
    		cin>>x>>y>>z;//输入每条铁路需要的,单程票,充值金额,卡费
    		ans+=min(b[i]*x,z+b[i]*y);//总金额+=最小值(单程票*次数,卡费+充值金额*次数)
    	}
    	cout<<ans;
    	return 0;
    }
    
    • 1
      @ 2026-7-11 11:44:04
      #include<bits/stdc++.h>
      #define ll long long
      using namespace std;
      const int N=1e5+5;
      int a[N],b[N],d[N];//B铁路经过次数,D是B的差分数组,A是路线数组
      int main(){
      	int n,m;
      	cin>>n>>m;
      	for(int i=1;i<=m;i++) cin>>a[i];//输入路线数组
      	for(int i=1;i<m;i++){//遍历路线,m个城市,走m-1段铁路
      		int l=a[i],r=a[i+1];//l为当前城市,r为要去的城市
      		if(l>r) swap(l,r);//如果当前城市大于要去的城市,交换编号,方便差分操作
      		d[l]++;//差分基操
      		d[r-1+1]--;//l城市r城市,需要经过l到r-1段铁路,差分基操
      	}
      	ll ans=0;//统计总钱数
      	for(int i=1;i<n;i++){//n个城市,一共有n-1段铁路
      		b[i]=b[i-1]+d[i];//还原每条铁路经过的次数
      		ll x,y,z;
      		cin>>x>>y>>z;//输入每条铁路需要的,单程票,充值金额,卡费
      		ans+=min(b[i]*x,z+b[i]*y);//总金额+=最小值(单程票*次数,卡费+充值金额*次数)
      	}
      	cout<<ans;
      	return 0;
      }
      • -1
        @ 2026-7-11 11:54:05
        #include<bits/stdc++.h>
        #define ll long long
        using namespace std;
        const int N=1e5+5;
        int a[N],b[N],d[N];//B铁路经过次数,D是B的差分数组,A是路线数组
        int main(){
        	int n,m;
        	cin>>n>>m;
        	for(int i=1;i<=m;i++) cin>>a[i];//输入路线数组
        	for(int i=1;i<m;i++){//遍历路线,m个城市,走m-1段铁路
        		int l=a[i],r=a[i+1];//l为当前城市,r为要去的城市
        		if(l>r) swap(l,r);//如果当前城市大于要去的城市,交换编号,方便差分操作
        		d[l]++;//差分基操
        		d[r-1+1]--;//l城市r城市,需要经过l到r-1段铁路,差分基操
        	}
        	ll ans=0;//统计总钱数
        	for(int i=1;i<n;i++){//n个城市,一共有n-1段铁路
        		b[i]=b[i-1]+d[i];//还原每条铁路经过的次数
        		ll x,y,z;
        		cin>>x>>y>>z;//输入每条铁路需要的,单程票,充值金额,卡费
        		ans+=min(b[i]*x,z+b[i]*y);//总金额+=最小值(单程票*次数,卡费+充值金额*次数)
        	}
        	cout<<ans;
        	return 0;
        }
        
        • 1

        信息

        ID
        691
        时间
        1000ms
        内存
        125MiB
        难度
        5
        标签
        递交数
        18
        已通过
        8
        上传者