P2671 [NOIP2015 普及组] 求和(前缀和)
文章目录
- 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 普及组] 求和(前缀和)相关推荐
- ◆竞赛题目◆◇NOIP2015普及组◇求和
◇NOIP2015普及组◇求和 Description 一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n.每个格子上都染了一种颜色color_i用[1,m]当中的一个整数表示),并且写了一个数字 ...
- NOIP2015普及组第1题 45 金币 方法三(python3实现)
OpenJudge - 45:金币 信息学奥赛一本通(C++版)在线评测系统 [NOIP2015 普及组] 金币 - 洛谷 n=int( input() )x=1 #x为每天收到的金币数sum=0t= ...
- 信息学奥赛一本通 1970:【15NOIP普及组】扫雷游戏 | OpenJudge NOI 1.8 14:扫雷游戏地雷数计算 | 洛谷 P2670 [NOIP2015 普及组] 扫雷游戏
[题目链接] ybt 1970:[15NOIP普及组]扫雷游戏 OpenJudge NOI 1.8 14:扫雷游戏地雷数计算 洛谷 P2670 [NOIP2015 普及组] 扫雷游戏 [题目考点] 1 ...
- 信息学奥赛一本通 1100:金币 | 1969:【15NOIP普及组】金币 | OpenJudge NOI 1.5 45 | 洛谷 P2669 [NOIP2015 普及组] 金币
[题目链接] ybt 1100:金币 ybt 1969:[15NOIP普及组]金币 OpenJudge NOI 1.5 45:金币 洛谷 P2669 [NOIP2015 普及组] 金币 [题目考点] ...
- noip2015普及组真题详解
第二十一届全国青少年信息学奥林匹克联赛初赛 普及组 C++ 语言试题 竞赛时间: 2015 年 10 月 11 日 14:30-16:30 一.单项选择题 ( 共 20 题,每题 1.5 分,共计 3 ...
- NOIP2015普及组复赛 解题分析
1.金币 算法分析 直接模拟. #include <iostream> #include <cstdio> #include <cstring> using nam ...
- Noip2015普及组第四题 Salesman的解题报告
[题意分析] 咋一看,这一题可以用贪心做,但是,时间复杂度是O(n*n),只能过60%的数据. [贪心算法](超时,60分) #include<cstdio> #include<cs ...
- 扫雷游戏(NOIP2015 普及组第二题)
描述 扫雷游戏是一款十分经典的单击小游戏. 在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格). 玩家翻开一个非地雷格时,该格将会出现一个数字--提示周围格子中有 ...
- 金币(NOIP2015 普及组第一题)
描述 国王将金币作为工资,发放给忠诚的骑士. 第一天骑士收到一枚金币:之后两天(第二天和第三天),每天收到两枚金币:之后三天(第四.五.六天),每天收到三枚金币:之后四天,每天收到四枚金币,以此类推: ...
最新文章
- 通过ctrl+r快速启动程序
- Mongodb 基础 查询表达式
- javascript运动系列第七篇——鼠标跟随运动
- 网盘工具比较,以及自己开发的网盘工具[转]
- Scikit-learn 更新至0.24版,这10个新特性你需要了解
- 【java】java的unsafe
- pve安装黑群晖直通硬盘_更新教程:群晖下直接挂载WINDOWS的NTFS格式硬盘,试验通过......
- 计算机基本接口6,计算机接口第6章.ppt
- 洛谷——P1424 小鱼的航程(改进版)
- Spark 机器学习拾遗
- 要做飞思卡尔智能车要学哪些知识?
- SuperMap iDesktop常见问题解答集锦 (二)
- ridge regression and lasso analysis-reproduced from csdn
- vscode之plantUML流程图
- 使用线性回归,岭回归,Lasso回归预测鲍鱼年龄
- Spring | 深入理解面向切面编程(AOP)
- H3C路由技术笔记——Policy-Based-Route
- c语言 等概率随机数,随机数函数取样与概率
- vue-element-admin 三级路由无法跳转
- docker部署wordpress
热门文章
- Spring Boot配置绑定
- c语言将英文逗号转成中文逗号,处理csv文件,英文逗号替换成中文逗号之后就乱码...
- VirtualBox之桥接网络使用配置
- php 防镜像网,wordpress防止网站被镜像实用方案教程
- 继电器模块和L298N电机驱动模块的使用
- 身份证最后一位校验位验证
- 计算机无法启动安装程序,电脑教程:win10安装程序无法正常启动
- 欧框语言框架标准C2,CEFR到底是什么?C2到底有多强!
- opengl绘制三次hermite曲线,三次cardinal曲线
- Golang slice(Go语言切片)元素前序追加