You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
# include <bits/stdc++.h>
using namespace std ;
const int N = 100010 , mod = 10007 ;
int w [ N ] ; // 第i个格子的数字
int c [ N ] ; // 第i个格子的颜色
int s [ N ] [ 2 ] ;
// s[i][0]:颜色为i、编号为偶数格子上数字的和
// s[i][1]:颜色为i、编号为奇数格子上数字的和
int cnt [ N ] [ 2 ] ;
// cnt[i][0]:颜色为i、编号为偶数格子的个数
// cnt[i][1]:颜色为i、编号为奇数格子的个数
int main ( ) {
int n , m ;
cin > > n > > m ;
for ( int i = 1 ; i < = n ; i + + ) cin > > w [ i ] ; // 第i个格子的数字
// 预处理
for ( int i = 1 ; i < = n ; i + + ) { // 遍历每个格子
cin > > c [ i ] ; // 格子颜色c[i]
/*
装入不同的组中,组划分是两个规则:
① 颜色必须相同
② 奇偶性必须相同
所以, c[i]相同的放到同一个颜色组内,并且,在同一个颜色组内,奇偶数还必须相同。
s[][]:随着i的不断向后遍历, s中记录了相同颜色, 相同奇偶性的格子, 数字的累加和
cnt[][]:记录每个分组中的格子个数
*/
s [ c [ i ] ] [ i % 2 ] = ( s [ c [ i ] ] [ i % 2 ] + w [ i ] ) % mod ; // 累加分组内数字和
cnt [ c [ i ] ] [ i % 2 ] + + ; // 维护分组内格子个数
}
int ans = 0 ;
for ( int i = 1 ; i < = n ; i + + ) // 枚举每个格子
/*
Q:这个格子在哪个分组里呢?
答:
(1) c[i] : 按颜色划分
(2) i % 2 : 按奇偶性划分
Q:这个分组中格子的数量是多少呢?
答: cnt[c[i]][i % 2]
*/
ans = ( ans + i * ( ( cnt [ c [ i ] ] [ i % 2 ] - 2 ) * w [ i ] % mod + s [ c [ i ] ] [ i % 2 ] ) ) % mod ;
printf ( " %d \n " , ans ) ;
return 0 ;
}