题目传送门sxazr
三个数组last,sum,cnt;
last表示当前颜色的最后位置;
sum记录合理花费位置前该颜色的客栈数量;
cnt这个颜色的客栈目前有多少个;
变量f表示合理花费的最后位置。
输入过程中,如果合理花费的最后位置在当前颜色最后位置右边,那么和它颜色相同的客栈的都可以和它搭配,sum[a]=cnt[a] (a为输入的颜色);
如果不合理,当前客栈只能和f以前的所有同颜色客栈搭配,即sum[a]不变.
ans+=sum[a];
代码
#include <iostream>
#include <cstdio>
using namespace std;
int n,p,k,ans,f,cnt[200001],sum[200010],last[200001];
int main()
{
cin>>n>>k>>p;
for(int i=1;i<=n;i++){
int a,b;
scanf("%d%d",&a,&b);
if(b<=p)
f=i;
if(f>=last[a])
sum[a]=cnt[a];
ans+=sum[a];
last[a]=i;
cnt[a]++;
}
cout<<ans;
return 0;
}