社区讨论

求调CF1418G

学术版参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mi9lwmp8
此快照首次捕获于
2025/11/22 09:24
3 个月前
此快照最后确认于
2025/11/22 11:05
3 个月前
查看原帖
WA on 38
迫使我改得和题解差不多一样了还是过不去。
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mpr make_pair
#define ld double
#define sdn cout
#define vi vector<int>
#define ull unsigned long long
#define fi first
#define se second
#define pii pair<int,int>
mt19937 rnd(time(0));

const int N = 5e5 + 10,M = 1e6 + 10,INF1 = 1e9 + 7;
const ll INF2 = 1e18 + 7,MOD = 998244353;
const ull base = 131;

ll n,m,k,q,T,rt,a[N],cnt[N];
ll ans,rd[N];
__int128 h[N];
map<__int128,ll> mp;
int main(){
    ios::sync_with_stdio(0),cin.tie(0);
    cin>>n;
    for(int i = 1;i <= n;i ++)  rd[i] = rnd()%INF2+1;
    for(int i = 1;i <= n;i ++){
        cin>>a[i];h[i] = h[i-1];
        h[i] -= cnt[a[i]]*rd[a[i]];
        cnt[a[i]] = (cnt[a[i]]+1)%3;
        h[i] += cnt[a[i]]*rd[a[i]];
    }
    int l = 0;
    mp[0] = 1;
    for(int i = 0;i <= n;i ++)  cnt[i] = 0;
    for(int r = 1;r <= n;r ++){
        cnt[a[r]] ++;
        while(cnt[a[r]] > 3){
            cnt[a[l]] --;
            if(l)  mp[h[l-1]] --;
            l ++;
        }
        ans += mp[h[r]];
        mp[h[r]] ++; 
    }
    sdn<<ans<<endl;
    return 0;
}
实在想不出哪的问题

回复

0 条回复,欢迎继续交流。

正在加载回复...