Luogu P1311 [NOIp提高組2011]選擇客棧


題目描述 傳送門
麗江河邊有n 家很有特色的客棧,客棧按照其位置順序從 1 到n 編號。每家客棧都按照某一種色調進行裝飾(總共 k 種,用整數 0 ~ k-1 表示),且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。
兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的兩家客棧中。晚上,他們打算選擇一家咖啡店喝咖啡,要求咖啡店位於兩人住的兩家客棧之間(包括他們住的客棧),且咖啡店的最低消費不超過 p 。
他們想知道總共有多少種選擇住宿的方案,保證晚上可以找到一家最低消費不超過 p元的咖啡店小聚。


我自己想的很爛的O(nk) 算法:枚舉喝咖啡的位置,更新ans+=此位置前面的(包括此位置)和後面的同顏色客棧的數量相乘,注意不要算到重複的。
(等我會了正解再更新…..)

代碼

#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;
}
發佈了59 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章