題目描述 傳送門
麗江河邊有n 家很有特色的客棧,客棧按照其位置順序從 1 到n 編號。每家客棧都按照某一種色調進行裝飾(總共 k 種,用整數 0 ~ k-1 表示),且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。
兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的兩家客棧中。晚上,他們打算選擇一家咖啡店喝咖啡,要求咖啡店位於兩人住的兩家客棧之間(包括他們住的客棧),且咖啡店的最低消費不超過 p 。
他們想知道總共有多少種選擇住宿的方案,保證晚上可以找到一家最低消費不超過 p元的咖啡店小聚。
我自己想的很爛的
(等我會了正解再更新…..)
代碼
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=200010;
int color[maxn],cost[maxn];
long long sum[maxn][52];
int main(){
int n,k,p;
cin>>n>>k>>p;
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++){
scanf("%d%d",&color[i],&cost[i]);
sum[i][color[i]]=sum[i-1][color[i]]+1;
for(int j=0;j<k;j++) if(j!=color[i]) sum[i][j]=sum[i-1][j];
}
int pre=0;
long long ans=0;
for(int i=1;i<=n;i++) if(cost[i]<=p){
for(int j=0;j<k;j++) ans+=(sum[i][j]-sum[pre][j])*(sum[n][j]-sum[i][j]);
ans+=sum[i-1][color[i]]-sum[pre][color[i]];
pre=i;
}
cout<<ans<<endl;
}