统计到第z个客栈时颜色出现次数,保存可消费的位置。
遍历每个可消费的位置,方案数为每个同种颜色在两个位置间出现的次数乘以之后出现的次数(做到不重复计算),遇到与这个位置同样的颜色时,还要加上同种颜色在两个位置间出现的次数与之后出现的次数的和(因为这个位置可以与两个位置间匹配,也可以在这个位置后匹配,做到不漏)
#include<bits/stdc++.h>
using namespace std;
int ha[53][200010],kao[200010];
int h,k,l,m,n;
int main(){
// freopen("hotel.in","r",stdin);
// freopen("hotel.out","w",stdout);
scanf("%d%d%d",&n,&k,&m);
for(int z=1;z<=n;++z){
int a,b;
scanf("%d%d",&a,&b);
ha[52][z]=a;
for(int y=0;y<k;++y) ha[y][z]=ha[y][z-1];
++ha[a][z];
if(b<=m) kao[++h]=z;
}
for(int z=1;z<=h;++z)
for(int y=0;y<k;++y)
if(ha[y][kao[z]]){
if(y==ha[52][kao[z]]){
l+=(ha[y][n]-ha[y][kao[z-1]]-1);
l+=(ha[y][kao[z]]-1-ha[y][kao[z-1]])*(ha[y][n]-ha[y][kao[z]]);
continue;
}
l+=(ha[y][kao[z]]-ha[y][kao[z-1]])*(ha[y][n]-ha[y][kao[z]]);
}
printf("%d",l);
}