您的位置:首页 > 其它

CodeForces 703B Mishka and trip(图论)

2016-08-06 19:36 537 查看
给定一个图,每个顶点有权值,顶点之间的边的权重为顶点的乘积

图为一个环 v1 v2 v3 。。。vn v0 首尾相连

同时给定n个顶点,这n个顶点与其他所有顶点都有一条边

直接扫描 记录之前的首都的权重之和以及所有的点的权重之和,对于每个顶点要连的边为上一个顶点以及和首都的边

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <stack>
#include <queue>
#include <string.h>
#include <string>
#include <iomanip>
#include <cstring>
#include <vector>
#include <functional>
#include <cmath>
#include <sstream>
#include<complex>
#include <set>
//#include<bits/stdc++.h>

using namespace std;
#define sp system("pause")
typedef long long ll;
typedef unsigned long long ull;
const ll mod = 1000000007;
#define PI acos(-1.0)
#define eps 1e-6
ll a[100000 + 100];
bool vis[100000 + 100];

int main()
{
int n, k;
cin >> n >> k;
for (int i = 0; i < n; i++)
{
scanf("%I63d", &a[i]);
}
memset(vis, false, sizeof vis);
for (int i = 1; i <= k; i++)
{
int x;
scanf("%d", &x);
vis[x-1] = true;
}
ll ans = 0; ll all = a[0];
ll cot = 0;
if (vis[0])cot = a[0];
for (int i = 1; i < n ; i++)
{
//cout << ans << cot<<all<<endl;
if (vis[i])
{
ans += all*a[i]; all += a[i];
cot += a[i]; continue;
}
ans += (cot*a[i]);
if (!vis[i - 1])ans += a[i - 1] * a[i];
if (vis[i])cot += a[i];
all += a[i];
}
if (!vis[0] && !vis[n - 1])ans += a[0] * a[n - 1];
cout << ans << endl;
//sp;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  CF