1. 程式人生 > >洛谷P1311 選擇客棧(模擬)

洛谷P1311 選擇客棧(模擬)

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);
}