枚举右边的客栈,每次都先找距离当前客栈最近的蛮族最低消费小于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;
}
京公网安备 11010502036488号