P2671 求和- 普及+/提高

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;
}

      
            
 

猜你喜欢

转载自blog.csdn.net/weixin_45988242/article/details/107621651