题目链接

题解

20pts

$O(n^3)$枚举$x,y,z$,根据题目要求判断

40pts

$O(n^2)$枚举$x,z$,需要满足$x,z$奇偶相同

20~40pts的代码我都没有写过...就不贴了

70~90pts

尝试对40pts的暴力进行优化

题目对三元组的两个限制我们在40pts的时候已经用来优化过了,还有一个限制是颜色相同

我们可以以颜色为关键字对数组进行排序,对每个数算答案的时候,只需要枚举相同颜色的这一段即可(因为三元组要求有序,所以要从$x+2$开始枚举)

这样的复杂度是$O(n*cnt_{col})$(这里的$cnt_{col}$为出现次数最多的颜色的出现次数)

使用$scanf$将会得到70pts

使用快读或$scanf+O2$将会得到80pts

使用快读+$O2$将会得到90pts

($fread$在这里的效果和快读是差不多的,因为数只有$1e5$个)

#include <bits/stdc++.h>

#define ll long long
#define inf 0x3f3f3f3f
#define il inline namespace io { #define in(a) a=read()
#define out(a) write(a)
#define outn(a) out(a),putchar('\n') #define I_int int
inline I_int read() {
I_int x = , f = ; char c = getchar() ;
while( c < '' || c > '' ) { if( c == '-' ) f = - ; c = getchar() ; }
while( c >= '' && c <= '' ) { x = x * + c - '' ; c = getchar() ; }
return x * f ;
}
char F[ ] ;
inline void write( I_int x ) {
I_int tmp = x > ? x : -x ;
if( x < ) putchar( '-' ) ;
int cnt = ;
while( tmp > ) {
F[ cnt ++ ] = tmp % + '' ;
tmp /= ;
}
while( cnt > ) putchar( F[ -- cnt ] ) ;
}
#undef I_int }
using namespace io ; using namespace std ; #define N 100010
const int mod = ; int n = read() , m = read() ;
struct node {
int col , val , id ;
} a[ N ] ; bool cmp( node a , node b ) {
return a.col < b.col ;
} int main() {
for( int i = ; i <= n ; i ++ ) a[ i ].val = read() , a[ i ].id = i ;
for( int i = ; i <= n ; i ++ ) a[ i ].col = read() ;
sort( a + , a + n + , cmp ) ;
int cur = ;
ll ans = ;
for( int i = ; i <= n ; i ++ ) {
ll sum = ;
for( cur = i + ; a[ i ].col == a[ cur ].col && cur <= n ; cur ++ ) {
if( ( a[ i ].id + a[ cur ].id ) % == )
sum = ( sum + ( 1ll * ( a[ i ].id + a[ cur ].id ) % mod * 1ll * ( a[ i ].val + a[ cur ].val ) % mod ) % mod ) % mod ;
}
ans = ( ans + sum ) % mod ;
}
printf( "%lld\n" , ( ans + mod ) % mod ) ;
return ;
}

100pts

考虑使用数学方法优化以上做法

我们现在有什么条件呢,列举一下

1.$x$和$z$的奇偶性相同且颜色相同

2.求和公式为$(x+z)(num_x+num_z)$

从求和公式入手,把括号拆掉,式子变成$x*num_x+x*num_z+z*num_x+z*num_z$

设$x1,x2,x3$的奇偶性相同且颜色相同(那么他们组成的二元组就等同于符合条件的三元组)

考虑$x1$对答案的贡献:

对于$(x1,x2)$,$x1$的贡献为$x1*num_{x1}+x1*num_{x2}$

对于$(x1,x3)$,$x1$的贡献为$x1*num_{x1}+x1*num_{x3}$

那么$x_1$对答案的贡献就是

$x1*(num_{x2}+num_{x3})+2*x1*num_{x1}$

然后多加入一个数$x4$也可以得到类似的贡献(多代几个也就看出来规律了)

推广到$x_n$结论也是一样的

结论:

设$s=\sum num_{xi}$(这里的$xi$均满足条件1)$cnt=cnt_{col}$,$cnt_{col}$为当前颜色奇偶相同的数的个数

则$xi$对答案的贡献为$xi*(s-num_{xi})+(cnt-1)*xi*num_{xi}$($cnt$要$-1$,因为$xi$不能和自己组成二元组)

所以将$s$和$cnt$统计出来就行了,注意要分奇偶统计

复杂度$O(n)$

#include <bits/stdc++.h>

#define ll long long
#define inf 0x3f3f3f3f
#define il inline
#define int long long namespace io { #define in(a) a=read()
#define out(a) write(a)
#define outn(a) out(a),putchar('\n') #define I_int int
inline I_int read() {
I_int x = , f = ; char c = getchar() ;
while( c < '' || c > '' ) { if( c == '-' ) f = - ; c = getchar() ; }
while( c >= '' && c <= '' ) { x = x * + c - '' ; c = getchar() ; }
return x * f ;
}
char F[ ] ;
inline void write( I_int x ) {
if( x == ) { putchar( '' ) ; return ; }
I_int tmp = x > ? x : -x ;
if( x < ) putchar( '-' ) ;
int cnt = ;
while( tmp > ) {
F[ cnt ++ ] = tmp % + '' ;
tmp /= ;
}
while( cnt > ) putchar( F[ -- cnt ] ) ;
}
#undef I_int }
using namespace io ; using namespace std ; #define N 100010
const int mod = ; int n , m ;
struct node {
int col , val ;
} a[ N ] ;
int cnt[ N ][ ] , sum[ N ][ ] ; signed main() {
n = read() , m = read() ;
for( int i = ; i <= n ; i ++ ) a[ i ].val = read() ;
for( int i = ; i <= n ; i ++ ) a[ i ].col = read() ;
for( int i = ; i <= n ; i ++ ) {
cnt[ a[ i ].col ][ i& ] ++ ;
sum[ a[ i ].col ][ i& ] = ( sum[ a[ i ].col ][ i& ] + a[ i ].val ) % mod ;
}
ll ans = ;
for( int i = ; i <= n ; i ++ ) {
ll num = cnt[ a[ i ].col ][ i& ] , s = sum[ a[ i ].col ][ i& ] ;
ans = ( ans + ( i*(s-a[i].val) + (num-)*a[i].val*i ) % mod ) % mod ;
}
printf( "%lld\n" , ans % mod ) ;
return ;
}

Luogu 2671 求和 NOIP2015T3的更多相关文章

  1. luogu 4427 求和

    bjoi 2018 求和 唯一一道可能切的题一个数组还没开long long就成0分了 题目大意: 一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的k次方和,而且每次的k可能是不同的 此处 ...

  2. [洛谷2671]求和<前缀和&模拟>

    题目链接:https://www.luogu.org/problemnew/show/P2671 这是noip2015普及组的第三题,谁说的普及组的题就一定水的不行,这道题就比较有意思的 这道题的暴力 ...

  3. Luogu P1625 求和

    题意 给定两个整数 \(n,m\),求 \[\sum\limits_{i=1}^{n}\frac{1}{\prod\limits_{j=i}^{i+m-1}j} \] \(\texttt{Data R ...

  4. luogu P1630 求和(枚举暴力)

    题意 题解 可以发现当a=10001时, 和1是等价的. 所以这题就水了. #include<iostream> #include<cstring> #include<c ...

  5. [Luogu] 余数求和

    question: $$\sum_{i=1}^{n} k \bmod i$$$$\sum_{i=1}^{n} k - \lfloor \frac{k}{i} \rfloor i$$$$\sum_{i= ...

  6. [Luogu 2261] CQOI2007 余数求和

    [Luogu 2261] CQOI2007 余数求和 这一定是我迄今为止见过最短小精悍的省选题了,核心代码 \(4\) 行,总代码 \(12\) 行,堪比小凯的疑惑啊. 这题一看暴力很好打,然而 \( ...

  7. BZOJ 4555 Luogu P4091 [HEOI2016/TJOI2016]求和 (第二类斯特林数)

    题目链接 (luogu) https://www.luogu.org/problem/P4091 (bzoj) https://www.lydsy.com/JudgeOnline/problem.ph ...

  8. [Luogu P2261] [CQOI2007]余数求和 (取模计算)

    题面 传送门:https://www.luogu.org/problemnew/show/P2261 Solution 这题显然有一个O(n)的直接计算法,60分到手. 接下来我们就可以拿出草稿纸推一 ...

  9. 【Bzoj4555】【Luogu P4091】求和(NTT)

    题面 Bzoj Luogu 题解 先来颓柿子 $$ \sum_{i=0}^n\sum_{j=0}^iS(i,j)2^jj! \\ =\sum_{j=0}^n2^jj!\sum_{i=0}^nS(i,j ...

随机推荐

  1. 使用Spring配置动态数据源实现读写分离

    最近搭建的一个项目需要实现数据源的读写分离,在这里将代码进行分享,以供参考.关键词:DataSource .AbstractRoutingDataSource.AOP 首先是配置数据源 <!-- ...

  2. sdut2613(This is an A+B Problem)大数加法(乘法)

    #include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>u ...

  3. PAT 1032 Sharing[hash][链表][一般上]

    1032 Sharing (25)(25 分) To store English words, one method is to use linked lists and store a word l ...

  4. rsync 常用命令

    rsync -auvrtzopgP --progress --delete --exclude-from=exclude.list SRC DST \\保留原文件属性并详细输出 删除那些DST中SRC ...

  5. 批量导入数据到mssql数据库的

    概述 批量导入数据到数据库中,我们有好几种方式. 从一个数据表里生成数据脚本,到另一个数据库里执行脚本 从EXCEL里导入数据 上面两种方式,导入的数据都会生成大量的日志.如果批量导入5W条数据到数据 ...

  6. GET 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.2/gradle-3

    Could not GET 'https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/3.1.2/gradle-3 ...

  7. C语言头文件、库文件的查找路径

    在 程序设计中,文件包含是很有用的.一个大的程序可以分为多个模块,由多个程序员分别编程.有些公用的符号常量或宏定义等可单独组成一个文件,在其它文件的开头用包含命令包含该文件即可使用.这样,可避免在每个 ...

  8. Twitter OA prepare: Equilibrium index of an array

    Equilibrium index of an array is an index such that the sum of elements at lower indexes is equal to ...

  9. LeetCode7.反转整数

    给定一个 32 位有符号整数,将整数中的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: -123 输出: -321 示例 3: 输入: 120 输出: 21 注意: 假 ...

  10. uva1201 DAG 最小路径覆盖,转化为 二分图

    大白例题P356 你在一座城市里负责一个大型活动的接待工作.你需要去送m个人从出发地到目的地,已知每个人的出发时间出发地点,和目的地点,你的任务是用尽量少的出租车送他们,使得每次出租车接客人,至少能提 ...