0720

Done IOI Start at: 2024-7-20 14:00 3.5 hour(s) Host: 26
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5+5;
map<int,int>mp;
int a[N],sum[N],n,m,x,limit[N],id[N];
int tree[N];
struct node{
    int sum,r;
}p[N];
int lobit(int x){
    return x&-x;
}
void update(int x)
{
    x+=2;
    for(int i=x;i<=n+2;i+=lobit(i)){
        tree[i]++;
    }
}
int query(int x)
{
    x++;
    int sum = 0;
    for(int i=x;i>=1;i-=lobit(i)){
        sum+=tree[i];
    }
    return sum;
}
bool cmp(node a,node b){
    return a.sum<b.sum;
}
signed main()
{
    //freopen("1.in","r",stdin);
    int tmp = 0;
    cin>>n>>m>>x;
    int cnt = 0;
    int pos = 1;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(a[i]>=x)tmp++;
        sum[i] = sum[i-1]+a[i];
        p[i] = {sum[i],i};
        if(mp.count(a[i])==0 || mp[a[i]]==0){
            cnt++;
            mp[a[i]] = 1;
        }
        else mp[a[i]]++;
        while(cnt>m){
            mp[a[pos]]--;
            if(mp[a[pos]]==0){
                cnt--;
            }
            pos++;
        }
        limit[i] = pos;
    }
    sort(p,p+n+1,cmp);
    int l=0,ans=0;
    for(int i=0;i<=n;i++){
        while(l<=n && p[i].sum-p[l].sum>=x)update(p[l].r),l++;

        if(p[i].r)ans+=query(p[i].r)-query(limit[p[i].r]-1);
    }
    cout<<ans*2-tmp<<endl;
    return 0;
}
Status
Done
Rule
IOI
Problem
4
Start at
2024-7-20 14:00
End at
2024-7-20 17:30
Duration
3.5 hour(s)
Host
Partic.
26