Pagini recente » Cod sursa (job #1915470) | Cod sursa (job #2513841) | Borderou de evaluare (job #2927845) | Cod sursa (job #2044870) | Cod sursa (job #211562)
Cod sursa(job #211562)
#include<stdio.h>
#include<algorithm>
#define ran 1<<20
using namespace std;
int n,l,u,m;
unsigned int a[ran],b[ran];
int c[ran];
int d[ran],e[ran];
int numd,nume;
long long ans;
char s[(1<<20)*11+99];
int main()
{
int i,x,y,w;
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
fread(s,sizeof(char),(1<<20)*11+99,stdin);
for(w=0; !(s[w]>='0' && s[w]<='9'); w++);
for(n=0; s[w]>='0' && s[w]<='9'; n=n*10+s[w++]-'0');
for(; !(s[w]>='0' && s[w]<='9'); w++);
for(l=0; s[w]>='0' && s[w]<='9'; l=l*10+s[w++]-'0');
for(; !(s[w]>='0' && s[w]<='9'); w++);
for(u=0; s[w]>='0' && s[w]<='9'; u=u*10+s[w++]-'0');
// scanf("%d%d%d",&n,&l,&u);
for(i=0; i<n; i++)
{
for(; !(s[w]>='0' && s[w]<='9'); w++);
for(a[i]=0; s[w]>='0' && s[w]<='9'; a[i]=a[i]*10+s[w++]-'0');
// scanf("%u",&a[i]);
b[i]=a[i];
}
sort(b,b+n);
for(i=0; i<n; i++)
if(i==0 || b[i]!=b[i-1])
b[m++]=b[i];
if(l>m){puts("0");return 0;}
if(u>m)u=m;
for(i=0; i<n; i++)
{
x=0,y=n-1;
while(1)
{
c[i]=(x+y)/2;
if(a[i]==b[c[i]])
break;
else
if(a[i]<b[c[i]])
y=c[i]-1;
else
x=c[i]+1;
}
}
ans=0;
numd=0;
for(x=0;;x++)
{
if(d[c[x]]==0)numd++;
d[c[x]]++;
if(numd==l)break;
}
nume=0;
for(y=0; y<n; y++)
{
if(e[c[y]]==0)nume++;
e[c[y]]++;
if(nume>u)break;
}
for(i=0; i<n; i++)
{
ans+=y-x;
d[c[i]]--;if(d[c[i]]==0)numd--;
e[c[i]]--;if(e[c[i]]==0)nume--;
while(numd<l)
{
x++;
if(x==n)break;
if(d[c[x]]==0)numd++;
d[c[x]]++;
}
if(x==n)break;
if(y==n)continue;
while(y<n && nume<=u)
{
y++;
if(y==n)break;
if(e[c[y]]==0)nume++;
e[c[y]]++;
}
}
printf("%lld\n",ans);
return 0;
}