洛谷P1311 選擇客棧(模擬)
阿新 • • 發佈:2018-11-01
P1311 選擇客棧
題目描述
麗江河邊有n n家很有特色的客棧,客棧按照其位置順序從 1 1到n n編號。每家客棧都按照某一種色調進行裝飾(總共 k 種,用整數 0 ~ k-1 表示),且每家客棧都設有一家咖啡店,每家咖啡店均有各自的最低消費。
兩位遊客一起去麗江旅遊,他們喜歡相同的色調,又想嘗試兩個不同的客棧,因此決定分別住在色調相同的兩家客棧中。晚上,他們打算選擇一家咖啡店喝咖啡,要求咖啡店位於兩人住的兩家客棧之間(包括他們住的客棧),且咖啡店的最低消費不超過 pp 。
他們想知道總共有多少種選擇住宿的方案,保證晚上可以找到一家最低消費不超過 p元的咖啡店小聚。
輸入輸出格式
輸入格式:
共n+1 行。
第一行三個整數n ,k ,p,每兩個整數之間用一個空格隔開,分別表示客棧的個數,色調的數目和能接受的最低消費的最高值;(n <= 200000, k<=50)
接下來的n 行,第 i+1 行兩個整數,之間用一個空格隔開,分別表示 ii號客棧的裝飾色調和 i號客棧的咖啡店的最低消費。
輸出格式:
一個整數,表示可選的住宿方案的總數。
輸入輸出樣例
輸入樣例#1:
5 2 3
0 5
1 3
0 2
1 4
1 5
輸出樣例#1:
3
說明
【輸入輸出樣例說明】
2 人要住同樣色調的客棧,所有可選的住宿方案包括:住客棧①③,②④,②⑤,④⑤,但是若選擇住4 4、5 5號客棧的話,44 、55 號客棧之間的咖啡店的最低消費是44 ,而兩人能承受的最低消費是33 元,所以不滿足要求。因此只有前 33 種方案可選。
分析:列舉右邊的客棧,記錄每個客棧前面有多少顏色相同的,以及離此客棧最近的滿足最低消費的客棧i,顯然客棧i之前顏色相同的都是可選的。
程式碼
#include <cstdio> #define N 2000005 #define ll long long using namespace std; struct arr { int col, p; }a[N]; int color[N][51],lowp[N]; int n,k,m; int main() { scanf("%d%d%d", &n, &k, &m); for (int i = 1; i <= n; i++) scanf("%d%d", &a[i].col, &a[i].p); ll ans = 0; for (int i = 1; i <= n; i++) { for (int j = 0; j <= 50; j++) color[i][j] = color[i - 1][j]; color[i][a[i].col]++; if (a[i].p <= m) lowp[i] = i; else lowp[i] = lowp[i - 1]; ans += color[lowp[i]][a[i].col]; if (lowp[i] == i) ans--; } printf("%lld", ans); }