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:

  1. #include <cstdio>
  2. #include <algorithm>
  3. #define ll long long
  4. const ll N=50010;
  5. const ll mod=10007;
  6. ll n,m,cnta,cntb,fa[21],fb[21];
  7. struct node
  8. {
  9. ll color,num,pos;
  10. bool friend operator <(node n1,node n2)
  11. {
  12. return n1.color<n2.color;
  13. }
  14. }a[N],b[N];
  15. int main()
  16. {
  17. scanf("%d%d",&n,&m);
  18. ll num,color,ans=0;
  19. for(ll i=1;i<=n;i++)
  20. {
  21. scanf("%d",&num);
  22. if(i&1) a[++cnta].num=num%mod,a[cnta].pos=i%mod;
  23. else b[++cntb].num=num%mod,b[cntb].pos=i%mod;
  24. }
  25. for(ll i=1;i<=n;i++)
  26. {
  27. scanf("%d",&color);
  28. if(i&1) a[i+1>>1].color=color;
  29. else b[i+1>>1].color=color;
  30. }
  31. std::sort(a+1,a+1+cnta);
  32. std::sort(b+1,b+1+cntb);
  33. for(ll i=1;i<=cnta;)
  34. {
  35. color=a[i].color;
  36. ll tmp=i,cnt=0;
  37. while(a[i].color==color)
  38. {
  39. cnt++;
  40. fa[cnt]=(a[i].pos+fa[cnt-1])%mod;
  41. fb[cnt]=(a[i].num+fb[cnt-1])%mod;
  42. i++;
  43. }
  44. for(ll j=1;j<=cnt;j++)
  45. {
  46. ll t=j+tmp-1;
  47. ans=(ans+(cnt-1)*a[t].pos%mod*a[t].num%mod
  48. +((fb[cnt]-fb[j])%mod*a[t].pos
  49. +(fa[cnt]-fa[j])%mod*a[t].num)%mod)%mod;
  50. }
  51. }
  52. for(ll i=1;i<=cntb;)
  53. {
  54. color=b[i].color;
  55. ll tmp=i,cnt=0;
  56. while(b[i].color==color)
  57. {
  58. cnt++;
  59. fa[cnt]=(b[i].pos+fa[cnt-1])%mod;
  60. fb[cnt]=(b[i].num+fb[cnt-1])%mod;
  61. i++;
  62. }
  63. for(ll j=1;j<=cnt;j++)
  64. {
  65. ll t=j+tmp-1;
  66. ans=(ans+(cnt-1)*b[t].pos%mod*b[t].num%mod
  67. +((fb[cnt]-fb[j])*b[t].pos%mod
  68. +(fa[cnt]-fa[j])*b[t].num%mod)%mod)%mod;
  69. }
  70. }
  71. printf("%d\n",ans);
  72. return 0;
  73. }

洛谷 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. CentOS 建立本地yum源服务器

    安装CentOS系统,配置系统的网络环境 配置静态IP vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet O ...

  2. go语言之行--简介与环境搭建

    一.Go简介 Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后 ...

  3. 【转】基于Ubuntu Server16.04 安装Odoo11

    使用 非 root 用户 进行下面的测试: 本文使用 有sudo 权限的 odoo 用户进行测试()如果是 阿里云,可以先创建 odoo 用户 sudo adduser odoo 2:给root 权限 ...

  4. C++ 对引用的深入理解

    观看了唐老师讲解的一节<第5课 - 引用的本质分析>感觉非常不错,有深度不废话,我喜欢--- 再此总结下,并且奉上视频下载地址--- 360网盘下载地址: https://yunpan.c ...

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

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

  6. 委托、多播委托(MulticastDelegate)

    委托.多播委托(MulticastDelegate) 多播委托(MulticastDelegate)继承自 Delegate ,表示多路广播委托:即,其调用列表中可以拥有多个元素的委托.实际上,我们自 ...

  7. 安装loadrunner11出现Microsoft Visual c++2005 sp1安装失败

    本文转至别处,网上大神多

  8. SVN基础操作

    SVN基础操作 安装 #大多数Linux版本自带svn svn --version #如果没有安装可用yum安装 yum install subversion 生命周期 创建版本库 检出 更新 执行变 ...

  9. unity中camera摄像头控制详解

    目录 1. 缘起 2. 开发 2.1. 建立项目 2.2. 旋转 2.2.1. 四元数 2.3. 移动 2.3.1. 向量操作 2.4. 镜头拉伸 2.5. 复位 2.6. 优化 1 缘起 我们的产品 ...

  10. dubbo底层之Netty

    背景 Java线程:由开始的单线程,到通过new Thread()创建的多线程,再到现如今的线程池,Java多线程编程的效率和性能有了很大的提升 Reactor模型:基于事件驱动,适合处理海量I/O事 ...