我的思路是预处理每个颜色的个数,记录两个数组rr和ll,分别为当前客栈右边(包含)每个颜色个数和左边每个颜色个数,枚举客栈, 设当前客栈为i,当枚举到i+1时,r r [ a [ i ] ]- -,l l [ a [ i ] ]+ +,如果当前客栈价钱合适,就枚举颜色种类 j ,ans加上r r [ j ] * l l [ j ],l l [ j ]清零,理论上应该没问题,可只过了第一个点。
#include<bits/stdc++.h>
using namespace std;
inline long long read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+(ch-'0');
ch=getchar();
}
return x*f;
}
int ll[201],rr[201];
int pp[200001];
int a[200001];
int l,r;
int main()
{
// freopen("P1311_2.in","r",stdin);
// freopen("P1311_2.out","w",stdout);
int n=read();
int k=read();
int p=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
rr[a[i]]++;
pp[i]=read();
}
long long ans=0;
for(int i=2;i<=n;i++)
{
rr[a[i-1]]--;
ll[a[i-1]]++;
if(pp[i]<=p)
{
for(int j=0;j<=k-1;j++)
{
ans+=rr[j]*ll[j];
ll[j]=0;
}
}
}
cout<<ans<<endl;
return 0;
}