Codeforces Round #562 Good Triple

    xiaoxiao2026-04-07  7

    链接

    https://codeforces.com/contest/1169/problem/D

    题解

    我尝试构造出一个不包含合法的 ( 1 , 1 , 1 ) (1,1,1) (1,1,1)三元组的序列 但是发现这样会使得 1 1 1非常稀疏 那么相对的 0 0 0就会很多 我感觉,是不是说只要某种数字的数量多那么一点点,就会使得很多三元组出现? 对每个位置暴力往前找三元组,可以得到一个最靠后的开头位置 对这个开头位置维护前缀最大值,每个位置的前缀最大值加起来就是答案

    代码

    #include<bits/stdc++.h> #define maxn 300010 #define linf (1ll<<60) #define iinf 0x3f3f3f3f #define eps 1e-8 #define cl(x) memset(x,0,sizeof(x)) #define mod 1000000007ll using namespace std; typedef long long ll; ll read(ll x=0) { int c, f=1; for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f; for(;isdigit(c);c=getchar())x=x*10+c-48; return f*x; } ll a[maxn], N, smin[maxn], bd[maxn]; vector<ll> pos[2]; char s[maxn]; int main() { ll i, N, ans(0); scanf("%s",s+1); N=strlen(s+1); for(i=1;i<=N;i++) { a[i]=s[i]-0x30; } for(i=1;i<=N;i++) { for(auto it=pos[a[i]].rbegin();it!=pos[a[i]].rend();it++) { if(*it-(i-*it)>0 and a[*it-(i-*it)]==a[i]) { bd[i]=*it-(i-*it); break; } } smin[i]=max(smin[i-1],bd[i]); if(smin[i]>0)ans+=smin[i]; pos[a[i]].emplace_back(i); } cout<<ans; return 0; }
    最新回复(0)