[NOIP2015 普及组] 求和-剪枝优化
题目描述
一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n。每个格子上都染了一种颜色color[i],color[i]用[1,m]当中的一个整数表示),并且写了一个数字number[i]。
定义一种特殊的三元组:(x,y,z),其中x,y,z都代表纸带上格子的编号,这里的三元组要求满足以下两个条件:
x,y,z是整数,x<y<z,y−x=z−y(等差数列),color[x]=color[z];
满足上述条件的三元组的分数规定为(x+z)×(number[x]+number[z]) 。整个纸带的分数规定为所有满足条件的三元组的分数的和。这个分数可能会很大,你只要输出整个纸带的分数除以10007所得的余数即可。
输入格式
第一行是用一个空格隔开的两个正整数n和m, n表示纸带上格子的个数,m表示纸带上颜色的种类数。
第二行有n个用空格隔开的正整数,第i个数字number[i]表示纸带上编号为i格子上面写的数字。
第三行有n个用空格隔开的正整数,第i个数字color[i]表示纸带上编号为i格子染的颜色。
输出格式
一个整数,表示所求的纸带分数除以10007所得的余数。
输入输出样例
输入 #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
想法
显而易见,这题最简单 的方法是暴力搜索,时间复杂度为O(N^3)
当然这样会超时(废话) (据说可以拿20分)
那么我们会想到如果去取2y=z+x,时间复杂度会变成O(N^2),当然这样依然会超时
那么如何进一步的缩短搜寻的时间成为了本题的关键,比如我们可以搞搞颜色(没错文档编辑器只有这一种颜色可以选) ,或者是考虑x,z的奇偶性,得到以下几点:
(1)x为奇数时,z必定为奇数;x为偶数时,z必定为偶数。
(2)x和z颜色相同时才能组成三元组
(3)然后找就行了
代码如下
#include <cstdio>
#include <cstring>
using namespace std;
int n, m, sum;
long long num[100010], color[100010], t[100010];
long long tc[100010], tn[100010], tm[100010];
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%lld", &num[i]);
for (int i = 1; i <= n; i++)
scanf("%lld", &color[i]);
int i = 1;
while (i <= n)
{
t[color[i]]++;
tc[color[i]] += i * num[i];
tn[color[i]] += num[i];
tm[color[i]] += i;
i += 2;
}
for (int j = 1; j <= m; j++)
{
if (t[j] > 1)
sum= (sum + (t[j] - 2) * tc[j] + tn[j] * tm[j]) % 10007;
}
memset(t, 0, sizeof(t));
memset(tc, 0, sizeof(tc));
memset(tn, 0, sizeof(tn));
memset(tm, 0, sizeof(tm));
i = 2;
while (i <= n)
{
t[color[i]]++;
tc[color[i]] += i * num[i];
tn[color[i]] += num[i];
tm[color[i]] += i;
i += 2;
}
for (int j = 1; j <= m; j++)
{
if (t[j] > 1)
sum= (sum + (t[j] - 2) * tc[j] + tn[j] * tm[j]) % 10007;
}
printf("%d", sum);
}`>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现