如题,代码带注释,最坏情况下O(n2)
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int N=2e5+5;
int n,k,p;
vector<int> st[52];//栈
int a[N],b[N];//装饰色调,最低消费
unsigned long long ans;
int c[N];//差分前缀和数组
int main(){
scanf("%d%d%d",&n,&k,&p);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i],&b[i]);
st[a[i]].push_back(i);//将色调为a[i]的客栈按次序放在同一个栈中
if(b[i] <= p){//是符合要求的咖啡店
c[i]=1;
}
}
for(int i=1;i<=n;i++){
c[i]+=c[i-1];//前缀和
}
for(int i=0;i<k;i++){//遍历所有色调的栈
for(int j=0;j<st[i].size();j++){
for(int k=j+1;k<st[i].size();k++){//考察每一对可能的答案
int l=st[i][j],r=st[i][k];
if(c[l] == c[k] && b[l] > p){
continue;//中间一个符合的也没有,且左边界也不符合
}
ans++;
}
}
}
printf("%llu",ans);
return 0;
}