【洛谷】【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 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...
随机推荐
- $("input[name=name]").val(); 无法获取值问题
<input type="text" class="text" name="name" placeholder= 例如:上海" ...
- 啰里吧嗦式讲解java静态代理动态代理模式
一.为啥写这个 文章写的比较啰嗦,有些东西可以不看,因为想看懂框架, 想了解SSH或者SSM框架的设计原理和设计思路, 又去重新看了一遍反射和注解, 然后看别人的博客说想要看懂框架得先看懂设计模式,于 ...
- js中var与let
问题 for (var iii = 0; iii < 3; iii++) { setTimeout(function(){ console.debug(iii) }, 1000) let let ...
- day-01mysql数据库下载安装卸载及基本操作
MySQL5.5.40破解版地址(永久有效):链接:https://pan.baidu.com/s/1n-sODjoCdeSGP8bDGxl23Q 密码:qjjy 第2节 数据库的介绍 MySQL:开 ...
- git之回退
1:本地已commit,未push到远程仓库 1)git log: 查看commit日志,获取commit的id 2) git reset --hard commit_id: ...
- 使用WebDAV实现Office文档在线编辑
Office的文档处理能力是非常强大的,但是它是本地资源,在Office Web App尚未成熟前,仍需要使用本地能力来进行文档编辑,可是现代的系统的主流却是B/S,所以在B/S中调用本地的Offic ...
- 一步一步pwn路由器之radare2使用实战
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 前文讲了一些 radare2 的特性相关的操作方法.本文以一个 c ...
- JSON学习笔记-2
JSON的语法 1.JSON 数据的书写格式是:名称/值对. "name" : "我是一个菜鸟" 等价于这条 JavaScript 语句: name = &qu ...
- spring shiro 集成
1.向spring项目中添加shiro相关的依赖 <dependency> <groupId>commons-logging</groupId> <artif ...
- ALTER 语句总结
一.基础语句 ALTER TABLE 语句 ALTER TABLE 语句用于在现有表中添加.删除或修改列. <!--若要向表中添加列,请使用以下语法:--> ALTER TABLE tab ...