P2671 [NOIP2015 普及组] 求和

[NOIP2015 普及组] 求和

题目背景

NOIP2015 普及组 T3

题目描述

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

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

  1. xyz是整数,x<y<z,yx=zy

  2. colorx=colorz

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

输入格式

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

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

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

输出格式

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

样例 #1

样例输入 #1

6 2
5 5 3 2 2 2
2 2 1 1 2 1

样例输出 #1

82

样例 #2

样例输入 #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 组数据, 1n100,1m5

对于第3 组至第 4 组数据, 1n3000,1m100

对于第 5 组至第6组数据, 1n100000,1m100000,且不存在出现次数超过20的颜色;

对 于 全 部 10 组 数 据 , 1n100000,1m100000,1colorim,1numberi100000

思路

一开始想到O(n2)的算法。

yx=z
x+z=2×y

所以暴力枚举x,z就好了。但是肯定会TLE

我们把所有数按颜色分成m组,然后为了枚举下标再开两个位置来判断下标的奇偶性(因为前面x+z=2×y,所以x,z奇偶性相同)。

假设一组里的数分别是x1,x2,,xk,下标是y1,y2,,yk
那么答案=(x1+x2)×(y1+y2)+(x1+x3)×(y1+y3)+
             =x1×(y1+y2+y1+y3++y1+yk)+x2×(y2+y1+y2+y3++y2+yk)++xk×(yk+y1+yk+y2++yk+yk1)
             =x1×(y1×(k2)+i=1kyi)+x2×(y2×(k2)+i=1kyi)++xk×(yk×(k2)+i=1kyi)

这里每一个式子里都有i=1kyi),所以我们可以提前与处理一下,加快速度。

我们可以枚举所有数,第i数都加上xi×(yi×(k2)+i=1kyi)即可,最后全部加上模上10007即可
可以依据代码来理解,我觉得挺有必要。

代码

#include <iostream>
using namespace std;
const int N = 100010,MOD = 10007;
int n,m;
int a[N],color[N];
int s[N][2],sum[N][2];
int main () {
	cin >> n >> m;
	for (int i = 1;i <= n;i++) cin >> a[i];
	for (int i = 1;i <= n;i++) {
		cin >> color[i];
		s[color[i]][i % 2]++;
		sum[color[i]][i % 2] = (sum[color[i]][i % 2] + i) % MOD;
	}
	int ans = 0;
	for (int i = 1;i <= n;i++) ans = (ans + a[i] * (i * (s[color[i]][i % 2] - 2) % MOD + sum[color[i]][i % 2]) % MOD) % MOD;
	cout << ans << endl;
	return 0;
}
posted @   incra  阅读(180)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示