首页 > 其他分享 >P2671 [NOIP2015 普及组] 求和 题解

P2671 [NOIP2015 普及组] 求和 题解

时间:2024-07-25 15:18:03浏览次数:15  
标签:P2671 NOIP2015 ch limits 题解 sum times num col

题目:P2671 NOIP2015 普及组 求和

题意

给定一个带有颜色和数字的序列,我们要寻找三元组 \((x,y,z)\) 满足以下条件:

  1. \(y\) 为 \(x\) 和 \(z\) 的中点且都为整数。
  2. \(color[x]=color[z]\)。

我们命这样一个三元组对答案的贡献为 \((x+z)*(num[x]+num[z])\)。整个序列的总价值为每个符合要求的三元组的贡献和。现求出这个贡献和,并对 \(10007\) 取余。

思路

显然的结论是:\(x\) 与 \(z\) 同奇同偶

若当前到了一个点 \(i\),那么设其前面有一个数 \(k\) 满足上述条件。

则贡献表示为:

\[\sum\limits_{k}(i+k)\times (num[i]+num[k]) \\ \sum\limits_{k}(i\times num[i]+k\times num[i]+i\times num[k]+k\times num[k]) \\ inum[i]\times\#k+num[i]\sum\limits_kk+i\sum\limits_k num[k]+\sum\limits_k k\times num[k] \]

其中,\(inum[i]\times \#k\) 指当前元素的位置与数字的乘积乘上满足条件的 \(k\) 的个数。

\(\sum\limits_k k\) 指满足条件的 \(k\) 的乘积。

\(\sum\limits_k num[k]\) 指满足条件的 \(k\) 的数字乘积。

\(\sum\limits_k knum[k]\) 指满足条件的 \(k\) 的位置与数组的乘积。

用一个 \(4\) 维数组来对以上数据进行前缀和处理。同时前缀和需要奇偶相同。则要对整个数组开 \(2\) 维。

我们设一个数组 \(sum[q][col][op]\),\(q\) 指第几类前缀和,\(col\) 指颜色,\(op\) 指奇偶性。

现在前缀和转移易得如下:

			sum[0][col[i]][i&1]=sum[0][col[i]][i&1]+(i*num[i])
			sum[1][col[i]][i&1]=sum[1][col[i]][i&1]+num[i]
			sum[2][col[i]][i&1]=sum[2][col[i]][i&1]+1
			sum[3][col[i]][i&1]=sum[3][col[i]][i&1]+i

当前位置 \(k\) 的贡献为:

sum[0][col[i]][i&1]+i*sum[1][col[i]][i&1]+i*x*sum[2][col[i]][i&1]+x*sum[3][col[i]][i&1]

累加计数即可

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
template<typename P>
inline void read(P &x){
   	P res=0,f=1;
   	char ch=getchar();
   	while(ch<'0' || ch>'9'){
   		if(ch=='-') f=-1;
   		ch=getchar();
   	}
   	while(ch>='0' && ch<='9'){
   		res=res*10+ch-'0';
   		ch=getchar();
	}
	x=res*f;
}
using namespace std;
int T=1;
const int mod=10007;
int n,m;
int num[100010];
int col[100010];
int sum[4][100010][2];
signed main(){
    read(n),read(m);
    for(int i=1;i<=n;++i) read(num[i]);
    for(int i=1;i<=n;++i) read(col[i]);
    int ans=0;
    for(int i=1;i<=n;++i){
        int cx=col[i],x=num[i];
        ans=(ans%mod+sum[0][col[i]][i&1]%mod+i*sum[1][col[i]][i&1]%mod+i*x*sum[2][col[i]][i&1]%mod+x*sum[3][col[i]][i&1]%mod+mod)%mod; 
        sum[0][col[i]][i&1]=(sum[0][col[i]][i&1]%mod+(i*num[i])%mod+mod)%mod;
        sum[1][col[i]][i&1]=(sum[1][col[i]][i&1]%mod+num[i]%mod+mod)%mod;
        sum[2][col[i]][i&1]=(sum[2][col[i]][i&1]%mod+1+mod)%mod;
        sum[3][col[i]][i&1]=(sum[3][col[i]][i&1]%mod+i+mod)%mod;
    }
    cout<<ans%mod<<endl;
	return 0;
}

标签:P2671,NOIP2015,ch,limits,题解,sum,times,num,col
From: https://www.cnblogs.com/lizihan00787/p/18323224

相关文章

  • Temperature 题解
    前言题目链接:洛谷;SPOJ;Hydro&bzoj。题意简述有一个长度为\(n\)的序列,每个位置值的范围为\([L_i,R_i]\)内,求原序列可能的最长不降子串长度。题目分析尝试找一些性质。发现,连续一段合法的区间,都能分成若干真正参与最长不降子串,以及紧跟着的若干包含\(L_i\)的位置。下图......
  • [ABC318E]Sandwiches 题解
    题意给定一个序列\(A\),要求找有多少个三元组\((i,j,k)\)满足以下条件:\(1\lei<j<k\leN\)\(A_i=A_k\)\(A_i\neA_j\)思路相当于是找每两个相同的元素中有多少个不同的数字。例如:12131答案显然是4,即是\((1,2,3)(1,2,5)(1,4,5)(3,4,5)\)。用\(q[A[i]]\)......
  • [题解]CF117C Cycle
    思路发现最简单的方法就是直接枚举三个点,但是复杂度\(\Theta(n^3)\)无法接受。考虑枚举一个点,并确定它的一条边,那么只需要再枚举一个点了。于是转化为了,对于每一个点找到其最好的出边。观察下图,\(a\toc\)的边是不必要的。因为,如果有一个三元环包含\(a\toc\),那么一定能......
  • P3294 [SCOI2016] 背单词 题解
    题意给你\(n\)个字符串,让你对其进行排列,使得按以下规则花费最少:设当前字符串为\(s\),\(x\)为\(s\)在答案排列中的位置。如果\(s\)存在后缀且\(s\)的后缀在\(s\)之后,花费加\(n^2\)。如果\(s\)不存在后缀则花费加\(x\)。设\(y\)为\(s\)之前离其最近的......
  • P10717 题解
    好神仙的题目。赛时胡了一个状态和转移都和官解不同的做法,得到了\(O(n10^m)\)的优秀复杂度。卡了一场常卡进了\(75\)分。这个做法和官解关系不大,并且很难进行最后的优化部分,所以在此不再赘述。首先考虑\(k=1\)的情况。考虑记录一些状态能够描述子树内的选择方案,\(0\)表示......
  • 题解:Codeforces Round 961 (Div. 2) A
    A.Diagonals*timelimitpertest:1secondmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputVitaly503isgivenacheckeredboardwithasideof\(n\)and\(k\)chips.Herealizedthatallthese\(k\)chipsneedto......
  • [题解]CF958C3 Encryption (hard)
    思路先考虑\(\Theta(n^2k)\)的暴力DP。定义\(dp_{i,j}\)表示在前\(i\)个数中选取\(j\)个的最小和,转移显然:\[dp_{i,j}=\min_{1\leqk<i}\{dp_{k,j-1}+s_{k+1,i}\bmodp\}\]注意到一个性质:\(dp_{i,j}\equivs_i\pmodp\)。因为前者是前\(i\)项分为若干......
  • Java二叉树经典进阶OJ题解
     目录一、判断一颗二叉树是否为对称二叉树1.题目描述:2.代码示例:3.通过演示与分析:二、根据先序遍历结果构造二叉树1.题目描述:2.代码示例:3.通过演示与分析:三、层序遍历的非递归实现1.题目描述:2.代码示例:3.通过演示与分析:四、判断是否为完全二叉树1.题目描述:2.......
  • dify-on-wechat 数据乱串问题解决记录
    在检查dify-on-wechat应用中的数据乱串问题时,我们发现了一个关键因素:当前端和后端使用的大语言模型不一致时,会导致数据串扰问题。在深入调查和测试后,我们采取了将前后端的大语言模型改为一致的策略。在实施这一改变后,数据乱串的问题得到了有效解决。以下是详细的记录:问题现象:在dif......
  • 密码学-RSA基础题解题脚本-Python
    importgmpy2#计算大整数模块importlibnumimportrsafromCrypto.PublicKeyimportRSA#安装时安装pycryptodome模块#已知:p,q,e,cdefknown_p_q_e_c():p=int(input('请输入一个素数p:'))q=int(input('请输入另一个素数q:'))e=int(input('请输入公钥e:'))......