单点时限: 1.0 sec
内存限制: 256 MB
“叮------“平稳了没多久,安全带的指示灯又亮了。
“飞机遇到气流正在颠簸,请系好安全带” 不知道已经是第几次语音播报了,毫无意外,飞机再次开始失重下降。
Cuber QQ 的座位是在高贵的特等舱。飞机再次失重的时候,Cuber QQ 开始观察起了座位上的安全带。
特等舱的安全带自然是十分高级的。他由 n 个按钮构成,每个按钮之间均可以通过特质的材料绳连接。为了保证基本的安全,安全带初始的 n 个按钮顺次连接。具体来说,每个按钮都有一个编号,分别是 1 到 n ,初始的时候安全带包含了 n 条已经连接的特质的材料绳,他们分别连接按钮 1 和 按钮2 、 按钮 2 和 按钮3 、 ⋯ 、按钮 n−1 和 按钮n 、按钮 n 和 按钮1 。
为了满足不同旅客的不同需求,安全带还可以由旅客自己来调节松紧。具体来说,旅客可以选择按下某一些按钮,一旦这个按钮被按下,从这个按钮出发会通过特质的材料绳连接其他所有的按钮(如果这两个按钮之间已经有连接了,不会发生第二次连接)。
Cuber QQ 为了更加方便的定义安全带的松紧,他给每一个按钮定义了一个权值,而一条特质的材料绳的松紧程度定义为他所连接两个按钮权值的乘积。一个安全带的松紧程度,定义为所有连接的特质的材料绳的松紧程度之和。
现在 Cuber QQ 会告诉你他给安全带按钮定义的权值和按下的按钮,他想知道安全带现在的松紧程度。
简单来说:初始给出一个 n 个点顺次连接而成的环,点有点权,边权是两个端点的点权乘积。现在给出一些特殊点,这些特殊点是向其他所有点都有连边,如果连边时发现两点之间已经有边,不会再次连接(即图中不会有重边)。求图中边权和。
输入格式
输入第一行包含一个整数 n(3≤n≤105) ,表示按钮数量。
第二行包含 n 个用空格隔开的整数 a1,a2,⋯,an(1≤ai≤104) ,分别表示按钮的权值。
第三行包含 n 个用空格隔开的整数 b1,b2,⋯,bn(bi∈{0,1}) ,分别表示按钮的开关状态。其中 bi=1 表示第 i 个按钮按下了,bi=0 表示第 i 个按钮没有被按下。
输出格式
输出一个整数,表示安全带的松紧程度。
样例
input
3
2 3 3
1 0 1
output
21
input
3
2 3 3
0 0 0
output
21
提示
第一个样例解释:
初始的时候图中有三条边 (1,2),(2,3),(3,1) ,边权分别是 6,9,6 。
点 1 和点 3 向其他所有点有边,而这些边均已存在在图中,故不重复连接,所以边权和为 6+9+6=21 。
#include<iostream>
using namespace std;
struct g {
int w;
bool state;
};
int main() {
int n;
cin>>n;
g G[n];
long long sum=0;
for(int i = 0; i < n; i++) {
cin>>G[i].w;
sum+=G[i].w;
}
for(int i = 0; i < n; i++) {
cin>>G[i].state;
}
long long ans=0;
for(int i = 0; i < n; i++) {
if(G[i].state) {
ans+=G[i].w*(sum-G[i].w);
sum-=G[i].w;
}
else if(G[(i-1+n)%n].state==false) {
ans+=G[i].w*G[(i-1+n)%n].w;
}
}
cout<<ans;
return 0;
}