題解:本題主要考查貪心+遞推。
簡要題意:兩個客棧a,b,滿足a,b顏色相同且[a,b]閉區間之間必須存在某個客棧的咖啡店的花費<=p。求滿足的方案數。
1.貪心+遞推:我們枚舉客棧,用t來記錄最近的花費小於等於p的客棧,以它爲選擇的咖啡店,向後枚舉記錄到上一個t的客棧顏色種類數(因爲[a,b]閉區間有花費小於等於p的)。
所以如果這個客棧更新了t,ans+=num[這個客棧的顏色]-1
如果這個客棧沒有更新t,ans+=num[這個客棧的顏色]
代碼如下:
#include<iostream>
using namespace std;
int color[233333],num[233333],money[233333];
int n,k,p,t,ans;
int main()
{
cin>>n>>k>>p;
for(int i=1;i<=n;i++)cin>>color[i]>>money[i];
for(int i=1;i<=n;i++)
{
if(p>=money[i])
{
for(int j=i;j>t;j--)num[color[j]]++;
t=i;
ans+=num[color[i]]-1;
}
else ans+=num[color[i]];
}
cout<<ans<<endl;
return 0;
}