【洛谷】【st表+模拟】P1311 选择客栈
【题目描述:】
丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号。每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。
两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过 p 。
他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过 p元的咖啡店小聚。
【输入格式:】
输入文件hotel.in,共n+1 行。
第一行三个整数n ,k ,p,每两个整数之间用一个空格隔开,分别表示客栈的个数,色调的数目和能接受的最低消费的最高值;
接下来的n 行,第 i+1 行两个整数,之间用一个空格隔开,分别表示 i 号客栈的装饰色调和i 号客栈的咖啡店的最低消费。
【输出格式:】
输出文件名为hotel.out 。
输出只有一行,一个整数,表示可选的住宿方案的总数。
输入样例#: 输出样例#:
输入输出样例
【算法分析:】
正解是O(n)的复杂度,但2000000的数据nlog2n就能过(2011年的时候自然是过不了的)
发现k种颜色分别是从0~k-1排的,可以把O(n3)暴力枚举的复杂度优化一下:
开一个二位数组c,c[i][j]表示第i种颜色的第j个客栈是c[i][j]号
循环开三层,第一层枚举颜色
第二、三层循环反向枚举这个颜色的客栈
第二层表示右边的客栈,第三层表示左边的客栈,
若是这两个客栈间的最小花费比p小(st表O(1)查询),则从第一个这个颜色的客栈开始一直到左边的这个客栈,都可以和右边的客栈匹配形成一组方案
时间复杂度在最坏的情况下应该比O(n2)要小
效率大大提升.
而再深入一想,可以将“找到某个客栈的左边最后一个客栈,使得两个客栈之间的最小花费小于等于p"这个操作利用二分来做
时间复杂度O(n log2 n)
但实测不如方法一优
【代码:】
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std; const int MAXN = + ;
const int K = ; int n, k, p, ans;
int t[MAXN], c[][MAXN], st[MAXN][K], Log2[MAXN];
struct hotel {
int color, cost, num;
}h[MAXN]; inline int read() {
int x = ; char ch = getchar();
while(ch < '' || ch > '') ch = getchar();
while(ch >= '' && ch <= '')
x = (x << ) + (x << ) + (ch - ), ch = getchar();
return x;
} int Query(int l, int r) {
int x = Log2[r - l + ];
return min(st[l][x], st[r - ( << x) + ][x]);
}
int main() {
n = read(), k = read(), p = read();
for(int i = ; i <= n; i++) {
h[i].color = read(),
h[i].cost = read();
st[i][] = h[i].cost;
}
for(int i = ; i <= n; i++)
c[h[i].color][++t[h[i].color]] = i; for(int j = ; j <= K; j++) {
for(int i = ; i + ( << j) - <= n; i++)
st[i][j] = min(st[i][j - ], st[i + ( << (j - ))][j - ]);
}
for(int i = ; ( << i) <= n; i++)
Log2[ << i] = i;
for(int i = ; i <= n; i++)
if(!Log2[i]) Log2[i] = Log2[i - ]; for(int i = ; i < k; i++) {
for(int end = t[i]; end >= ; end--) {
int pos = ;
//二分代码:
// int l = 1, r = end;
// while(l < r) {
// int mid = l + r >> 1;
// if(Query(c[i][mid], c[i][end]) <= p)
// l = mid + 1;
// else r = mid;
// }
// pos = l - 1;
for(int j = end - ; j >= ; j--) {
if(Query(c[i][j], c[i][end]) <= p) {
pos = j;
break;
}
}
ans += pos;
}
}
printf("%d\n", ans);
}
【洛谷】【st表+模拟】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 ...
- P1311 选择客栈[模拟]
题目描述 丽江河边有nn家很有特色的客栈,客栈按照其位置顺序从 11到nn编号.每家客栈都按照某一种色调进行装饰(总共 kk 种,用整数 00 ~k-1k−1 表示),且每家客栈都设有一家咖啡店,每家 ...
- 2018.09.25 codeforces1053E. Euler tour(并查集+st表+模拟)
传送门 毒瘤细节题. 首先考虑不合法的情况. 先把相同的值配对,这样就构成了一些区间. 那么如果这些区间有相交的话,就不合法了. 如何判断?DZYO安利了一波st表,我觉得很不错. 接着考虑两个相同的 ...
- 洛谷 P5046 [Ynoi2019 模拟赛] Yuno loves sqrt technology I(分块+卡常)
洛谷题面传送门 zszz,lxl 出的 DS 都是卡常题( 首先由于此题强制在线,因此考虑分块,我们那么待查询区间 \([l,r]\) 可以很自然地被分为三个部分: 左散块 中间的整块 右散块 那么这 ...
- 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 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...
随机推荐
- 页面刷新 location.reload()
* 页面不刷新,但是加了location.reload()后,把炒作失败提示语都刷没了.//成功,不提示,刷新看数据变化ajax success:function(res){ if(res.code= ...
- Jquery Easy UI初步学习(二)datagrid的使用
第一篇学的是做一个管理的外框,接着就是数据datagrid绑定了,这里我用asp.net mvc3来做的,主要就是熟悉属性.方法. 打开easyui的demo 就可以看到如下一段代码: 和上篇一样cl ...
- Nginx 反向代理时获取用户的真实 IP
在平时我们开发后端程序的过程中,应该多多少少都会碰到记录客户端 IP 的场景,例如我之前写过的 APP 用户的一个审计功能,就需要获取用户的 IP 地址:还有广告系统里面,也是需要获取用户的 IP 地 ...
- Notepad++去除COPY代码行号的几种方法
解2:打开 Notepad++,按住 Alt,鼠标点击拖出选择框,这个是列选 方法,相当拉风: 效果图如下
- 【 js 片段 】如何组织表单的默认提交?【亲测有效】
最近做的一个项目,我分到的部分有表单验证.点击了提交按钮,但我并不想让他跳转页面去提交.于是经过各种百度,各种 stackoverflow,各种抱大神腿之后,有了以下解决办法: 重点就是阻止 form ...
- Review——JS的异步与同步
一.概念 同步(synchronous):指在js的主线程上,所有任务被依次执行: 异步(asynchronous):指任务不进入主线程,进入任务队列(task):当“任务队列”通知主线程,异步任务才 ...
- front-end 前端发展学习路线参考图
front-end 前端发展学习路线参考图 学习的路程还很长~!
- 从敲入 URL 到浏览器渲染完成、对HTTP协议的理解
1. 大致过程 当你这样子回答的时候: 用户输入 url 地址,浏览器查询 DNS 查找对应的请求 IP 地址 建立 TCP 连接 浏览器向服务器发送 http 请求,如果服务器段返回以 301 之类 ...
- FineReport中JS如何自定义按钮导出
FineReport支持多种不同的导出方式,直接使用FineReport内置导出按钮可以非常快捷方便的来对各种格式的输出,但是我们在web页面集成中的时候,往往只想将报表内容嵌入到iframe中,而工 ...
- 记一次Android studio升级之后的坑
像往常一样打开Android studio,但这次它提示我升级!说是什么为了更好的体验,在好奇心的驱使下,我毅然地点击了“update”按钮.升级之后,编译项目,报出了N多个error,我的心都慌完! ...