stdKonjac's Blog

An AC a day keeps the WA away ~

【NOIP2011提高组 选择客栈】

题目背景

NOIP2011提高组 DAY1 试题。

题目描述

丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到 n 编号。每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。

两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过 p。

他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过p元的咖啡店小聚。

输入格式

共 n+1 行。

第一行三个整数 n,k,p,每两个整数之间用一个空格隔开,分别表示客栈的个数,色调的数目和能接受的最低消费的最高值;

接下来的 n 行,第 i+1 行两个整数,之间用一个空格隔开,分别表示i 号客栈的装饰色调和i 号客栈的咖啡店的最低消费。

输出格式

只有一行,一个整数,表示可选的住宿方案的总数。

样例数据 1

输入

5 2 3
0 5
1 3
0 2
1 4
1 5

输出

3

备注

【样例说明】

2人要住同样色调的客栈,所有可选的住宿方案包括:住客栈 ①③,②④,②⑤,④⑤,但是若选择住 4、5 号客栈的话,4、5 号客栈之间的咖啡店的最低消费是4,而两人能承受的最低消费是 3 元,所以不满足要求。因此只有前 3 种方案可选。

【数据范围】
对于 30% 的数据,有 n≤100;
对于 50% 的数据,有 n≤1,000;
对于 100% 的数据,有 2≤n≤200,000,0<k≤50,0≤p≤100, 0≤最低消费≤100。

先开两个数组iscost[i]和maxnum[i]分别表示距离i最近的颜色相同的酒店和距离i最近的满足最低消费的酒店,再用二个数组c1,c2分别记录至i为止和i颜色相同的酒店数目(不算i)和符合条件的方案数,若iscost[i]<=maxnum[i],那么显然i前面的所有与i同色的酒店必然可以与maxnum[i]配对,即c2[i]=c1[i],如果iscost[i]>maxnum[i],说明1~i的情况和1~iscost[i]的情况一样,即c2[i]=c2[iscost[i]]。

下面是代码:

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.