题解 洛谷P1311 【选择客栈】
可能这做法是最奇葩的
ST表
我们枚举k,计算每种色调的客栈各有多少种方法
我们利用一种奇怪的思想:除了不可行的,剩下的都是可行的
所以我们先求出 每种颜色的客栈随机选择两个,一共有多少种结果
接着减去所有不合法的方案
不合法的方案怎么算?
从0到n枚举所有颜色为k的客栈
如果相邻两个客栈之间有满足要求(<p)的咖啡馆而且是第一次发现
用st表来计算两家客栈之间有没有符合要求的咖啡馆
那么我们可以断定前面一段的客栈无论怎么组合都是不合法的


(叉号表示客栈之间没有满足要求的咖啡馆,sum2指的是前面有连续多少家客栈之间没有符合要求的客栈)
看不懂的可以看代码……
#include<bits/stdc++.h>
#define ll long long
#define inf 0x7fffffff
using namespace std;
int n,k,p;
ll ans=;
#define maxn 200009
int c[maxn],st[maxn][];
void RMQ_init()
{
for(int j=;(<<j)<=n;j++)
{
for(int i=;i+(<<j)-<=n;i++)
{
st[i][j]=min(st[i][j-],st[i+(<<(j-))][j-]);
}
}
}
int RMQ(int l,int r)
{
int k=;
while(<<(k+)<=r-l+)
{
k++;
}
return min(st[l][k],st[r-(<<k)+][k]);
}
void solve(int x)
{
int sum1=;
for(int i=;i<=n;i++)
{
if(c[i]==x)sum1++;//先统计颜色为x的客栈有多少个
}
int pre=;//pre代表上一个
int sum2=;
ans+=1ll*sum1*(sum1-)/; //计算任意组合有多少种方案
for(int i=;i<=n;i++)
{
if(c[i]==x)
{
if(!pre)
{
pre=i;
continue;
}
if(RMQ(pre,i)>p)//两家客栈之间没有满足要求的咖啡馆
{
sum2++;
}else //有了满足要求的咖啡馆
{
ans-=1ll*sum2*(sum2+)/;//前面的sum2家无论怎样组合都不合法了,因为他们之间没有满足要求的咖啡馆,减去
sum2=;
}
pre=i;
}
}
if(sum2)
{
ans-=1ll*sum2*(sum2+)/;//我们把所有不合法的都减去……剩下的都合法了
}
}
int main()
{
scanf("%d%d%d",&n,&k,&p);
for(int i=;i<=n;i++)
{
scanf("%d%d",&c[i],&st[i][]);//st是咖啡馆的最低消费
}
RMQ_init();//st表预处理
for(int i=;i<k;i++)//从0开始!!!!
{
solve(i);
}
printf("%lld\n",ans);
return ;
}
题解 洛谷P1311 【选择客栈】的更多相关文章
- 洛谷 P1311 选择客栈 解题报告
P1311 选择客栈 题目描述 丽江河边有 \(n\) 家很有特色的客栈,客栈按照其位置顺序从 \(1\) 到 \(n\) 编号.每家客栈都按照某一种色调进行装饰(总共 \(k\) 种,用整数 \(0 ...
- 洛谷P1311 选择客栈
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 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...
- 洛谷 P1311 选择客栈 —— 水题
题目:https://www.luogu.org/problemnew/show/P1311 看每个位置能否成为咖啡店,然后作为客栈和前面配对即可. 代码如下: #include<iostrea ...
- 洛谷——P1311 选择客栈
https://www.luogu.org/problem/show?pid=1311 题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰 ...
- 洛谷 P1131 选择客栈
题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...
- 【题解】洛谷P1311 [NOIP2011TG] 选择客栈(递推)
题目来源:洛谷P1311 思路 纯暴力明显过不了这道题 所以我们要考虑如何优化到至多只能到nlogn 但是我们发现可以更优到O(n) 我们假设我们当前寻找的是第二个人住的客栈i 那么第一个人住的客栈肯 ...
- 洛谷P1311 [NOIP2011提高组Day1T2]选择客栈
P1311 选择客栈 题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一 ...
随机推荐
- Postman集合/文件夹/请求中脚本的执行顺序
Postman的Collection(集合)/Folder(集合的子文件夹)/Request(请求)中都有Pre-request Script(请求前脚本)和Tests(请求后脚本) 这个功能类似于不 ...
- Python3 Address already in use 解决方法
1.查看使用端口号netstat -ntlp 2.根据端口号找到pid 3.杀死程序 kill -9 pid 4.重新启动程序 简单粗暴 我使用python3时编写Socket,linux系统下使用c ...
- Django环境搭建win(二)
Django 1.11.x 支持 Python 2.7, 3.4, 3.5 和 3.6,17年4月4号 已经发布(长期支持版本 LTS) win7下: 一.使用pip安装 1.首先要安装pip 2.p ...
- Mysql索引查询失效的情况
首先,复习一下索引的创建: 普通的索引的创建: CREATE INDEX (自定义)索引名 ON 数据表(字段); 复合索引的创建: CREATE INDEX (自定义)索引名 ON 数据 ...
- LeetCode 44. 通配符匹配(Wildcard Matching)
题目描述 给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配. '?' 可以匹配任何单个字符. '*' 可以匹配任意字符串(包括空字符串). 两个字符串完 ...
- LeetCode 101. 对称二叉树(Symmetric Tree)
题目描述 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null, ...
- 用单元测试来调试SilverFish AI
[TestFixture] public class AiTest { [Test] public void Test() { Settings.Instance.LogFolderPath = @& ...
- Telerik JustDecompile
Free. For everyone. Forever. With an open source decompilation engine https://www.telerik.com/produc ...
- Django admin site应用
django自带的admin后台管理,可以实现对数据库表的增删改查,用起来十分方便.其使用和配置主要分为三个步骤: 1,创建超级用户 需要创建超级用户来登陆admin后台系统,在命令行中输入 pyth ...
- ios-Runtime调用私有方法
有时在代码中会有需要调用私有方法的场景,如不想import太多头文件:想组件设计一些解耦的模块:查看别人模块中未暴露的代码进行分析等. 在 ios 中调用私有方法有很多种方式,主要是通过Runtime ...