P1311 选择客栈[模拟]
题目描述
丽江河边有nn家很有特色的客栈,客栈按照其位置顺序从 11到nn编号。每家客栈都按照某一种色调进行装饰(总共 kk 种,用整数 00 ~k-1k−1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。
两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过 pp 。
他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过pp元的咖啡店小聚。
解析
看到题解有人RMQ了,也看到巨佬的ST表了,没错,我也是差不多的思路。但是我的想法似乎结合了题解区好几篇题解(雾。
首先我们先不考虑最低消费这个影响因素。对于每一个客栈\(i\),假设它的色调为\(k_i\),显然它可以与其左边的所有的与它色调相同的客栈构成合法解,因此它对答案造成的贡献就是在它左边的与它色调一致的客栈总个数。
接下来我们考虑加入最低消费这个因素。在加入这个因素后,对于客栈\(i\),它会与左边的某些符合要求的客栈构成合法解。根据题目,这个要求是咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过 p。所以我们只要知道对于客栈\(i\),它到它前面的某个客栈之间最低消费的最小值,就可以知道该情况是否构成合法解。而题目并没有区间修改这种操作,为了解决RMQ,我们不妨选择效率较高的ST表。
又,对于客栈\(i\),假设它左边有一个客栈\(j\)与其构成合法解,那么客栈\(j\)左边的所有客栈也一定与\(i\)构成合法解。
复杂度可能\(O(nk)\)吧,烂的很。
参考代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 200010
#define MOD 2520
#define E 1e-12
using namespace std;
inline int read()
{
int f=1,x=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int sum[51][N],f[N][20],n,k,p;
int pre[N],last[51];
struct node{
int rk,v;
}a[N];
inline int fmax(int x,int y){return x>y?x:y;}
inline int fmin(int x,int y){return x<y?x:y;}
inline void prework()
{
int t=log(n)/log(2)+1;
for(int j=1;j<t;++j)
for(int i=1;i<=n-(1<<j)+1;++i)
f[i][j]=fmin(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
inline int query(int l,int r)
{
int t=log(r-l+1)/log(2);
return fmin(f[l][t],f[r-(1<<t)+1][t]);
}
int main()
{
n=read(),k=read(),p=read();
for(int i=1;i<=n;++i){
a[i].rk=read(),f[i][0]=a[i].v=read();
pre[i]=last[a[i].rk],last[a[i].rk]=i;
sum[a[i].rk][i]++;
for(int j=0;j<=k;++j)
sum[j][i]+=sum[j][i-1];
}
prework();
int ans=0;
for(int j,i=1;i<=n;++i){
if(sum[a[i].rk][i]-sum[a[i].rk][i-1]){
if(sum[a[i].rk][i]==1) continue;
for(j=pre[i];j;j=pre[j])
if(query(j,i)<=p)break;
ans+=sum[a[i].rk][j];
}
}
printf("%d\n",ans);
return 0;
}
P1311 选择客栈[模拟]的更多相关文章
- 洛谷 P1311 选择客栈 解题报告
P1311 选择客栈 题目描述 丽江河边有 \(n\) 家很有特色的客栈,客栈按照其位置顺序从 \(1\) 到 \(n\) 编号.每家客栈都按照某一种色调进行装饰(总共 \(k\) 种,用整数 \(0 ...
- 洛谷P1311 选择客栈
P1311 选择客栈 题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一 ...
- Luogu P1311 选择客栈(前缀和)
P1311 选择客栈 题意 题目描述 丽江河边有\(n\)家很有特色的客栈,客栈按照其位置顺序从\(1\)到\(n\)编号.每家客栈都按照某一种色调进行装饰(总共\(k\)种,用整数\(0\)~\(k ...
- 【洛谷】【st表+模拟】P1311 选择客栈
[题目描述:] 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖 ...
- [NOIP2011] 提高组 洛谷P1311 选择客栈
题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...
- 洛谷 P1311 选择客栈
题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...
- 2011 luogu P1311 选择客栈
题目描述 丽江河边有 nn 家很有特色的客栈,客栈按照其位置顺序从 1 到 n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖 ...
- 洛谷 P1311 选择客栈 —— 水题
题目:https://www.luogu.org/problemnew/show/P1311 看每个位置能否成为咖啡店,然后作为客栈和前面配对即可. 代码如下: #include<iostrea ...
- 洛谷——P1311 选择客栈
https://www.luogu.org/problem/show?pid=1311 题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰 ...
随机推荐
- nrm -- npm镜像源管理
nrm nrm(npm registry manager )是npm的镜像源管理工具,有时候国外资源太慢,使用这个就可以快速地在 npm 源间切换 安装nrm 在命令行执行命令,npm install ...
- Android Tcp操作
Tcp是基于传输层的面向连接的可靠通讯协议,其优点是基于连接,使得服务端和客户端可以实现双向通信,且实时性高,在需要服务端主动向客户端推送数据的应用场景中,使用TCP协议是一种很好的方式. 初学And ...
- 面试之哈希表leetcode
1 案例1 leetcode-----242 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示例 1: 输入: s = "anagram", t ...
- word 转化为PDF 目录没了
https://jingyan.baidu.com/article/ca00d56c5d5f8de99febcf54.html 点文件-->导出-->创建PDF-->选项--> ...
- js获取日期时间
获取当前时间 function getNowFormatDate() {//获取当前时间 var date = new Date(); var symbol_gang = "-"; ...
- 【转帖】5G基站建设下的“中国速度”:北上广深领跑全国,均超1万个
5G基站建设下的“中国速度”:北上广深领跑全国,均超1万个 https://www.laoyaoba.com/html/news/newsdetail?source=pc&news_id=73 ...
- 使用JMeter进行Apache Kafka负载测试
1.卡夫卡负载测试 在这个Apache Kafka教程中,我们将了解如何使用Apache JMeter,如何在Apache Kafka上执行Kafka负载测试.此外,这个Kafka负载测试教程教我们如 ...
- C++ 读取 MATLAB 的 .m 文件,并发送到 MATLAB 运行
本代码是由「Microsoft Visual Studio 2015 Enterprise」编写. 想要了解更多 C++ 与 MATLAB 混合编程的知识,可以参考我的另一篇博客:C++ 与 MATL ...
- python 之 Django框架(ORM常用字段和字段参数、关系字段和和字段参数)
12.324 Django ORM常用字段 .id = models.AutoField(primary_key=True):int自增列,必须填入参数 primary_key=True.当model ...
- python使用matplotlib在一个图形中绘制多个子图以及一个子图中绘制多条动态折线问题
在讲解绘制多个子图之前先简单了解一下使用matplotlib绘制一个图,导入绘图所需库matplotlib并创建一个等间隔的列表x,将[0,2*pi]等分为50等份,绘制函数sin(x).当没有给定x ...