[题解]P2671 [NOIP2015 普及组] 求和
可以发现我们对相同颜色且编号奇偶性相同的元素归为一组,组内的元素两两都满足题目条件,且这样可以不重不漏覆盖所有答案。
设分完组之后,某一组内的元素编号分别是\(a_1,a_2,\dots,a_q\),数字分别是\(b_1,b_2,\dots,b_q\),则根据题意,该组的答案是:
\]
对于每个\(i\),答案是:
\]
所以维护\(b\)、\(c\)、\(b\times c\)三个前缀和数组即可。这样对于每个\(i\)都可以\(O(1)\)求出。总时间复杂度\(O(n)\)。
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define mod 10007
#define N 100010
#define M 100010
using namespace std;
int n,m,col[N],a[N],nn[2*M],ans;
vector<int> b[2*M],c[2*M],preb[2*M],prec[2*M],pre[2*M];
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>col[i];
for(int i=1;i<=(m<<1);i++) b[i].emplace_back(0),c[i].emplace_back(0);
for(int i=1,pos;i<=n;i++)
pos=col[i]+(1-i%2)*m,
b[pos].emplace_back(a[i]),
c[pos].emplace_back(i),
nn[pos]++;
for(int i=1;i<=(m<<1);i++){
pre[i].resize(nn[i]+1);
preb[i].resize(nn[i]+1);
prec[i].resize(nn[i]+1);
for(int j=1;j<=nn[i];j++){
preb[i][j]=(preb[i][j-1]+b[i][j])%mod;
prec[i][j]=(prec[i][j-1]+c[i][j])%mod;
pre[i][j]=(pre[i][j-1]+b[i][j]*c[i][j]%mod)%mod;
}
for(int j=2;j<=nn[i];j++){
ans=(ans+b[i][j]*c[i][j]%mod*(j-1)%mod)%mod;
ans=(ans+pre[i][j-1])%mod;
ans=(ans+b[i][j]*prec[i][j-1]%mod)%mod;
ans=(ans+c[i][j]*preb[i][j-1]%mod)%mod;
}
}
cout<<ans<<"\n";
return 0;
}
代码稍稍有些繁琐了,其实前缀和什么的,都可以分组的同时记录,由于只需要用到上一个位置的前缀和,所以第二位可以去掉。可以参考此题解的代码。
题解里也有用纯数学推导的,这里也写一下:
依旧设当前组的元素编号分别是\(a_1,a_2,\dots,a_q\),数字分别是\(b_1,b_2,\dots,b_q\)。这样该组的答案是:
&\sum\limits_{1\le j<i\le n}(a_i+a_j)\times(b_i+b_j)\\
=\ &(a_1+a_2)\times(b_1+b_2)+(a_1+a_3)\times(b_1+b_3)+\dots+(a_2+a_3)\times(b_2+b_3)+\dots+(a_{q-1}+a_q)\times(b_{q-1}+b_q)\\
=\ &a_1\times(b_1+b_2+b_1+b_3+\dots+b_1+b_q)+a_2\times(b_2+b_1+b_2+b_3+\dots+b_2+b_q)+\dots+a_q\times(b_q+b_1+b_q+b_2+\dots+b_q+b_{q-1})\\
=\ &a_1\times((q-2)\times b_1+\sum\limits_{i=1}^{q}b_i)+a_2\times((q-2)\times b_2+\sum\limits_{i=1}^{q}b_i)+\dots+a_q\times((q-2)\times b_q+\sum\limits_{i=1}^{q}b_i)
\end{aligned}\]
于是我们维护每一组的\(\sum\limits_{i=1}^{q}b_i\),一次遍历统计答案即可。
点击查看代码
#include<bits/stdc++.h>
#define N 100010
#define M 100010
#define mod 10007
#define int long long
using namespace std;
int n,m,a[N],col[N],q[M][2],sum[M][2],ans;
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
cin>>col[i];
q[col[i]][i&1]++;
sum[col[i]][i&1]=(sum[col[i]][i&1]+a[i])%mod;
}
for(int i=1;i<=n;i++){
ans=(ans+i%mod*(a[i]*(q[col[i]][i&1]-2)%mod+mod+sum[col[i]][i&1])%mod)%mod;
}
cout<<ans<<"\n";
return 0;
}
[题解]P2671 [NOIP2015 普及组] 求和的更多相关文章
- P2671 [NOIP2015 普及组] 求和
[NOIP2015 普及组] 求和 题目背景 NOIP2015 普及组 T3 题目描述 一条狭长的纸带被均匀划分出了\(n\)个格子,格子编号从\(1\)到\(n\).每个格子上都染了一种颜色\(co ...
- [NOIP2015普及组]求和
题目 题目描述 一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n.每个格子上都染了一种颜色color_i用[1,m]当中的一个整数表示),并且写了一个数字numberi. 定义一种特殊的三元组: ...
- 【题解】NOIP2015提高组 复赛
[题解]NOIP2015提高组 复赛 传送门: 神奇的幻方 \([P2615]\) 信息传递 \([P2661]\) 斗地主 \([P2668]\) 跳石头 \([P2678]\) 子串 \([P26 ...
- NOIP2015普及组总结
NOIP2015普及组总结 这次考试总体感觉不错,不过觉得时间有点紧,在最后30分钟才打完. 第一题(金币coin):大大的W!爆搜O(N),一分钟打完: 第二题(扫雷游戏mine):同上: 第三题( ...
- [NOIP2015 普及组] 扫雷游戏
[NOIP2015 普及组] 扫雷游戏 难度:入门 题目描述 扫雷游戏是一款十分经典的单机小游戏.在nn行mm列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开 ...
- [题解]NOIP2018(普及组)T1标题统计(title)
NOIP2018(普及组)T1标题统计(title) 题解 [代码(AC)] #include <iostream> #include <cstdio> #include &l ...
- 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 ...
随机推荐
- windows系统应急
Windows系统的应急响应主要关注在发生安全事件或攻击后,如何迅速采取措施恢复系统的正常运行并确保数据的安全性.应急响应的目标是减少系统受到攻击的损害.恢复操作以及防止类似事件的再次发生. 应急响应 ...
- Springboot笔记<13>单元测试
单元测试 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库,使用@SpringBootTest注解会以springboot的环境启动 JUnit5常用注解 @Tes ...
- vue.js+vuetify学习开发排坑:一个古怪的代码 v-slot:activator="{ on, attrs }"
由于需要全栈开发一个售票系统项目,时隔一年后重新捡回了我的前端技术~ 开发习惯是边看文档边做,然后再vuetify这个MD设计的UI元件库翻来翻去,再涉及到元件交互的时候有几段代码不是很能理解 < ...
- RT-Thread 4.0.3 适配 UART_V2 版本
RT-Thread 4.0.3 适配 UART_V2 版本 本文为针对发布版4.0.3 进行 UART_V2 驱动的移植适配操作笔记. 由于使用了 libmodbus 软件包,需要 posix_ter ...
- C# .NET ThreadPool 实现概述及
微信公众平台 (qq.com) 在.NET中,ThreadPool(线程池)是一个用于管理和优化线程使用的强大工具.线程池允许开发者在需要时创建线程,执行任务,并在任务完成后回收线程,从而避免了线程的 ...
- SQL Server高级进阶之索引碎片维护
SELECT OBJECT_SCHEMA_NAME(B.OBJECT_ID) 架构,OBJECT_NAME(B.OBJECT_ID) 表名,B.NAME 索引名,ROUND(A.AVG_FRAGMEN ...
- Sql server 游标处理数据
https://blog.csdn.net/sinat_28984567/article/details/79811887 DECLARE @id INT , @name NVARCHAR(50) - ...
- C# 用Linq或Lambda查询DataGridView行中的数据是否包含(各种操作)
http://blog.csdn.net/xht555/article/details/38685845 https://www.cnblogs.com/wuchao/archive/2012/12/ ...
- CF162J Brackets 题解
CF162J Brackets 看到两位用栈匹配括号的大佬,这里提供另一个思路. 对于括号的问题,我们考虑区间DP. 设状态 \(dp[i][j]\) 表示使区间 \([i,j]\) 内的括号匹配需要 ...
- 前端开发系列070-JQuery篇之框架事件处理
JavaScript以事件驱动来实现页面的交互,其核心是以消息为基础,以事件来驱动.虽然利用传统的JavaScript事件处理方式也能够完成页面交互,但jQuery框架增加并扩展了基本的事件处理机制, ...