P2671 求和- 普及+/提高
思路:自己用了俩for循环解决这个问题 就是根据(i+j)%2==0来判断的,然后超时,得了40分,说名o2还是不行,然后看了下别人的题解,发现他们又在我这个基础上变化了下,他们感觉直接相同颜色的 把 奇数奇数分在一块 偶数偶数一块 这样就不用判断了,但有问题 是怎么求那个要求的式子,来推下!
假设这个一组有k个元素,num[1],num[2]…num[k];下标是y[1] y[2]…y[k]
计算的式子是s=(num[1]+num[2])(y[1]+y[2])+(…)+(num[1]+num[k])(y[1]+y[k])+(num[2]+num[k])(y[2]+y[k]);
s=y[1](num[1]+num[2]+…+num[1]+num[k])+…
s=y[1](k-2)(num[[1]+num[[2]+…num[[k]);
差不多就是这个意思!!
!
开个二维数组 然后来存相同颜色相同奇偶性的。然后接着把他们的num和接着算出来。到后面直接乘就可以啦
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <algorithm>
#include <iomanip>
#include <map>
#include <queue>
#include <vector>
#include <set>
const int inf = 0x3f3f3f3f;//1061109567
typedef long long ll;
using namespace std;
int co[100010], num[100010],dp[100010][2];
int f[100010][3];
int main()
{
int n, m; cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> num[i]; // scanf("%d",&num[i]);
for (int i = 1; i <= n; i++)
{ cin >> co[i]; // scanf("%d",&co[i]);
f[co[i]][i % 2]++;
dp[co[i]][i % 2]=(num[i]+ dp[co[i]][i % 2]) %10007;
}
ll s = 0;
for (int i = 1; i <= n; i++)
{
s = (s + i * ((f[co[i]][i % 2] - 2) * num[i] % 10007 + dp[co[i]][i % 2])) % 10007;
}
cout << s << endl;
}