枚举右边的客栈,每次都先找距离当前客栈最近的蛮族最低消费小于p的客栈
(可以用一个数组来记录最近的小于p的客栈, 如果第i个咖啡小于p,那么vis[i]=i,否则 vis[i]=vis[i-1]
然后再计算最近的客栈左边的颜色和当前客栈相同的颜色的数量,加上即可
(颜色数量可以用一个二维数组保存,最多只有50个颜色
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <string> #include <stack> #include <queue> #include <cmath> #define ll long long #define pi 3.1415927 #define inf 0x3f3f3f3f #define mod 1000000007 using namespace std; int n,m,k,p,vis[200005],res[55][200005],s[200005],z[200005]; int main () { int T,i,t,j; cin>>n>>k>>p; for(i=1;i<=n;++i){ cin>>s[i]>>z[i]; if(z[i]<=p) vis[i]=i; else vis[i]=vis[i-1]; res[s[i]][i]++; for(int v=0;v<k;++v) res[v][i]+=res[v][i-1]; } ll sum=0; for(i=2;i<=n;++i){ sum+=res[s[i]][vis[i]]; if(z[i]<=p) sum--; } cout<<sum<<endl; return 0; }