P2671 [NOIP2015 普及组] 求和

这篇博客详细解析了洛谷P2671题目的解题思路,从20分的暴力枚举到100分的数学优化方法。博主首先介绍了三种不同复杂度的解决方案,包括O(N^3)的基本枚举,O(N^2)的优化枚举,以及O(N^2/2)的奇偶性优化。然后给出了AC代码,展示了如何利用奇偶性减少计算量,提高效率。文章适合对算法和编程竞赛感兴趣的读者学习。
摘要由CSDN通过智能技术生成

题目链接:P2671 [NOIP2015 普及组] 求和https://www.luogu.com.cn/problem/P2671icon-default.png?t=M276https://www.luogu.com.cn/problem/P2671

题目分析(结合题解整理出我能看懂的)

20分做法

看完这题,第一想法当然是无脑暴力啦...直接枚举x,y,z,看是否满足条件即可。算法复杂度为O(N^3)O(N3)。[代码就算了]

这样就可得20分了。当然,如果你想用更高级的算法不开long long也是可以的。

40分做法

可以直接枚举x,z的值,通过条件(1)求出y。再看是否满足条件。算法复杂度为O(N^2)

40~50分做法

仍然是枚举x,z的值,但可以先分析x+z=2*y的奇偶性,因为xyz是整数,因此2y是2的倍数,因此x,z必然都为偶数或奇数,因此可以分奇偶性进行枚举,此时这个三元组即可不考虑y值的大小,即为当(i%2==1)枚举前面奇数序列相同的颜色进行算分数即可,算法复杂度为O(N^2/2)。

100分做法

通过上面的观察我们可以发现倒回去算前面的分数可能比较浪费时间,因此,我们采用数学的方法来优化

 

 

AC CODE

#include <cstdio>

const int N = 100000;
const int M = 10007;
int n, m;
int sum[N + 1][2], nt[N + 1][2];
int color[N + 1], number[N + 1];
long long ans = 0;

int main()
{
    scanf(" %d %d", &n, &m);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &number[i]);
        number[i] %= M;
    }
    for(int i = 1; i <= n; i++) {
        scanf("%d", &color[i]);
        int c = color[i];
        int g = i % 2;
        nt[c][g]++;
        sum[c][g] += number[i];
        sum[c][g] %= M;
    }
    for(int i = 1; i <= n; i++) {
        int c = color[i];
        int g = i % 2;
        ans += i % M * ((sum[c][g] + (nt[c][g] - 2) % M * number[i] + M) % M);
        ans %= M;
    }
    printf("%lld", ans);
    return 0;
}

侵删 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值