牛客周赛49 F 嘤嘤不想找最小喵

牛客周赛49 F 嘤嘤不想找最小喵

解题思路:

ai+ai+2k=2ai+k

ai+2kai=2d,ai+k=ai+d

所以,对于ai,...,an2k,有ai+k,...,ank为他们等差数列的下一项。

同理,对于ai,...,an2k,有ai+2k,...,an为他们等差数列的往后第二项。

整个数列可以分成三段,存在关系[ai,...an2k]+[ai+2k,...an]=2×[ai+k,...,ank],其中每一项一一对应。

我们可以将每一项看成是高进制的每一个数位,这样就可以用哈希进行判断了。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using i128 = __int128_t;
using ull = unsigned long long;
typedef pair<int, int> pii;
typedef pair<int, pii> piii;
#define fi first
#define se second
const int N = 1e6 + 10;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int rnd(int l, int r) { return rng() % (r - l + 1) + l; }
const ll P = 13331;
ull h[N];
ull p[N];

void solve()
{
    int n;
    cin >> n;
    vector<ll> a(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    p[0] = 1;
    for (int i = 1; i <= n; i++)
    {
        h[i] = (h[i - 1] * P + a[i]);
        p[i] = p[i - 1] * P;
    }
    auto get = [&](int l, int r)
    {
        return h[r] - h[l - 1] * p[r - l + 1];
    };
    for (int i = 1; i <= n; i++)
    {
        if (get(1, n - 2 * i) + get(2 * i + 1, n) == 2 * get(i + 1, n - i))
        {
            cout << i << '\n';
            return;
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}
posted @   value0  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示