【题目描述:】

丽江河边有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 选择客栈的更多相关文章

  1. 洛谷 P1311 选择客栈 解题报告

    P1311 选择客栈 题目描述 丽江河边有 \(n\) 家很有特色的客栈,客栈按照其位置顺序从 \(1\) 到 \(n\) 编号.每家客栈都按照某一种色调进行装饰(总共 \(k\) 种,用整数 \(0 ...

  2. 洛谷P1311 选择客栈

    P1311 选择客栈 题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一 ...

  3. Luogu P1311 选择客栈(前缀和)

    P1311 选择客栈 题意 题目描述 丽江河边有\(n\)家很有特色的客栈,客栈按照其位置顺序从\(1\)到\(n\)编号.每家客栈都按照某一种色调进行装饰(总共\(k\)种,用整数\(0\)~\(k ...

  4. P1311 选择客栈[模拟]

    题目描述 丽江河边有nn家很有特色的客栈,客栈按照其位置顺序从 11到nn编号.每家客栈都按照某一种色调进行装饰(总共 kk 种,用整数 00 ~k-1k−1 表示),且每家客栈都设有一家咖啡店,每家 ...

  5. 2018.09.25 codeforces1053E. Euler tour(并查集+st表+模拟)

    传送门 毒瘤细节题. 首先考虑不合法的情况. 先把相同的值配对,这样就构成了一些区间. 那么如果这些区间有相交的话,就不合法了. 如何判断?DZYO安利了一波st表,我觉得很不错. 接着考虑两个相同的 ...

  6. 洛谷 P5046 [Ynoi2019 模拟赛] Yuno loves sqrt technology I(分块+卡常)

    洛谷题面传送门 zszz,lxl 出的 DS 都是卡常题( 首先由于此题强制在线,因此考虑分块,我们那么待查询区间 \([l,r]\) 可以很自然地被分为三个部分: 左散块 中间的整块 右散块 那么这 ...

  7. ST表【p1311】 选择客栈

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

  8. [NOIP2011] 提高组 洛谷P1311 选择客栈

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

  9. 洛谷 P1311 选择客栈

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

随机推荐

  1. spring jpa和mybatis整合

    spring jpa和mybatis整合 前一阵子接手了一个使用SpringBoot 和spring-data-jpa开发的项目 后期新加入一个小伙伴,表示jpa相比mybatis太难用,多表联合的查 ...

  2. POJ3087(KB1-G 简单搜索)

    Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10366   Accepted: 4800 Des ...

  3. ctcms Nginx 伪静态

    location /whole { rewrite ^/whole/(.+).html$ /index.php?c=whole&key=$1; } location /show { rewri ...

  4. R下载package的一些小问题

    1.Error in install.packages : unable to create ‘C:/Users/???/Documents/R/win-library\3.5 采用管理员身份运行,先 ...

  5. 移动端meta标签设置

    移动端meta标签设置 1.设置当前html文件的字符编码 <meta charset="UTF-8"> 1 2设置浏览器的兼容模式(让IE使用最新的浏览器渲染) &l ...

  6. Android RxJava+Retrofit完美封装

    作者简介 本篇来自 小河马 的投稿,分享了自己是如何进行 RxJava+Retrofit 的封装.本文的技术点自然没话说,另外对于这种模块化的思路,希望能帮助到大家.最后提前祝大家周末愉快以及圣诞快乐 ...

  7. ciscn2018-pwn-wp

    前言 2018全国大学生网络安全竞赛 ,做了2 道题 task_supermarket change_desc 里面调用 realloc 会触发 uaf 利用 uaf 修改 obj->desc_ ...

  8. exim CVE-2017-16943 uaf漏洞分析

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这是最近爆出来的 exim 的一个 uaf 漏洞,可以进行远程代码 ...

  9. Java类的封装

    java中四种不同的限定词限定的成员(成员变量或成员变量方法),访问权限由大到小依次为: public(公共的) 可以被所有的类访问 protected(受保护的) 可以被这个类本身访问 可以被它的子 ...

  10. redis介绍(3)RDB和AOF原理解析

    简单科普一下redis的概念:(会的可忽略) Redis的概念 redis基于内存的Key Value类型的NoSQL数据库. Redis的特点 1. Redis是一个高性能的Key/Value数据库 ...