首页 > 其他分享 >CSP历年复赛题-P2671 [NOIP2015 普及组] 求和

CSP历年复赛题-P2671 [NOIP2015 普及组] 求和

时间:2024-06-05 17:12:38浏览次数:23  
标签:P2671 NOIP2015 idx int ...+ color num +...+ CSP

原题链接:https://www.luogu.com.cn/problem/P2671

题意解读:找到所有符合条件的三元组,累加三元组的分数,结果对10007取模。

解题思路:

仔细读题,并分析数据规模,1~4个数据点可以通过O(n^2)复杂度解决,也就是枚举法。

1、枚举法

要求x < y < z,y − x = z − y,移项可得x + z = 2 * y,并且color[x] = color[z]

只需要枚举所有的x,z(x < z),然后判断是否符合以下条件:

color[x] = color[z],x + z是偶数,y = (x + z) / 2不超过n 

如果符合条件,即可计算分值,累加到ans

最后输出ans即可。

50分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 100005, MOD = 10007;
int n, m, ans;
int num[N], color[N];

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        cin >> num[i];
    }
    for(int i = 1; i <= n; i++)
    {
        cin >> color[i];
    }
    
    for(int x = 1; x < n; x++)
    {
        for(int z = x + 1; z <= n; z++)
        {
            if(color[x] == color[z] && (x + z) % 2 == 0 && (x + z) / 2 <= n)
            {
                ans += ((x + z) % MOD) * ((num[x] + num[z]) % MOD);
                ans %= MOD;
            }
        }
    }
    cout << ans;

    return 0;
}

2、推公式

根据以上分析得知,x + z = 2 * y,所以x+z是偶数,x、z必须同奇或者同偶且颜色相同

为了缩减枚举的范围,可以把数据按照颜色分组,每种颜色再分成奇数、偶数

一共有m种颜色,因此一共可以分成m * 2组

这样,每一组里任意两个数都可以组成有效的x,z

设每组里的元素编号为idx[i],元素数字为num[i],该组一共有n个元素

则这个组的总的分数为:

(idx[1]+idx[2])*(num[1]+num[2]) + (idx[1]+idx[3])*(num[1]+num[3]) + ... + (idx[1]+idx[n])*(num[1]+num[n]) +

(idx[2]+idx[3])*(num[2]+num[3]) + (idx[2]+idx[4])*(num[2]+num[4]) + ... + (idx[2]+idx[n])*(num[2]+num[n]) + 

(idx[3]+idx[4])*(num[3]+num[4]) + (idx[3]+idx[5])*(num[3]+num[5]) + ... + (idx[3]+idx[n])*(num[3]+num[n]) +

...+

(idx[n-1]+idx[n])*(num[n-1]+num[n])

提取共同的idx因子之后:

idx[1]*(num[1]+num[2]+num[1]+num[3]+num[1]+num[4]+...+num[1]+num[n]) + 

idx[2]*(nun[1]+num[2]+num[2]+num[3]+num[2]+num[4]+...+num[2]+num[n]) +

idx[3]*(num[1]+num[3]+num[2]+nun[3]+num[3]+num[4]+...+num[3]+num[n]) +

...+

idx[n]*(num[1]+num[n]+num[2]+num[n]+num[3]+num[n]+...+num[n-1]+num[n])

进一步合并:

idx[1]*((n-1)*num[1]+num[2]+num[3]...+num[n]) + 

idx[2]*((n-1)*num[2]+num[1]+num[3]+...+num[n]) +

idx[3]*((n-1)*num[3]+num[1]+num[2]+...+num[n]) + 

...+

idx[n]*((n-1)*num[n]+num[1]+num[2]+...+num[n-1])

进一步合并:

idx[1]*((n-2)*num[1]+num[1]+num[2]...+num[n]) + 

idx[2]*((n-2)*num[2]+num[1]+num[2]+...+num[n]) +

idx[3]*((n-2)*num[3]+num[1]+num[2]+...+num[n]) + 

...+

idx[n]*((n-2)*num[n]+num[1]+num[2]+...+num[n])

可以写成:

idx[1]*((n-2)*num[1]+∑num[i]) + 

idx[2]*((n-2)*num[2]+∑num[i]) +

idx[3]*((n-2)*num[3]+∑num[i]) + 

...+

idx[n]*((n-2)*num[n]+∑num[i])

进一步转为:(n-2) * (idx[1]*num[1] + idx[2]*num[2] +...+ idx[n]*num[n]) + (idx[1]+idx[2]+...+idx[n])*∑num[i]

因此,需要提前计算出每一个编号-数字所在分组的元素个数,以及分组所有数字之和

可以设cnt[i][0]记录颜色i的编号偶数组的元素个数,cnt[i][1]记录颜色i的编号奇数组的元素个数

设sum[i][0]为颜色i编号偶数组的元素数字之和,sum[i][1]为颜色i的编号奇数组的元素数字之和

枚举一次每一个格子的颜色,提前预计算cnt、sum

再枚举每一个编号,代入上面公式,累加计算结果即可。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 100005, MOD = 10007;
int n, m, ans;
int num[N], color[N];
int cnt[N][2], sum[N][2];

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        cin >> num[i];
    }
    for(int i = 1; i <= n; i++)
    {
        cin >> color[i];
        cnt[color[i]][i % 2]++;
        sum[color[i]][i % 2] += num[i];
        sum[color[i]][i % 2] %= MOD;
    }
    
    for(int i = 1; i <= n; i++)
    {
        ans += (cnt[color[i]][i % 2]-2) % MOD * i % MOD * num[i] % MOD+ i % MOD * sum[color[i]][i % 2] % MOD;
        ans %= MOD;
    }
    cout << ans;

    return 0;
}

 

标签:P2671,NOIP2015,idx,int,...+,color,num,+...+,CSP
From: https://www.cnblogs.com/jcwy/p/18233382

相关文章

  • 打卡信奥刷题(52)用Scratch图形化工具信奥P7909 [普及组] [CSP-J 2021] 分糖果
    [CSP-J2021]分糖果题目背景红太阳幼儿园的小朋友们开始分糖果啦!题目描述红太阳幼儿园有nnn个小朋友,你是其中之一。保证......
  • 2024年云计算、信号处理与网络技术国际学术会议(ICCCSPNT 2024)
    2024年云计算、信号处理与网络技术国际学术会议(ICCCSPNT2024)2024InternationalAcademicConferenceonCloudComputing,SignalProcessing,andNetworkTechnology(ICCCSPNT2024)会议简介:2024年云计算、信号处理与网络技术国际学术会议(简称ICCCSPNT2024)是一个集结了......
  • P5663 [CSP-J2019] 加工零件
    原题链接题解请仔细读题!!!如果1号工人需要提供原材料,那么代表\(a_i\to1\)存在一条长度为\(L_i\)的路径(可以重复走)由于重复走不会改变路径长度的奇偶性,所以一定存在一条奇偶性相同,且长度小于\(L_i\)的路径,所以只要求从点1出发到各个点奇偶最短路即可code#include<bits/......
  • [NOIP2015 提高组] 跳石头
    [NOIP2015提高组]跳石头跳石头题目描述一年一度的“跳石头”比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有$N$块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点......
  • CSP历年复赛题-P1982 [NOIP2013 普及组] 小朋友的数字
    原题链接:https://www.luogu.com.cn/problem/P1982题意解读:特征值:第i个同学的特征值是1~i中最大子段和,分数:第i个同学分数是前1~i-1个同学的分数+特征值最大值,求最大分数。解题思路:第一步:先计算特征值f[i],f[i]等于1~i中所有数的最大子段和,所以借助最大子段和的DP方法,每次计算以i......
  • CSP历年复赛题-P1981 [NOIP2013 普及组] 表达式求值
    原题链接:https://www.luogu.com.cn/problem/P1981题意解读:中缀表达式求值,只有+,*,没有括号,保留后4位。解题思路:中缀表达式求值的典型应用,采用两个栈:符号栈、数字栈,对于没有括号的情况,只需要如下步骤:1、遍历表达式每一个字符2、如果遇到数字,则持续提取数字,保存整数到数字栈3、......
  • CSP历年复赛题-P1980 [NOIP2013 普及组] 计数问题
    原题链接:https://www.luogu.com.cn/record/160821231题意解读:统计1~n中x的个数。解题思路:枚举每个数,提取每一位,判断是否等于x。100分代码:#include<bits/stdc++.h>usingnamespacestd;intn,x,ans;intmain(){cin>>n>>x;for(inti=1;i<=n;i++)......
  • CSP历年复赛题-P1078 [NOIP2012 普及组] 文化之旅
    原题链接:https://www.luogu.com.cn/problem/P1078题意解读:1~n个国家,每个国家有自己的文化,不同国家文化可以相同,要从起点遍历到终点,已经学习过的文化不能重复学习,已经学习过的文化被某个文化歧视的国家也不能遍历,且不同国家之间有边,边有不同的距离,计算从起点到终点的最短路径。解......
  • 2024年第七届信息通信与信号处理国际会议(ICICSP 2024)即将召开!
    2024年第七届信息通信与信号处理国际会议(ICICSP2024)将于2024年9月21-23日在中国舟山举行。ICICSP2024是一个汇聚全球顶尖科研人才、探讨信息通信与信号处理领域最新科研成果和发展趋势的国际盛会。本次会议的主题涵盖了信号处理、多媒体信号处理、互联网技术等多个领域的前......
  • DVWA-CSP Bypass
    CSP的主要目标是减少和报告XSS攻击。XSS攻击利用了浏览器对于从服务器所获取的内容的信任。恶意脚本在受害者的浏览器中得以运行,因为浏览器信任其内容来源,即使有的时候这些脚本并非来自于它本该来的地方。CSP通过指定有效域——即浏览器认可的可执行脚本的有效来源—......