求和(NOIP2015)
题目链接:求和
这道题不是很简单,因为数据并不是很小,常规计算会t。
这里引用chenleyu的解答(如果想要cgg原创解答,……改天吧):
这题相对是比较难的,首先我们要解读题目的意思
一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n。每个格子上都染了一种颜色color_i用[1,m]当中的一个整数表示),并且写了一个数字number_i。
由这段不难得到,所谓纸带,其实就是一个集合组,每一个小集合(格子)里都有三个元素:编号,颜色和上面写的数
就是这样
纸带[]
|num,col,i|num,col,i|num,col,i||num,col,i||num,col,i||num,col,i|
然后我们再来看那神奇的三元组
“定义一种特殊的三元组:(x,y,z),其中x,y,z都代表纸带上格子的编号,这里的三元组要求满足以下两个条件:
1.xyz是整数,x小于y小于z,y-x=z-y
2.colorx=colorz
满足上述条件的三元组的分数规定为(x+z)*(number_x+number_z)”
我们看三元组的第一个条件
首先x小于y小于z这很容易理解,我们来看y-x=z-y
通过等式的性质,我们可以将它进行一些变换
y-x=z-y
y+y=z+x
z+x=2y
这样就可以知道z+x必为偶数,那又因为
奇数+奇数=偶数
偶数+偶数=偶数
奇数+偶数=奇数
所以x和z的奇偶性一定相同
所以题目三元组的条件就可以化为
1 z>x
2 z和x的奇偶性相同
3 z格和x格的颜色相同
(跟y一点关系也没有)
换句话说,只要有两个数奇偶性相同,颜色相同,那他们必是会产生分数的
再来看分数的计算
分数=(x+z)*(num[x]+num[z])
我们再来做一点变换
根据乘法分配律
(x+z)*(num[x]+num[z])
=x*num[x]+x*num[z]+z*num[x]+z*num[z]
那假设i1,i2,i3,i4….的奇偶性相同,颜色相同,那么
他们的得分就为
(i1*num[i1]+i1*num[i2]+i2*num[i1]+i2*num[i3])+(i1*num[i1]+i1*num[i3]+i3*num[i1]+i3*num[i3])+…………..
把括号去掉,把和i1有关的放在一起,把和in有关的放在一起
就成了这样
i1*num[i1]+i1*num[i2]+ i1*num[i1]+i1*num[i3]+…….(和i1有关的)
=i1*(num[i1]+num[i2]+…….+num[in])+n*(i1*num[i1])
于是我们就可以得到这个公式
和in有关的得分就
= in*(num[i1]+num[i2]+…….+num[in])+n*(in*num[in])
再把i1,i2,i3….in的得分加起来就是总分了
因为结果很大所以要记得边做边%10007哦
看得出来,他讲得很详细,我相信你也应该能看懂了,下面看我的代码:
#include<bits/stdc++.h>
#ifdef WIN32 //1
#define LL "%I64d"
#else
#define LL "%lld"
#endif
using namespace std;
int n,c;
int sum[2][100001]={0};
int d[2][100001]={0};
int num[100001];
int col[100001];
long long maxx=0;
int main()
{
scanf("%d%d",&n,&c);
for (int i=1;i<=n;i++){
scanf("%d",&num[i]);
num[i]%=10007;
}
int n1=0,n2=0;
for (int i=1;i<=n;i++){
scanf("%d",&col[i]);
sum[i%2][col[i]]+=num[i]; //2
sum[i%2][col[i]]%=10007;
d[i%2][col[i]]++;
}
for (int i=1;i<=n;i++){
maxx+=1LL*i%10007*((sum[i%2][col[i]]+(d[i%2][col[i]]-2)%10007*num[i]+10007)%10007); //3
maxx%=10007;
}
printf(LL,maxx);
return 0;
}
讲三点(这里是cgg原汁原味的讲解):
1处:这里是cgg曾在信息学培训中,提到过的技巧。
2处:这里是计算每一种颜色单数下标和偶数下标的前缀和。
3处:套公式。
求和(NOIP2015)的更多相关文章
- [NOIP2015普及组]求和
题目 题目描述 一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n.每个格子上都染了一种颜色color_i用[1,m]当中的一个整数表示),并且写了一个数字numberi. 定义一种特殊的三元组: ...
- [P2671][NOIP2015]求和 (数论)
[题目链接] 这位大神讲得很详细:点我 本蒟蒻只会抄抄题解了 #include<bits/stdc++.h> #define max(a,b) (a>b?a:b) #define m ...
- NOIP2015 普及组 洛谷P2671 求和 (数学)
一道数学题...... 采用分组的思想,我们要统计答案的数对满足两个条件:同奇偶,同颜色.所以可以按这两个要求分组. 然后就是分组处理了,对于每组(有k个数),这里面的任意两对数都是满足条件的,可推出 ...
- NOIP2015&2016普及组解题报告
NOIP2015普及组题目下载 NOIP2016普及组题目下载 NOIP2015普及组题目: NOIP2018RP++ NOIP2016普及组题目 NOIP2018RP++ T1 金币\((coin. ...
- 【题解】NOIP2015提高组 复赛
[题解]NOIP2015提高组 复赛 传送门: 神奇的幻方 \([P2615]\) 信息传递 \([P2661]\) 斗地主 \([P2668]\) 跳石头 \([P2678]\) 子串 \([P26 ...
- NOIP2015普及组总结
NOIP2015普及组总结 这次考试总体感觉不错,不过觉得时间有点紧,在最后30分钟才打完. 第一题(金币coin):大大的W!爆搜O(N),一分钟打完: 第二题(扫雷游戏mine):同上: 第三题( ...
- 【NOIP2015模拟11.5】JZOJ8月5日提高组T1 俄罗斯套娃
[NOIP2015模拟11.5]JZOJ8月5日提高组T1 俄罗斯套娃 题目 题解 题意就是说 将1~\(n\)排列,问有多少种方案使得序列的逆序对个数小于\(k\) 很容易想到DP 设\(f[i][ ...
- Java程序:从命令行接收多个数字,求和并输出结果
一.设计思想:由于命令行接收的是字符串类型,因此应先将字符串类型转化为整型或其他字符型,然后利用for循环求和并输出结果 二.程序流程图: 三.源程序代码: //王荣荣 2016/9/23 ...
- Java之递归求和的两张方法
方法一: package com.smbea.demo; public class Student { private int sum = 0; /** * 递归求和 * @param num */ ...
随机推荐
- commit 流程
COMMIT是一个非常快的操作,当我们发布commit命令时,真正困难的动作已经完成,在数据库中已经执行了数据更改,所以已经完成了99%的任务,例如:下列操作已经产生: 1.在SGA(Buffer C ...
- WLC5520无法通过无线客户端进行网管故障解决
客户反馈其办公环境中的WLC5520网管需要通过内部有线网络进行管理,通过无线客户端无法进行管理,远程协助其开启WLC5520的无线管理功能后故障解决.
- javascript简单的滑动效果
利用setInterval实现简单的滑动效果 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- java函数方法
1.方法重载 (1)源代码 // MethodOverload.java // Using overloaded methods public class MethodOverload { publi ...
- [剑指Offer]23-链表中环的入口节点
题目链接 https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4?tpId=13&tqId=11208&t ...
- 489. Robot Room Cleaner扫地机器人
[抄题]: Given a robot cleaner in a room modeled as a grid. Each cell in the grid can be empty or block ...
- swift - UIWebView 和 WKWebView(iOS12 之后替换UIWebView)
1.iOS12 之前 使用 UIWebView 1> private lazy var webV : UIWebView = { let v = UIWebView(frame: self.vi ...
- Redis 非关系性数据库集群的搭建与常用方法
redis 非关系型数据库,内存型数据库,现在大家都不陌生了,无论大中小型企业,都会将redis应用到自己的项目中,以此来减轻数据库的压力 安装步骤: 1.安装gcc 安装c语言的编译环境 yum i ...
- DevExpress之TreeList节点绑定图片
最近在项目中使用到了DX中的TreeList控件绑定数据源时在每个节点前显示特点的图片:查阅相关资料实现方法如下:1.首先打开VS2010新建一个WINFROM应用程序: 2.在WINFROM应用程序 ...
- static ,const
函数原型作用域:作用范围为函数形参表范围,起始于“(”,结束于“)”,这是声明 定义是属于局部作用域,所以声明的时候不写形参名字也可以 类作用域:包含类体及在类外实现的本类成员函数的函数体 静态生存期 ...