题意:有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 ",res/2); return 0; }