题目描述

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

  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. 【洛谷】【st表+模拟】P1311 选择客栈

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

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

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

  6. 洛谷 P1311 选择客栈

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

  7. 2011 luogu P1311 选择客栈

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

  8. 洛谷 P1311 选择客栈 —— 水题

    题目:https://www.luogu.org/problemnew/show/P1311 看每个位置能否成为咖啡店,然后作为客栈和前面配对即可. 代码如下: #include<iostrea ...

  9. 洛谷——P1311 选择客栈

    https://www.luogu.org/problem/show?pid=1311 题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰 ...

随机推荐

  1. 修改服务器时间以后 cookie无法保存

    修改了服务器时间以后发现,cookie无法保存.通过查看异步请求的响应头信息  Date是之前修改的信息,并不是当前的时间. header('Date: Mon, 17 Mar 2015 05:34: ...

  2. 【C/C++开发】C++编译指令#pragma pack的配对使用

    C++编译指令#pragma pack的配对使用 #pragma pack可以用来指定C++数据结构的成员变量的内存对齐数值(可选值为1,2,4,8,16). 本文主要是强调在你的头文件中使用pack ...

  3. 【神经网络与深度学习】【计算机视觉】SSD

    SSD 转自:https://zhuanlan.zhihu.com/p/24954433?refer=xiaoleimlnote 参考: SSD: Single Shot MultiBox Detec ...

  4. php_mvc实现步骤九(登录验证码,退出-登录标记)

    shop34-17-登录验证码 验证码的分析 登录:防止暴力破解 论坛:防止灌水水 展示类:被抓取. 需要技术: 图片处理技术. 会话session技术. PHP图片处理技术 – GD 具体操作步骤 ...

  5. SQL——WHERE子句

    一.WHERE字句的基本用法 WHERE字句用于筛选数据,提取满足条件的记录. WHERE字句的基本用法: SELECT * from 表名 WHERE 条件语句; 二.WHERE字句与删改查 演示s ...

  6. InfoGan笔记

    InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets ...

  7. 【LEETCODE】54、数组分类,简单级别,题目:605、532

    数组类,简单级别完结.... 不容易啊,基本都是靠百度答案.... 希望做过之后后面可以自己复习,自己学会这个解法 package y2019.Algorithm.array; /** * @Proj ...

  8. 状态机的Verilog写法

    “硬件设计很讲究并行设计思想,虽然用Verilog描述的电路大都是并行实现的,但是对于实际的工程应用,往往需要让硬件来实现一些具有一定顺序的工作,这就要用到状态机思想.什么是状态机呢?简单的说,就是通 ...

  9. [LOJ2292] [THUSC2016] 成绩单

    题目链接 LOJ:https://loj.ac/problem/2292 洛谷:https://www.luogu.org/problemnew/show/P5336 Solution 区间\(\rm ...

  10. ADO.NET 一般操作(c#)

    ADO.NET五大对象:SqlConnection.SqlCommand.SqlDataReader.SqlDataAdapter .DataSet ,其中SqlDataAdapter 不建议使用 一 ...