文章目录

  • 1.描述:
  • 2. 输入:
  • 3.输出:
  • 4.样例输入:
  • 5.样例输出:
  • 6.题目大意:
  • 7.思路
    • 80分思路:
    • 80分代码 O( n*n )
    • 100分思路:O( n )
    • 一百分代码
  • 8.反思

1.描述:

一条狭长的纸带被均匀划分出了nn个格子,格子编号从11到nn。每个格子上都染了一种颜色coloricolor_icolori​
用[1,m]当中的一个整数表示),并且写了一个数字numberinumber_inumberi​

定义一种特殊的三元组:(x,y,z),其中x,y,z都代表纸带上格子的编号,这里的三元组要求满足以下两个条件:

1.xyz是整数 x<y<z , y−x=z−y
2.color x = color z

满足上述条件的三元组的分数规定为
(x+z)×(numberx+numberz)(x+z) \times (number_x+number_z)(x+z)×(numberx​+numberz​)
整个纸带的分数规定为所有满足条件的三元组的分数的和。这个分数可能会很大,你只要输出整个纸带的分数除以10,007所得的余数即可。

2. 输入:

第一行是用一个空格隔开的两个正整数n和m,n表纸带上格子的个数,m表纸带上颜色的种类数。

第二行有n用空格隔开的正整数,第i数字number表纸带上编号为i格子上面写的数字。

第三行有n用空格隔开的正整数,第i数字color表纸带上编号为i格子染的颜色。

3.输出:

一个整数,表示所求的纸带分数除以10007所得的余数。

4.样例输入:

15 4
5 10 8 2 2 2 9 9 7 7 5 6 4 2 4
2 2 3 3 4 3 3 2 4 4 4 4 1 1 1

5.样例输出:

1388

6.题目大意:

找所有满足关系的三元对 的 贡献和

7.思路

80分思路:

所有的三元对与中间元素没什么关系,只要首尾元素满足同奇或同偶且颜色相同即可组对,把所有满足条件元素输入便输入边处理即可

80分代码 O( n*n )

最多 1e5 种颜色 , 同种颜色 i 奇数 放在 i * 2 - 1,偶数放在 i * 2

#include<bits/stdc++.h>
using namespace std;
//ios::sync_with_stdio(false);
const int N = 1e6+10;
typedef long long ll;int n,m;
struct node{ll num;ll n;    ll col;
}a[N];const int p = 1e4+7;
vector<node>ve[N];
ll sum;int main()
{ios::sync_with_stdio(false);cin>>n>>m;for(int i=1;i<=n;i++){a[i].n=i;cin>>a[i].num;}for(int i=1;i<=n;i++){cin>>a[i].col;if(a[i].n%2!=0){ve[2*a[i].col-1].push_back(a[i]);int s=2*a[i].col-1;int t=ve[s].size()-1;for(int j=0;j<t;j++){sum=(sum+((ve[s][j].n+ve[s][t].n)*(ve[s][j].num+ve[s][t].num)))%p;   }}else{ve[2*a[i].col].push_back(a[i]);int s=2*a[i].col;int t=ve[s].size()-1;for(int j=0;j<t;j++){sum=(sum+((ve[s][j].n+ve[s][t].n)*(ve[s][j].num+ve[s][t].num)))%p; }}}cout<<sum;
}

复杂度 O( n2 ) 1e10,爆了

100分思路:O( n )

(x+z)×(numberx+numberz)(x+z) \times (number_x+number_z)(x+z)×(numberx​+numberz​)

把这个式子分解成
x×numberx+x×numberz+z×numberx+z×numberzx \times number_x+x \times number_z+z \times number_x+z \times number_zx×numberx​+x×numberz​+z×numberx​+z×numberz​

这样我么可以模拟一下,当某个颜色的奇数已经有1,3,7 的时候插入一个新元素 9
那么插入的 9 的贡献就是(可以与前边所有本组的组对)下面三个式子的和

1×number1+1×number9+9×number1+9×number91 \times number_1+1 \times number_9+9 \times number_1+9 \times number_91×number1​+1×number9​+9×number1​+9×number9​
3×number3+3×number9+9×number3+9×number93 \times number_3+3 \times number_9+9 \times number_3+9 \times number_93×number3​+3×number9​+9×number3​+9×number9​
7×number7+7×number9+9×number7+9×number97 \times number_7+7 \times number_9+9 \times number_7+9 \times number_97×number7​+7×number9​+9×number7​+9×number9​

化简

(1×number1+3×number3+7×number7)+(1+3+7)×number9+(number1+number3+number7)×9+3×(9×number9)(1 \times number_1+3 \times number_3+7 \times number_7)+(1+3+7) \times number_9+(number_1+number_3+number_7)\times9+3\times(9\times number_9)(1×number1​+3×number3​+7×number7​)+(1+3+7)×number9​+(number1​+number3​+number7​)×9+3×(9×number9​)

那么不难发现,可以维护的东西出来了(有些东西是可以维护累加和(前缀和)的),对于每种颜色的不同奇偶,我们可以维护一个
x×numberxx \times number_xx×numberx​
对应式子第一列
维护一个sumx数组sumx数组sumx数组
对应式子第二列的 x的和
维护一个 sumn数组sumn数组sumn数组
对应式子第三列的 numinum_inumi​的和
维护一个cnt数组cnt数组cnt数组
对应第四列 z×numberzz \times number_zz×numberz​的个数

一百分代码

#include<bits/stdc++.h>
using namespace std;//ios::sync_with_stdio(false);
const int N = 3*1e5+10;
typedef  long long ll;
int n,m;
ll num[N],col;
const int p = 10007;ll sumx[N];
ll sumn[N];
ll sumxn[N];
ll cnt[N];
ll sum;int main()
{ios::sync_with_stdio(false);cin>>n>>m;for(int i=1;i<=n;i++)  cin>>num[i];for(int i=1;i<=n;i++){cin>>col;     if(i%2!=0){int s=col*2-1;sum=(sum+sumxn[s]%p+sumx[s]*num[i]%p+sumn[s]*i%p+i*num[i]*cnt[s]%p)%p;sumxn[s]=(sumxn[s]+i*num[i])%p;sumx[s]=(sumx[s]+i)%p;sumn[s]=(sumn[s]+num[i])%p;cnt[s]++;}else{int s=col*2;sum=(sum+sumxn[s]%p+sumx[s]*num[i]%p+sumn[s]*i%p+i*num[i]*cnt[s]%p)%p;sumxn[s]=(sumxn[s]+i*num[i])%p;sumx[s]=(sumx[s]+i)%p;sumn[s]=(sumn[s]+num[i])%p;cnt[s]++;}}cout<<sum;
}

8.反思

一开始想出来第二种思路了,没开 long long 调了好久,还把思路又想了好几遍,没开 long long 只有四十分,从八十分到四十分,人傻了,纯纯nt,以后累加要取余的题一定要注意
1.开 long long
2.不断地 %%%%(进行取余)
3.可以用 ios::sync_with_stdio(false) 来加速,前缀和非常好的一道题

最后的最后,觉得写的还不错的,一定要点个赞留个言支持一下~~~

P2671 [NOIP2015 普及组] 求和(前缀和)相关推荐

  1. ◆竞赛题目◆◇NOIP2015普及组◇求和

    ◇NOIP2015普及组◇求和 Description 一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n.每个格子上都染了一种颜色color_i用[1,m]当中的一个整数表示),并且写了一个数字 ...

  2. NOIP2015普及组第1题 45 金币 方法三(python3实现)

    OpenJudge - 45:金币 信息学奥赛一本通(C++版)在线评测系统 [NOIP2015 普及组] 金币 - 洛谷 n=int( input() )x=1 #x为每天收到的金币数sum=0t= ...

  3. 信息学奥赛一本通 1970:【15NOIP普及组】扫雷游戏 | OpenJudge NOI 1.8 14:扫雷游戏地雷数计算 | 洛谷 P2670 [NOIP2015 普及组] 扫雷游戏

    [题目链接] ybt 1970:[15NOIP普及组]扫雷游戏 OpenJudge NOI 1.8 14:扫雷游戏地雷数计算 洛谷 P2670 [NOIP2015 普及组] 扫雷游戏 [题目考点] 1 ...

  4. 信息学奥赛一本通 1100:金币 | 1969:【15NOIP普及组】金币 | OpenJudge NOI 1.5 45 | 洛谷 P2669 [NOIP2015 普及组] 金币

    [题目链接] ybt 1100:金币 ybt 1969:[15NOIP普及组]金币 OpenJudge NOI 1.5 45:金币 洛谷 P2669 [NOIP2015 普及组] 金币 [题目考点] ...

  5. noip2015普及组真题详解

    第二十一届全国青少年信息学奥林匹克联赛初赛 普及组 C++ 语言试题 竞赛时间: 2015 年 10 月 11 日 14:30-16:30 一.单项选择题 ( 共 20 题,每题 1.5 分,共计 3 ...

  6. NOIP2015普及组复赛 解题分析

    1.金币 算法分析 直接模拟. #include <iostream> #include <cstdio> #include <cstring> using nam ...

  7. Noip2015普及组第四题 Salesman的解题报告

    [题意分析] 咋一看,这一题可以用贪心做,但是,时间复杂度是O(n*n),只能过60%的数据. [贪心算法](超时,60分) #include<cstdio> #include<cs ...

  8. 扫雷游戏(NOIP2015 普及组第二题)

    描述 扫雷游戏是一款十分经典的单击小游戏. 在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格). 玩家翻开一个非地雷格时,该格将会出现一个数字--提示周围格子中有 ...

  9. 金币(NOIP2015 普及组第一题)

    描述 国王将金币作为工资,发放给忠诚的骑士. 第一天骑士收到一枚金币:之后两天(第二天和第三天),每天收到两枚金币:之后三天(第四.五.六天),每天收到三枚金币:之后四天,每天收到四枚金币,以此类推: ...

最新文章

  1. 通过ctrl+r快速启动程序
  2. Mongodb 基础 查询表达式
  3. javascript运动系列第七篇——鼠标跟随运动
  4. 网盘工具比较,以及自己开发的网盘工具[转]
  5. Scikit-learn 更新至0.24版,这10个新特性你需要了解
  6. 【java】java的unsafe
  7. pve安装黑群晖直通硬盘_更新教程:群晖下直接挂载WINDOWS的NTFS格式硬盘,试验通过......
  8. 计算机基本接口6,计算机接口第6章.ppt
  9. 洛谷——P1424 小鱼的航程(改进版)
  10. Spark 机器学习拾遗
  11. 要做飞思卡尔智能车要学哪些知识?
  12. SuperMap iDesktop常见问题解答集锦 (二)
  13. ridge regression and lasso analysis-reproduced from csdn
  14. vscode之plantUML流程图
  15. 使用线性回归,岭回归,Lasso回归预测鲍鱼年龄
  16. Spring | 深入理解面向切面编程(AOP)
  17. H3C路由技术笔记——Policy-Based-Route
  18. c语言 等概率随机数,随机数函数取样与概率
  19. vue-element-admin 三级路由无法跳转
  20. docker部署wordpress

热门文章

  1. Spring Boot配置绑定
  2. c语言将英文逗号转成中文逗号,处理csv文件,英文逗号替换成中文逗号之后就乱码...
  3. VirtualBox之桥接网络使用配置
  4. php 防镜像网,wordpress防止网站被镜像实用方案教程
  5. 继电器模块和L298N电机驱动模块的使用
  6. 身份证最后一位校验位验证
  7. 计算机无法启动安装程序,电脑教程:win10安装程序无法正常启动
  8. 欧框语言框架标准C2,CEFR到底是什么?C2到底有多强!
  9. opengl绘制三次hermite曲线,三次cardinal曲线
  10. Golang slice(Go语言切片)元素前序追加