1 条题解

  • 0
    @ 2026-6-14 11:13:15

    没见过比这还短的绿……

    思路

    一个数可以造成多少贡献?首先对于一个f(l,r)f(l,r),我们只统计其中每一个数第一次出现。举个例子:对于1,2,3,5,3,2,41,2,3,5,3,2,4这样的数列,我们只统计第1,2,3,4,71,2,3,4,7位,也就是1,2,3,4,51,2,3,4,5第一次出现。
    这样一来,一个数的贡献就是它距离这一个数上一次出现的位置的值乘上它向右的距离,一个数最后一次出现我们用一个map记录,因此一个数的贡献就是$$(i-m[x])*(n-i+1)$$
    这样我们就可以写出来巨短无比的代码

    AC代码

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    map<int,int>m;
    signed main()
    {
    	int n;scanf("%lld",&n);
    	int ans=0;
    	for(int i=1,x;i<=n;i++)
    	{
    		scanf("%d",&x);
    		ans+=(i-m[x])*(n-i+1);
    		m[x]=i;
    	}
    	printf("%lld\n",ans);
    	return 0;
    }
    
    • 1

    信息

    ID
    7954
    时间
    2000ms
    内存
    1024MiB
    难度
    9
    标签
    递交数
    13
    已通过
    5
    上传者