博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1311 选择客栈
阅读量:4353 次
发布时间:2019-06-07

本文共 1401 字,大约阅读时间需要 4 分钟。

枚举右端点

可以发现左右端点中有一个合法的咖啡店就可以了

而且为了让合法的左端点尽量多

咖啡店要尽量靠右

所以可以记录目前最右边的合法咖啡店左边每种颜色的客栈的个数 cnt[ color ]

然后如果更右边有合法的咖啡店,就更新一波 cnt

累计所有右端点的情况

复杂度 O(nk)

#include
#include
#include
#include
#include
using namespace std;const int N=5e5+7;int n,k,p;int col[N],val[N],ans;int cnt[57],sum[57];int main(){ cin>>n>>k>>p; for(int i=1;i<=n;i++) scanf("%d%d",&col[i],&val[i]); for(int i=1;i<=n;i++) { sum[col[i]]++;//中间数组 if(val[i]<=p) for(int j=0;j
O(nk)代码

 

可以发现我们很多时间花在了更新cnt上

每次有咖啡店就把所有的cnt都更新了

但是其实每次我们只要更新当前颜色的cnt就可以了

所以可以记 las[ i ] 表示颜色 i 最右边出现的位置

pos 表示最右边合法的咖啡店的位置

如果 pos >= las[ lolor[r] ] 才更新cnt

复杂度 O(n)

#include
#include
#include
#include
#include
using namespace std;const int N=5e5+7;int n,k,p;int col[N],val[N],ans;int cnt[57],sum[57],las[57];int main(){ cin>>n>>k>>p; for(int i=1;i<=n;i++) scanf("%d%d",&col[i],&val[i]); int pos=0; for(int i=1;i<=n;i++) { if(val[i]<=p) pos=i; if(pos>=las[col[i]]) cnt[col[i]]+=sum[col[i]],sum[col[i]]=0; las[col[i]]=i; ans+=cnt[col[i]]; sum[col[i]]++; } cout<
O(n)代码

 

转载于:https://www.cnblogs.com/LLTYYC/p/9712782.html

你可能感兴趣的文章
Fedora14 mount出现错误时解决办法【亲测有效】
查看>>
使用Visual Studio 2013进行UI自动化测试
查看>>
13-集体照
查看>>
读了曾国藩家书,,心态逐渐平和起来。搞技术的如果缺乏信念的指引,生活会很乏味无聊!...
查看>>
160809308周子济第六次作业
查看>>
大型Web应用运行时 PHP负载均衡指南
查看>>
为phpStorm 配置PHP_CodeSniffer自动检查代码
查看>>
测试工具网址大全(转)
查看>>
ServiceStack DotNet Core前期准备
查看>>
webpack中‘vant’全局引入和按需引入【vue-cli】
查看>>
Date、String和Timestamp类型转换
查看>>
计算机的组成
查看>>
[简单到爆]eclipse-jee-neon的下载和安装
查看>>
vector
查看>>
Redis学习之set类型总结
查看>>
栈和队列
查看>>
CSS2-3常见的demo列子总结一
查看>>
第522篇--DataTable to Excel C#
查看>>
C++\virtual 虚函数、纯虚函数
查看>>
asp.net mvc 4多级area实现技巧
查看>>