【洛谷】【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 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...
随机推荐
- Enable Scribble,Enable Guard Edges,Enable Guard Malloc,Zombie Objects
最近项目中使用一个翻拍身份证信息识别活体检测的第三方框架,在使用时会偶然性的出现崩溃的现象,经过查找是因为第三方框架中有释放的内存区域再次引用引起的,因而补充一下相关知识点. 在Xcode Edi ...
- 线程池ThreadPoolExecutor使用原理
本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...
- 【学习笔记】--- 老男孩学Python,day14 python内置函数大全
参考: https://www.cnblogs.com/pyyu/p/6702896.html http://www.runoob.com/python3/python3-built-in-func ...
- 使用AJAX实现分页
Fenye.html <!DOCTYPE html> <html> <head> <title>分页</title> </head&g ...
- DOM节点树和元素树--深度遍历
我们在阅读JS高级程序设计的时候,提到了节点树的概念.比如说: elem.parentNode---找elem的父节点: elem.childNodes---找elem的所有的直接子节点: elem. ...
- Flutter的教程:ListView
本文学习一下列表widget,是最常见的需求 在Flutter中,用ListView来显示列表项,支持垂直和水平方向展示,通过一个属性我们就可以控制其方向 1.水平的列表 2.垂直的列表 3.数据量非 ...
- 一步一步 Pwn RouterOS之exploit构造
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 前面已经分析完漏洞,并且搭建好了调试环境,本文将介绍如何利用漏洞写 ...
- clipChildren属性
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- 事件驱动模型 IO多路复用 阻塞IO与非阻塞IO select epool
一.事件驱动 1.要理解事件驱动和程序,就需要与非事件驱动的程序进行比较.实际上,现代的程序大多是事件驱动的,比如多线程的程序,肯定是事件驱动的.早期则存在许多非事件驱动的程序,这样的程序,在需要等待 ...
- JS + jQuery 实现元素自动滚动到底部,兼容IE、FF、Chrome
HTML代码: <ul class="tasklog-dialog-ul" id="auto_to_bottom"> <li>删除虚拟机 ...