NOIP 2011 hotel

描述

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

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

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

格式

输入格式

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

输出格式

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

样例1

样例输入1

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

Copy

样例输出1

3

Copy

限制

1s

提示

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

来源

NOIp2011提高组Day1第二题

有O(n*k+n) ,O(n*k)和O(n)做法

下面是O(n)的

last[i]=j 表示当前颜色为i的 所有客栈中,最后一个的是j

lastcostpos 表示当前所有客栈中,最后一个消费<=p的客栈

sumx[i]=j  表示当前颜色为i的客栈共有j个

sum[i]=j 表示当前与 颜色为i的这个客栈 可以组成的合法方案数

 1 #include<cstdio>
 2 #include<iostream>
 3 #define MAXN 200010
 4
 5 using namespace std;
 6
 7 int n,p,k,ans=0;
 8
 9 int color,cost,lastcostpos;
10
11 int last[MAXN],sum[MAXN],sumx[MAXN];
12
13 inline void read(int&x) {
14     int f=1;x=0;char c=getchar();
15     while(c>‘9‘||c<‘0‘) {if(c==‘-‘) f=-1;c=getchar();}
16     while(c>=‘0‘&&c<=‘9‘) {x=(x<<1)+(x<<3)+c-48;c=getchar();}
17     x=x*f;
18 }
19
20 int main() {
21     read(n);read(k);read(p);
22     for(int i=1;i<=n;i++) {
23         read(color);read(cost);
24         if(cost<=p) lastcostpos=i;
25         if(last[color]<=lastcostpos) sum[color]=sumx[color];
26         sumx[color]++;
27         last[color]=i;
28         ans+=sum[color];
29     }
30     printf("%d\n",ans);
31     return 0;
32
33 }

代码

时间: 2024-10-06 00:29:38

NOIP 2011 hotel的相关文章

NOIP 2011 Day 1 部分题解 (Prob#1 and Prob#2)

Problem 1: 铺地毯 乍一看吓cry,地毯覆盖...好像是2-dims 线段树,刚开头就这么难,再一看,只要求求出一个点,果断水题,模拟即可.(注意从标号大的往小的枚举,只要有一块地毯符合要求就输出,返回.) (全篇未完结,代码就不发了.) Problem 2: 选择客栈 模拟果断会超时,所以用类似动态规划的方法. 用$\text{sum}\left[ i\right]$表示从一号客栈到i号客栈途中的符合要求的Café总数,自然,$\text{O}\left( n\right)$的时间复

NOIP 2011 Day 1

NOIP 2011 Day 1 tags: NOIP 搜索 categories: 信息学竞赛 总结 铺地毯 选择客栈 Mayan游戏 铺地毯 Solution 因为只会询问一个点被谁覆盖, 而且后面的地毯会覆盖前面的地毯, 所以只需要从后往前枚举地毯, 只要能覆盖这个点就是最终覆盖它的地毯. Code #include<iostream> #include<cstdio> using namespace std; int x[10005]; int y[10005]; int a

NOIP 2011 Day1 T2 选择客栈

1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<string> 5 #include<cstring> 6 #include<algorithm> 7 #include<vector> 8 #include<queue> 9 #include<stack> 10 #include<iomanip>

【NOIP 2011】 观光公交

题目描述 Description 风景迷人的小城 Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0 分钟出现在1号景点,随后依次前往2.3.4……n 号景点.从第i 号景点开到第i+1 号景点需要Di 分钟.任意时刻,公交车只能往前开,或在景点处等待.设共有 m 个游客,每位游客需要乘车1 次从一个景点到达另一个景点,第i 位游客在Ti 分钟来到景点Ai,希望乘车前往景点Bi(Ai<Bi).为了使所有乘客都能顺

NOIp #2011

http://files.cnblogs.com/files/radiumlrb/NOIP2011%E6%8F%90%E9%AB%98%E7%BB%84%E8%AF%95%E9%A2%98-day1.pdf http://files.cnblogs.com/files/radiumlrb/NOIP2011%E6%8F%90%E9%AB%98%E7%BB%84%E8%AF%95%E9%A2%98Day2.pdf

NOIP 2011 选择客栈

题目描述 丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费. 两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中.晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过 p. 他们想知道总共有多少种选择住宿的方案,保证晚上可

NOIp 2011 mayan游戏 搜索

搜索. 因为要求字典序最小 所以都右移 除非那个方格为空. 代码如下: 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #define For(i,x,y) for(int i=x;i<=y;++i) 6 using namespace std; 7 int a[10][10]; 8 int cnt[10];int n; int ncnt

NOIp 2011 Day1 解题报告

1.    铺地毯 送分题…… 枚举给定矩形,判定给定点是否在矩形内.求出标号最大的哪个矩形即可. 复杂度O(N) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 //variable// 9 int n,a[10010],b[10010],g

NOIp 2011 Day2 解题报告

1.计算系数 本人比较耿直,没有想到递推的组合数公式,而是用了快速幂求逆元. 复杂度O(Klog10007) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 //variable// 9 int a,b,k,n,m,mod=10007; 10