题意:有n座城市,其中k座是省会城市,每个城市有对应的点权,城市1-2-3-...-n-1有一条路相连,省会城市与其他所有的城市相连,且每两个城市间最多有一条路,每条路的边权为路连接的两座城市的点权乘积,问所有路的边权和。
思路:预处理出所有城市的点权和与所有省会城市的点权和,对于每座城市,如果它不是省会城市的话,它只与它的前一个城市与后一个城市以及所有的省会城市有连边,如果它是省会城市的话,它与除了自己的所有城市有连边。这样每条边在边的两个点处都考虑了一次,答案/2。
#include<cstdio> int val[100005]; int cab[100005]; typedef long long ll; int main() {int n,k,x;ll city_sum=0,cab_sum=0;scanf("%d%d",&n,&k);for(int i=1;i<=n;i++) {scanf("%d",&val[i]);city_sum+=val[i];}for(int i=1;i<=k;i++) {scanf("%d",&x);cab[x]=1;cab_sum+=val[x];}ll res=0;for(int i=1;i<=n;i++) {if(cab[i]) {res+=(city_sum-val[i])*val[i];}else {ll temp=cab_sum;if(i==1) {if(!cab[n]) temp+=val[n];if(!cab[2]) temp+=val[2];}else if(i==n) {if(!cab[n-1]) temp+=val[n-1];if(!cab[1]) temp+=val[1];}else {if(!cab[i-1]) temp+=val[i-1];if(!cab[i+1])temp+=val[i+1];}res+=temp*val[i];}}printf("%I64d\n",res/2);return 0; }