100分求助,Subtask #1TLE
查看原帖
100分求助,Subtask #1TLE
770891
NTT__int128楼主2023/10/10 17:04
#include <bits/stdc++.h>
#define int long long
using namespace std ;
const int N = 10007 ;
int n , m , u[100005] , c[100005] , ans ;
vector <int> v[100005][2] ;
signed main()
{
	cin >> n >> m ;
	for(int i = 1 ; i <= n ; i++)
	{
		cin >> u[i] ;
		u[i] %= N ; 
	}
	for(int i = 1 ; i <= n ; i++)	cin >> c[i] ;
	if(n <= 3000)
	{
		for(int i = 1 ; i <= n ; i++)
		{
			for(int j = i + 2 ; j <= n ; j += 2)
			{
				if(c[i] == c[j])	ans = (ans + (i + j) * (u[i] + u[j])) % N ;
			}
		}
		cout << ans ;
		return 0 ;
	}
	for(int i = 1 ; i <= n ; i++)	v[c[i]][i % 2].push_back(i) ;
	for(int i = 1 ; i <= m ; i++)
	{
		for(int j = 0 ; j < v[i][0].size() ; j++)
		{
			for(int k = j + 1 ; k < v[i][0].size() ; k++)
			{
				if(!((v[i][0][k] - v[i][0][j]) & 1))	ans = (ans + (v[i][0][j] + v[i][0][k]) * (u[v[i][0][j]] + u[v[i][0][k]])) % N ;
			}
		}
		for(int j = 0 ; j < v[i][1].size() ; j++)
		{
			for(int k = j + 1 ; k < v[i][1].size() ; k++)
			{
				if(!((v[i][1][k] - v[i][1][j]) & 1))	ans = (ans + (v[i][1][j] + v[i][1][k]) * (u[v[i][1][j]] + u[v[i][1][k]])) % N ;
			}
		}
	}
	cout << ans ;
	return 0 ;
} 
2023/10/10 17:04
加载中...