Mishka and trip CodeForces - 703B

Mishka and trip

Little Mishka is a great traveller and she visited many countries. After thinking about where to travel this time, she chose XXX — beautiful, but little-known northern country.

Here are some interesting facts about XXX:

XXX consists of n cities, k of whose (just imagine!) are capital cities.
All of cities in the country are beautiful, but each is beautiful in its own way. Beauty value of i-th city equals to ci.
All the cities are consecutively connected by the roads, including 1-st and n-th city, forming a cyclic route 1 — 2 — … — n — 1. Formally, for every 1 ≤ i < n there is a road between i-th and i + 1-th city, and another one between 1-st and n-th city.
Each capital city is connected with each other city directly by the roads. Formally, if city x is a capital city, then for every 1 ≤ i ≤ n,  i ≠ x, there is a road between cities x and i.
There is at most one road between any two cities.
Price of passing a road directly depends on beauty values of cities it connects. Thus if there is a road between cities i and j, price of passing it equals ci·cj.
Mishka started to gather her things for a trip, but didn’t still decide which route to follow and thus she asked you to help her determine summary price of passing each of the roads in XXX. Formally, for every pair of cities a and b (a < b), such that there is a road between a and b you are to find sum of products ca·cb. Will you help her?

Input
The first line of the input contains two integers n and k (3 ≤ n ≤ 100 000, 1 ≤ k ≤ n) — the number of cities in XXX and the number of capital cities among them.

The second line of the input contains n integers c1, c2, …, cn (1 ≤ ci ≤ 10 000) — beauty values of the cities.

The third line of the input contains k distinct integers id1, id2, …, idk (1 ≤ idi ≤ n) — indices of capital cities. Indices are given in ascending order.

Output
Print the only integer — summary price of passing each of the roads in XXX.

Examples
Input
4 1
2 3 1 2
3
Output
17
Input
5 2
3 5 2 2 4
1 4
Output
71
Note
This image describes first sample case:
在这里插入图片描述
It is easy to see that summary price is equal to 17.

This image describes second sample case:
在这里插入图片描述
It is easy to see that summary price is equal to 71.

题意:
有n个城市和k个省会,城市有权重,每个城市和相邻的城市有路,路的权重是两个城市的权重相乘,省会城市和每一个城市都有路,计算所有路的权重和
题解:
遍历城市,不是省会就连接它和下一个城市,如果是省会的话就连接除上一个城市和本身外的每个城市, 1 和 n要特判,详细见代码
代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;

int main(){
	int n, k;
	while(cin >> n >> k){
		int a[100010], v[100010]; //a记录城市权重, v标记城市是否为省会 
		long long sum1 = 0, sum2 = 0; // sum1 每个城市的权重和, sum2路的权重和 
		memset(a, 0, sizeof(a));
		memset(v, 0, sizeof(v));
		for(int i = 1; i <= n; i++){
			cin >> a[i];
			sum1 += a[i];
		}
		int t;
		for(int i = 1; i <= k; i++){
			cin >> t;
			v[t] = 1;
		}
		for(int i = 1; i <= n; i++){
			if(v[i]){	//如果是省会 
				if(i == 1){	//对1进行特判 
					sum2 += a[i] * (sum1 - a[i] - a[n]);
					if(v[n]){
						sum2 += a[i] * a[n];
					}
				}
				else{
					sum2 += a[i] * (sum1 - a[i] - a[i - 1]); //连接除本身和上一个城市的每个城市 
					if(v[i - 1]){//如果上一个城市是省会的话要重新连上,因为上一个城市已经在sum1中删除了,所以上面删除上一个城市删多了 
						sum2 += a[i] * a[i - 1];
					}
				}
				sum1 -= a[i]; //删除省会城市, 避免重复 
			}
			else{//不是省会 
				if(i == n)//对n特判 
					sum2 += a[i] * a[1];
				else
					sum2 += a[i] * a[i + 1];//连接i城市和下一个城市 
			}
		}
		cout << sum2 << endl;
	}
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值