[NOIP2015普及组]求和
题目
题目描述
一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n。每个格子上都染了一种颜色color_i用[1,m]当中的一个整数表示),并且写了一个数字numberi。
定义一种特殊的三元组:(x,y,z),其中x,y,z都代表纸带上格子的编号,这里的三元组要求满足以下两个条件:
1. x,y,z是整数, x<y<z,y−x=z−y
2. colorx=colorz
满足上述条件的三元组的分数规定为(x+z)∗(numberx+numberz)。整个纸带的分数规定为所有满足条件的三元组的分数的和。这个分数可能会很大,你只要输出整个纸带的分数除以10,007所得的余数即可。
输入输出格式
输入格式:
第一行是用一个空格隔开的两个正整数n和m,n表纸带上格子的个数,m表纸带上颜色的种类数。
第二行有n用空格隔开的正整数,第i数字number表纸带上编号为i格子上面写的数字。
第三行有n用空格隔开的正整数,第i数字color表纸带上编号为i格子染的颜色。
输出格式:
共一行,一个整数,表示所求的纸带分数除以10,007所得的余数。
输入输出样例
输入样例1:
6 2
5 5 3 2 2 2
2 2 1 1 2 1
输出样例1:
82
输入样例2:
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
输出样例2:
1388
说明
【输入输出样例 1 说明】
纸带如题目描述中的图所示。
所有满足条件的三元组为: (1, 3, 5), (4, 5, 6)。
所以纸带的分数为(1 + 5)(5 + 2) + (4 + 6)(2 + 2) = 42 + 40 = 82。
对于第 1 组至第 2 组数据, 1 ≤ n ≤ 100, 1 ≤ m ≤ 5;
对于第 3 组至第 4 组数据, 1 ≤ n ≤ 3000, 1 ≤ m ≤ 100;
对于第 5 组至第 6 组数据, 1 ≤ n ≤ 100000, 1 ≤ m ≤ 100000,且不存在出现次数超过 20 的颜色;
对 于 全 部 10 组 数 据 , 1 ≤ n ≤ 100000, 1 ≤ m ≤ 100000, 1 ≤ color_i ≤ m,1≤number_i≤100000
分析
20分做法
看完这题,第一想法当然是无脑暴力啦…直接枚举x,y,z,看是否满足条件即可。算法复杂度为O(N3)。[代码就算了]
这样就可得20分了。当然,如果你想用更高级的算法不开long long也是可以的。
40分做法
可以直接枚举x,z的值,通过条件(1)求出y。再看是否满足条件。算法复杂度为O(N2)。
40~50分做法
仍然是枚举x,z的值,但可以先分析x+z=2*y的奇偶性,因为xyz是整数,因此2y是2的倍数,因此x,z必然都为偶数或奇数,因此可以分奇偶性进行枚举,此时这个三元组即可不考虑y值的大小,即为当(i%2==1)枚举前面奇数序列相同的颜色进行算分数即可,算法复杂度为O(N2/2)。
100分做法
通过上面的观察我们可以发现倒回去算前面的分数可能比较浪费时间,因此,我们采用数学的方法来优化此题(放心,很简单的)。
=============科目分割线==============
(这里只说明了i%2==1的情况,i%2==0是完全相似的)
令S(i,j)为(i,i+j/2,j)所组成的三元组的分数(x+z)∗(numberx+numberz)
Scorei为对于一个格子i的作为三元组第一个元素的总分数
colornum(colori)为对于一个格子i前方所有与之相同颜色且同奇偶性的格子的g个数
因此,对于一个格子K,有Scorek=S(1,k)+S(3,k)+...+S(colornum(colork,k−1),k)
=(1+k)∗(number1+numberk)+...+(colornum(colork)+k)∗(number(colornum(colork))+numberk)
=number1∗1+numberk∗1+number1∗k+numberk∗k+...+number(colornum(colork))∗colornum(colork)+number(colornum(colork))∗numberk+number(colornum(colork))∗k+numberk∗k
=(1∗number1+3∗number3+...+number(colornum(colork))∗colornum(colork))+k∗(number1+number3+...+number(colornum(colork)))+numberk∗(1+3+...+colornum(colork))+colornum(colork)∗k∗numberk
=============科目分割线==============
发现了什么,我们可以记录不同颜色的1∗number1+3∗number3+...+number(colornum(colork))∗colornum(colork),number1+number3+...+number(colornum(colork)),1+3+...+colornum(colork)的值,从而快速算出总分数。这样就可以轻易AK了~。算法复杂度O(n)
最后记得将结果不断%10007(是的,不断%%%%%%).
然后所有数都开long long 就可以过了~.
代码实现
我知道你们只看这个…
放个好理解的版本。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
using namespace std;
long long n,m,num[100005],cont[2][100005],cl;
long long sum1[3][100005],sum2[3][100005];
long long ans;
int main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&num[i]);
for(int i=1;i<=n;i++)
{
scanf("%lld",&cl);
if(i%2==1)
{
ans=(ans+sum1[0][cl]%10007+i*sum1[1][cl]%10007+num[i]*sum1[2][cl]%10007+cont[0][cl]*i*num[i]%10007)%10007;
sum1[0][cl]=(sum1[0][cl]+num[i]*i)%10007;
sum1[1][cl]=(sum1[1][cl]+num[i])%10007;
sum1[2][cl]=(sum1[2][cl]+i)%10007;
cont[0][cl]++;
}
else
{
ans=(ans+sum2[0][cl]%10007+i*sum2[1][cl]%10007+num[i]*sum2[2][cl]%10007+cont[1][cl]*i*num[i]%10007)%10007;
sum2[0][cl]=(sum2[0][cl]+num[i]*i)%10007;
sum2[1][cl]=(sum2[1][cl]+num[i])%10007;
sum2[2][cl]=(sum2[2][cl]+i)%10007;
cont[1][cl]++;
}
}
printf("%lld",ans%10007);
}
[NOIP2015普及组]求和的更多相关文章
- NOIP2015普及组总结
NOIP2015普及组总结 这次考试总体感觉不错,不过觉得时间有点紧,在最后30分钟才打完. 第一题(金币coin):大大的W!爆搜O(N),一分钟打完: 第二题(扫雷游戏mine):同上: 第三题( ...
- [NOIP2015 普及组] 扫雷游戏
[NOIP2015 普及组] 扫雷游戏 难度:入门 题目描述 扫雷游戏是一款十分经典的单机小游戏.在nn行mm列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开 ...
- NOIP2015普及组第四题推销员
好久没有写博客了,今天再写一篇.还是先看题: 试题描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家 ...
- 洛谷【P2669】NOIP2015普及组 T1金币
我对模拟的理解:http://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P266 ...
- NOIP2015 普及组 洛谷P2671 求和 (数学)
一道数学题...... 采用分组的思想,我们要统计答案的数对满足两个条件:同奇偶,同颜色.所以可以按这两个要求分组. 然后就是分组处理了,对于每组(有k个数),这里面的任意两对数都是满足条件的,可推出 ...
- [NOIP2015] 普及组
金币 模拟 #include<iostream> #include<cstdio> using namespace std; int main(){ int k,n; scan ...
- NOIP2015 普及组(Junior) 解题报告
1. 金币 (coin.cpp/c/pas) 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天),每天收到两枚金币:之后三天(第四.五.六天),每天收到三枚金币 ...
- NOIP2015普及组复赛A 推销员
题目链接:https://ac.nowcoder.com/acm/contest/243/A 题目大意: 略 分析: 方法就是把疲劳值从小到大排个序,然后从尾部开始一个一个取,当选到第i(i > ...
- 【NOIP2015普及组】推销员_详解
题目 题目大意 阿明是一名推销员--螺丝街是一条直线,一端有入口,一共有 \(N(<100,000)\) 家住户,第 \(i\) 家住户到入口的距离为 \(S_i\) 米.由于同一栋房子里可以有 ...
随机推荐
- python移植环境
如果整理材料的时候或者给别人共享代码的时候,除了使用docker外,也可以使用pip或者conda生成依赖项文件,然后在其他机器上将该依赖项一一安装就可以了. 但是有很多版本的依赖导致使用pip总是安 ...
- 10树莓派Samba的安装与配置
2017-08-31 12:28:26 1.安装samba服务打开终端或者SSH连接树莓派,输入如下命令: sudo apt-get install samba 已经安装过了显示下列信息: pi@ra ...
- 动态规划-数位DPwindy
https://vjudge.net/contest/297216?tdsourcetag=s_pctim_aiomsg#problem/L #include<bits/stdc++.h> ...
- 版本管理_git
git 世界上最好的版本管理工具,分布式版本控制系统. 林纳斯-托瓦斯,自由主义教皇(git.linux) git 不管理空文件夹 对比于 SVN mkdir XX 创建一个空目录 XX ...
- __x__(34)0908第五天__ 定位 position
position 定位 指将原始摆放到页面的任意位置. 继承性:no 默认值:static 没有定位,原始出现在正常的文档流中 可选值: static : 默认值,元素没有开启定位 ...
- 09_ for 练习 _ FlowerNumber
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- Hibernate-day04
HIbernate中的HQL查询 Hibernate中的查询方式:1,使用HQL:使用hibernate提供的面向对象的查询语句;2,使用SQL:在hibernate中允许使用原生的SQL直接查询;3 ...
- python mysql 单表查询 多表查询
一.外键 变种: 三种关系: 多对一 站在左表的角度: (1)一个员工 能不能在 多个部门? 不成立 (2)多个员工 能不能在 一个部门? 成立 只要有一个条件成立:多 对 一或者是1对多 如果两个条 ...
- jquery全选 不全选
<input type="checkbox" id="check">点击 <input type="checkbox" c ...
- PHP算法学习(4) 随机算法
svn地址:svn://gitee.com/zxadmin/live_z <?php /* * 随机数算法 * 伪随机数 根据分布概率 */ final class Random { /* * ...