首页 > 其他分享 >[ABC318E]Sandwiches 题解

[ABC318E]Sandwiches 题解

时间:2024-07-25 14:55:39浏览次数:7  
标签:ABC318E ch 下标 题解 apper gx Sandwiches

题意

给定一个序列 \(A\),要求找有多少个三元组 \((i,j,k)\) 满足以下条件:

  • \(1\le i < j< k \le N\)
  • \(A_i=A_k\)
  • \(A_i \ne A_j\)

思路

相当于是找每两个相同的元素中有多少个不同的数字。

例如:

1 2 1 3 1

答案显然是 4,即是\((1,2,3)(1,2,5)(1,4,5)(3,4,5)\)。

用 \(q[A[i]]\) 表示在 \(i\) 这个下标之前的数中最后出现与 \(A_i\) 相同的数的下标。

那么像上例的 \((1,2,3)\) 的贡献即是 \(i-q[A[i]]-1\)。

但是显然不可能这么简单,可以发现每扫到一个数,前面的数也有相应的贡献。

不妨用 \(gx[i]\) 表示第 \(i\) 个数的贡献。

再设 \(apper[A[i]]\) 为到 \(i\) 这个下标时前面的数中出现了多少次 \(A_i\)。

推一下式子,很容易得到:

\[gx[i]=(i-q[A[i]]-1)*apper[A[i]]+gx[q[a[i]] \]

最后扫一遍加入答案即可.

代码

#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
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;
}
int n;
int a[300010];
int gx[300010];
map<int,int> q;
map<int,int> apper;
signed main(){
	read(n);
	for(int i=1;i<=n;++i){
		read(a[i]);
	}
	for(int i=1;i<=n;++i){
		if(q[a[i]]==0){
			q[a[i]]=i;
			apper[a[i]]++;
			continue;
		}
		int now=i;
		int las=q[a[i]];
		gx[i]=(now-las-1)*apper[a[i]]+gx[las];
		apper[a[i]]++;
		q[a[i]]=i;
	}
	int ans=0;
	for(int i=1;i<=n;++i) ans+=gx[i];
	cout<<ans<<endl;
	return 0;
}


标签:ABC318E,ch,下标,题解,apper,gx,Sandwiches
From: https://www.cnblogs.com/lizihan00787/p/18323087

相关文章

  • [题解]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:'))......
  • [题解]P9755 [CSP-S 2023] 种树
    P9755[CSP-S2023]种树迟来的补题本题是让最小化所有树长到指定高度日期的最大值,于是想到二分答案。那么,对于一个给定的期限\(x\),如何判断是否能在这个日期内完成任务呢?首先我们发现前\(n\)天每天都要种树,那么假设我们已经知道了每个地块最晚哪个日期种树,能保证在期限\(x\)......
  • codeforces div_2 961 题解报告
    codeforcesdiv_2961题解报告比赛链接:https://codeforces.com/contest/1995A.Diagonals题目翻译给定一个边长为\(n\)的正方形,给定\(k\),要往正方形选\(k\)个点,\(x+y\)相同的点构成对角线,问至少要几条对角线才能装下\(k\)个点。时限1s,空间限制256MB\(1\len\le100,0\l......