第五届上海市青少年算法竞赛 T4 夹心饼干(思维、数学)

文章讨论了如何解决一个数学问题,即在一个给定的数列中找出满足特定条件(下标递增且连续数字不相等)的三个数之间的“夹心饼干”数量。通过构建和操作向量,计算相同数值之间的区间差减去重叠相同数的数量来得到答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第四题:T4夹心饼干

标签:思维、数学
题意:给定一个数列 a 1 , a 2 , a 3 . . . , a n a_1,a_2,a_3...,a_n a1,a2,a3...,an,请求出在这个序列中,能挑出多少个三个数 a i , a j , a k a_i,a_j,a_k ai,aj,ak,满足 i < j < k i<j<k i<j<k a i = a k a_i=a_k ai=ak a i ≠ a j a_i \neq a_j ai=aj ( 1 ≤ n ≤ 300 , 000 , 0 ≤ a i < n ) (1≤n≤300,000,0≤a_i<n) (1n300,000,0ai<n)
题解:观察题目中给的样例: 1   2   1   2   1 1\ 2\ 1\ 2\ 1 1 2 1 2 1,第 1 1 1个位置的 1 1 1和第 3 3 3个位置的 1 1 1中间夹了一个 2 2 2
1 1 1个位置的 1 1 1和第 5 5 5个位置的 1 1 1之间夹了两个 2 2 2;第 2 2 2个位置的 2 2 2和第 4 4 4个位置的 2 2 2之间夹了 1 1 1 1 1 1;第 3 3 3个位置的 1 1 1和第 5 5 5个位置的 1 1 1中间夹了一个 2 2 2
可以把所有相同的数的下标按顺序放到对应的 v e c t o r vector vector里面。
那么任意一对相同的数之间能够夹的数的个数就等于,两个数的下标之差 - 两个数中间包含的相同数个数。
比如 1 1 1维护的 v e c t o r vector vector 1   3   5 1\ 3 \ 5 1 3 5
原序列的下标 1 1 1和下标 5 5 5之间能夹的数的个数就等于 5 − 1 − ( 3 − 1 ) = 2 5-1-(3-1)=2 51(31)=2
注意题目中的细节, a i a_i ai可能等于 0 0 0
代码

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll N = 3e5 + 10;
ll n, x, mx = 0, ans = 0;
vector<ll> a[N];

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> x;
        mx = max(mx, x);
        a[x].push_back(i);
    }
    for (int k = 0; k <= mx; k++) {
        for (int i = 0; i < a[k].size(); i++) {
            for (int j = i + 1; j < a[k].size(); j++) {
                // 两个相同的数下标距离差-两个中间包含的相同数个数
                ans += (a[k][j] - a[k][i] - (j - i));
            }
        }
    }
    cout << ans << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值