P2671 求和

题目描述

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

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

\(xyz\)是整数, \(x<y<z,y-x=z-y\)

\(color_x=color_z\)

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

输入输出格式

输入格式:

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

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

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

输出格式:

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

说明

纸带如题目描述中的图所示。

所有满足条件的三元组为: (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


这题教会了我$ \sum $的化简。

我们发现,奇偶位相同时颜色相同的都可以产生贡献,在一个奇偶性的某一个同样颜色的块的答案为

\(\sum_{i=1}^n \sum_{j=i+1}^n (x_i+x_j)*(y_i+y_j)\) \(x_i\)为数字,\(y_i\)为位置。

需要\(O(n)\)复杂度算出它

化简前,先补充一下$\sum $的有关知识

  1. 优先级比四则运算符低
  2. \(\sum_{i=1}^n a_i+b_i \Leftrightarrow \sum_{i=1}^n a_i+\sum_{i=1}^n b_i\)
  3. \(\sum_{i=1}^n r*a_i \Leftrightarrow r*\sum_{i=1}^n a_i\)
  4. \(\sum_{i=1}^n \sum_{j=1}^n a_{ij} \Leftrightarrow \sum_{j=1}^n \sum_{i=1}^n a_{ij}\)



\(\sum_{i=1}^n \sum_{j=i+1}^n (x_i+x_j)*(y_i+y_j)\)

\(=\sum_{i=1}^n \sum_{j=i+1}^n x_i*y_i+x_i*y_j+x_j*y_i+x_j*y_j\)

\(=\sum_{i=1}^n \sum_{j=i+1}^n x_i*y_i+\sum_{i=1}^n \sum_{j=i+1}^n x_j*y_j+\sum_{i=1}^n \sum_{j=i+1}^n x_j*y_i+\sum_{i=1}^n \sum_{j=i+1}^n x_i*y_j\)

\(=\sum_{i=1}^n (n-i)*x_i*y_i+\sum_{i=1}^n (i-1)*x_i*y_i+\sum_{i=1}^n y_i \sum_{j=i+1}^n x_j+\sum_{i=1}^n x_i \sum_{j=i+1}^n y_j\)

\(=(n-1)\sum_{i=1}^n x_i*y_i+\sum_{i=1}^n y_i \sum_{j=i+1}^n x_j+\sum_{i=1}^n x_i \sum_{j=i+1}^n y_j\)

先处理出前缀和维护即可


Code:

#include <cstdio>
#include <algorithm>
#define ll long long
const ll N=50010;
const ll mod=10007;
ll n,m,cnta,cntb,fa[21],fb[21];
struct node
{
ll color,num,pos;
bool friend operator <(node n1,node n2)
{
return n1.color<n2.color;
}
}a[N],b[N];
int main()
{
scanf("%d%d",&n,&m);
ll num,color,ans=0;
for(ll i=1;i<=n;i++)
{
scanf("%d",&num);
if(i&1) a[++cnta].num=num%mod,a[cnta].pos=i%mod;
else b[++cntb].num=num%mod,b[cntb].pos=i%mod;
}
for(ll i=1;i<=n;i++)
{
scanf("%d",&color);
if(i&1) a[i+1>>1].color=color;
else b[i+1>>1].color=color;
}
std::sort(a+1,a+1+cnta);
std::sort(b+1,b+1+cntb);
for(ll i=1;i<=cnta;)
{
color=a[i].color;
ll tmp=i,cnt=0;
while(a[i].color==color)
{
cnt++;
fa[cnt]=(a[i].pos+fa[cnt-1])%mod;
fb[cnt]=(a[i].num+fb[cnt-1])%mod;
i++;
}
for(ll j=1;j<=cnt;j++)
{
ll t=j+tmp-1;
ans=(ans+(cnt-1)*a[t].pos%mod*a[t].num%mod
+((fb[cnt]-fb[j])%mod*a[t].pos
+(fa[cnt]-fa[j])%mod*a[t].num)%mod)%mod;
}
}
for(ll i=1;i<=cntb;)
{
color=b[i].color;
ll tmp=i,cnt=0;
while(b[i].color==color)
{
cnt++;
fa[cnt]=(b[i].pos+fa[cnt-1])%mod;
fb[cnt]=(b[i].num+fb[cnt-1])%mod;
i++;
}
for(ll j=1;j<=cnt;j++)
{
ll t=j+tmp-1;
ans=(ans+(cnt-1)*b[t].pos%mod*b[t].num%mod
+((fb[cnt]-fb[j])*b[t].pos%mod
+(fa[cnt]-fa[j])*b[t].num%mod)%mod)%mod;
}
}
printf("%d\n",ans);
return 0;
}

洛谷 P2671 求和 解题报告的更多相关文章

  1. 洛谷 P2058 海港 解题报告

    P2058 海港 题目描述 小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况: ...

  2. 洛谷 P3956 棋盘 解题报告

    P3956 棋盘 题目描述 有一个\(m×m\)的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的(不能 ...

  3. 洛谷 P1979 华容道 解题报告

    P1979 华容道 题目描述 小\(B\)最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时 ...

  4. BZOJ 3545 / 洛谷 P4197 Peaks 解题报告

    P4197 Peaks 题目描述 在\(\text{Bytemountains}\)有\(N\)座山峰,每座山峰有他的高度\(h_i\).有些山峰之间有双向道路相连,共\(M\)条路径,每条路径有一个 ...

  5. 虔诚的墓主人(BZOJ1227)(洛谷P2154)解题报告

    题目描述 小W是一片新造公墓的管理人.公墓可以看成一块N×M的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. 当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地. ...

  6. 洛谷P2671 求和 [数论]

    题目传送门 求和 格式难调,题面就不放了. 分析: $ZYYS$的一道题. 很显然是大力推公式.我们分析一下题目,实际上限制条件就是:下标同奇偶且颜色相同的数,那么我们先拿这个公式$(x+z)*(nu ...

  7. 洛谷 P2672 推销员 解题报告

    P2672 推销员 题目描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第i家住户到入口的距离为 ...

  8. 洛谷 P2679 子串 解题报告

    P2679 子串 题目描述 有两个仅包含小写英文字母的字符串\(A\)和\(B\). 现在要从字符串\(A\)中取出\(k\)个互不重叠的非空子串,然后把这\(k\)个子串按照其在字符串\(A\)中出 ...

  9. 洛谷 P1076 寻宝 解题报告

    P1076 寻宝 题目描述 传说很遥远的藏宝楼顶层藏着诱人的宝藏.小明历尽千辛万苦终于找到传说中的这个藏宝楼,藏宝楼的门口竖着一个木板,上面写有几个大字:寻宝说明书.说明书的内容如下: 藏宝楼共有\( ...

随机推荐

  1. TF-IDF算法-golang实现

    1.TF-IDF算法介绍 TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)是一种用于信息检索(information retrie ...

  2. R语言入门 :基本数据结构

    1.向量 向量是R语言中最基本的数据类型,在R语言中没有单独的变量. (1)  创建向量 R语言中可以用 = 或者 <- 来赋值. 向量名 <- 向量 或  向量名 = 向量 向量的创建方 ...

  3. 20155213免考项目——bof进阶及简易的HIDAttack

    20155213免考项目--bof进阶及简易的HIDAttack 目录 序 任务一:构造Shellcode(64位) 任务二:64位Shellcode的注入 任务三:32位及64位bof攻击(开启堆栈 ...

  4. Python基础(list和tuple)可变集合和‘不可变’集合

    list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> ...

  5. Android开发——高斯模糊效果的简单实现

    0. 前言 在Android开发中,经常在音乐软件中看到高斯模糊效果. 在找遍了所有高斯模糊的算法代码后,发现stackblur的Java实现是最快的.效果如下所示. 1.  高斯模糊效果实现 Bit ...

  6. python基础学习1-流程控制和判断

    python for循环和 if流程控制用法 Ages=22 for i in range(10): inputAges = int(input("输入年龄")) if input ...

  7. Ms.office2010安装教程

    下面用到的软件下载地址如下:http://pan.baidu.com/s/1c08cxPI 第一步 1. 将压缩包office2010.rar解压解压后,会出现一个office2010文件夹如图1.1 ...

  8. P4385 [COCI2009]Dvapravca

    首先特判掉蓝点数量\(<2\)的情况.没有蓝点答案就是\(n\),有一个蓝点可以枚举一个红点,选择过这个蓝点和红点的一条线和在无穷远处的平行线(即这条线对应的两个半平面). 这里认为过一个点是与 ...

  9. Unity EasyTouch官方案例学习

    一.代码检测手势事件 1. EasyTouch4.x 写法 首先要手动在 Hierarchy 窗口添加 EasyTouch 物体,以触摸(Touch)手势为例,代码如下: using UnityEng ...

  10. it喜爱的歌词

    1.曼丽 我们的过去我们的情义怎么能忘记  #曼丽你怎么这样忍心静静的就离去 #我很伤心从今以后不能够见到你 #只有留下你往日的情景使我常回忆 #一样的青山一样的绿水只有我和你 #曼丽可记得我们时常快 ...