#include<bits/stdc++.h>
#define UP(i,x,y) for(int i=x; i<=y; i++)
#define LEN 100001
using namespace std;
struct node{
long long number;
long long color;
long long id; // 编号
};
vector<node> arr;
vector< vector<node> > arr2(LEN); // 二维向量
int n,m;
long long calScore(node a, node b)
{
return (a.id + b.id) * (a.number + b.number);
}
int main()
{
long long ans = 0;
// cin>>n>>m;
scanf("%d %d", &n, &m);
UP(i, 1, n)
{
node temp;
// cin>>temp.number;
scanf("%lld", &temp.number);
temp.id = i;
temp.color = 0;
arr.push_back(temp);
}
UP(i, 1, n)
{
long long color;
// cin>>color;
scanf("%lld", &color);
arr2[color].push_back(arr[i-1]);
}
for(vector< vector<node> >::iterator iter = arr2.begin(); iter != arr2.end(); iter++)
{
vector<node> vec_tmp = *iter; // 该向量中,颜色相同
if(vec_tmp.size() <= 0)
{
continue;
}
vector<node> vec_0; // id为奇数向量
vector<node> vec_1; // id为偶数向量
/* node序列分成id为偶数的和id为奇数的 */
UP(i, 0, vec_tmp.size()-1)
{
if( vec_tmp[i].id % 2 == 0 )
{
vec_0.push_back(vec_tmp[i]);
}
else
{
vec_1.push_back(vec_tmp[i]);
}
}
/* 求出偶数中分数之和 */
if(vec_0.size() > 0)
{
UP(i, 0, vec_0.size() - 1)
{
UP(j, i+1, vec_0.size() - 1)
{
ans = ((ans%10007) + calScore(vec_0[i], vec_0[j]) % 10007) ;
}
}
}
// cout<<ans<<endl;
/* 求出奇数中分数之和 */
if(vec_1.size() > 0)
{
UP(i, 0, vec_1.size() - 1)
{
UP(j, i+1, vec_1.size() - 1)
{
ans = ((ans%10007) + calScore(vec_1[i], vec_1[j]) % 10007);
}
}
}
}
cout<<ans % 10007;
return 0;
}
求和问题(二维向量)
最新推荐文章于 2023-11-11 22:09:58 发布