重磅例题!ST表应用!提高组Getting!

1125: B15-倍增-习题:选择客栈[ST表应用]

时间限制: 1 Sec  内存限制: 128 MB
提交: 35  解决: 12
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述

丽江河边有n家很有特色的客栈,客栈按照其位置顺序从1到n编号。每家客栈都按照某一种色调进行装饰(总共k种,用整数0~k-1表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。
两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过p。
他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过p元的咖啡店小聚。

输入

每组输入数据共n+1行。
第一行三个整数n,k,p,每两个整数之间用一个空格隔开,分别表示客栈的个数,色调的数目和能接受的最低消费的最高值;
接下来的n行,第i+1行两个整数,之间用一个空格隔开,分别表示i号客栈的装饰色调和i号客栈的咖啡店的最低消费。

数据规模:
对于30%的数据,有n≤100;
对于50%的数据,有n≤1,000;
对于100%的数据,有2≤n≤200,000,0<k≤50,0≤p≤100,0≤最低消费≤100。

输出

每组输出只有一行,一个整数,表示可选的住宿方案的总数。

下面是对样例数据的解释:

2人要住同样色调的客栈,所有可选的住宿方案包括:住客栈①③,②④,②⑤,④⑤,但是若选择住4、5号客栈的话,4、5号客栈之间的咖啡店的最低消费是4,而两人能承受的最低消费是3元,所以不满足要求。因此只有前3种方案可选。

样例输入
Copy

  1. 5 2 3
  2. 0 5
  3. 1 3
  4. 0 2
  5. 1 4
  6. 1 5

样例输出 Copy

  1. 3

提示

来源/分类

 
GPLv2 licensed by QDOJ 2019
 
  1. /*
  2. 1125: B15-倍增-习题:选择客栈[ST表应用]
  3. 时间限制: 1 Sec 内存限制: 128 MB
  4. 提交: 4 解决: 2
  5. [提交] [状态] [讨论版] [命题人:外部导入]
  6. 题目描述
  7. 丽江河边有n家很有特色的客栈,客栈按照其位置顺序从1到n编号。每家客栈都按照某一种色调进行装饰(总共k种,用整数0~k-1表示),且每家客栈都设有一家咖啡店,每家咖啡店均有各自的最低消费。
  8. 两位游客一起去丽江旅游,他们喜欢相同的色调,又想尝试两个不同的客栈,因此决定分别住在色调相同的两家客栈中。晚上,他们打算选择一家咖啡店喝咖啡,要求咖啡店位于两人住的两家客栈之间(包括他们住的客栈),且咖啡店的最低消费不超过p。
  9. 他们想知道总共有多少种选择住宿的方案,保证晚上可以找到一家最低消费不超过p元的咖啡店小聚。
  10.  
  11. 输入
  12. 每组输入数据共n+1行。
  13. 第一行三个整数n,k,p,每两个整数之间用一个空格隔开,分别表示客栈的个数,色调的数目和能接受的最低消费的最高值;
  14. 接下来的n行,第i+1行两个整数,之间用一个空格隔开,分别表示i号客栈的装饰色调和i号客栈的咖啡店的最低消费。
  15.  
  16. 数据规模:
  17. 对于30%的数据,有n≤100;
  18. 对于50%的数据,有n≤1,000;
  19. 对于100%的数据,有2≤n≤200,000,0<k≤50,0≤p≤100,0≤最低消费≤100。
  20.  
  21. 输出
  22. 每组输出只有一行,一个整数,表示可选的住宿方案的总数。
  23.  
  24. 下面是对样例数据的解释:
  25.  
  26. 2人要住同样色调的客栈,所有可选的住宿方案包括:住客栈①③,②④,②⑤,④⑤,但是若选择住4、5号客栈的话,4、5号客栈之间的咖啡店的最低消费是4,而两人能承受的最低消费是3元,所以不满足要求。因此只有前3种方案可选。
  27.  
  28. 样例输入 Copy
  29.  
  30. 5 2 3
  31. 0 5
  32. 1 3
  33. 0 2
  34. 1 4
  35. 1 5
  36.  
  37. 样例输出 Copy
  38.  
  39. 3
  40.  
  41. 提示
  42.  
  43. 来源/分类
  44. B15-倍增
  45. [提交] [状态]
  46. GPLv2 licensed by QDOJ 2019
  47.  
  48. */
  49. #include<bits/stdc++.h>
  50. using namespace std;
  51. int n,k,p;
  52. int co[],mo[];
  53. int d[][];long long ans;
  54. void RMQ_init(){//ST表的创建模板
  55. for(int i=;i<n;i++)
  56. d[i][]=mo[i];
  57. for(int j=;(<<j)<=n;j++)
  58. for(int i=;i+(<<j)-<n;i++){
  59. d[i][j]=min(d[i][j-],d[i+(<<(j-))][j-]);
  60. }
  61. }
  62. int RMQ_min(int L,int R){//区间最小值
  63. int k=;
  64. while((<<(k+))<=R-L+)
  65. k++;
  66. return min(d[L][k],d[R-(<<k)+][k]);
  67. }
  68.  
  69. void solve(int id){
  70. int pre=,sum1=,sum2=;
  71. for(int i=;i<n;i++)
  72. if(co[i]==id)
  73. sum1++;
  74. ans+=1ll*sum1*(sum1-)/;
  75. for(int i=;i<n;i++)
  76. if(co[i]==id){
  77.  
  78. if(!pre){
  79. pre=i;
  80. continue;
  81. }
  82. if(RMQ_min(pre,i)>p)
  83. sum2++;
  84. else{
  85. ans-=1ll*sum2*(sum2+)/;
  86. sum2=;
  87. }
  88. pre=i;
  89. }
  90.  
  91. if(sum2)
  92. ans-=1ll*sum2*(sum2+)/;
  93. }
  94. int main(){
  95. scanf("%d%d%d",&n,&k,&p);
  96. for(int i=;i<n;i++)
  97. scanf("%d%d",&co[i],&mo[i]);
  98. RMQ_init();
  99. for(int i=;i<k;i++){
  100. solve(i);//这个函数的整体思路就是把不可能的情况快速地排除掉,可以再看一下视频来辅助理解哦
  101. }
  102. cout<<ans;
  103. return ;
      
  104. }
  105. /**************************************************************
  106. Problem: 1125
  107. User: lijunhui
  108. Language: C++
  109. Result: 正确
  110. Time:226 ms
  111. Memory:46236 kb
  112. ****************************************************************/

//https://noip-1253948194.cos.ap-beijing.myqcloud.com/%E5%80%8D%E5%A2%9E-ST%E7%AE%97%E6%B3%95%E9%80%89%E6%8B%A9%E5%AE%A2%E6%A0%88.mp4

倍增ST应用 选择客栈(提高组)的更多相关文章

  1. 【11NOIP提高组】选择客栈(信息学奥赛一本通 1546)(洛谷 1311)

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

  2. Noip2011 提高组 选择客栈

    P1311 选择客栈 直通 思路: ①看题,我们可以发现一个显然的性质,即当最左边的客栈向右移动时,最右边的客栈时单调向右的,并且右端点往右的客栈也符合要求.(因为只要左侧有一个满足的,右边的自然可以 ...

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

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

  4. 开车旅行 2012年NOIP全国联赛提高组(倍增+set)

    开车旅行 2012年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 小A 和小B决定利用 ...

  5. [NOIP2012] 提高组 洛谷P1081 开车旅行

    题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...

  6. 【题解】NOIP2016提高组 复赛

    [题解]NOIP2016提高组 复赛 传送门: 玩具谜题 \(\text{[P1563]}\) 天天爱跑步 \(\text{[P1600]}\) 换教室 \(\text{[P1850]}\) 组合数问 ...

  7. 【数据结构】运输计划 NOIP2015提高组D2T3

    [数据结构]运输计划 NOIP2015提高组D2T3 >>>>题目 [题目描述] 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航 ...

  8. Nowcoder 提高组练习赛-R7

    Nowcoder 提高组练习赛-R7 https://www.nowcoder.com/acm/contest/179#question 中间空了两场,因为实在是太难了... 第五场的第二题好像还比较 ...

  9. NOIP2012 提高组 Day 1

    期望得分:100+100+70=270 实际得分:100+50+70=220 T2 没有底 最后剩余时间来不及打高精.思路出现错误 T1 Vigenère 密码 题目描述 16 世纪法国外交家 Bla ...

随机推荐

  1. H3C ACL包过滤显示与调试

  2. Mac PHPStorm清除SVN配置缓存

  3. python基础十一之装饰器进阶

    函数的双下划线方法 def hahahha(): """测试函数""" print('zxc') print(hahahha.__name_ ...

  4. jmeter登录配置

    前言: jmeter, Apache下的测试工具, 常用来进行压测, 项目中, 接口通常都需要进行登录才能被调用, 直接调用将提示"登录失效", 下面介绍如何在jmeter中配置参 ...

  5. 2018-8-10-dot-net-core-使用-IPC-进程通信

    title author date CreateTime categories dot net core 使用 IPC 进程通信 lindexi 2018-08-10 19:16:52 +0800 2 ...

  6. Struts 2三种方式实现Ajax

    Ajax本质上和普通的HTTP请求是一样的,只不过普通的HTTP请求是给人看的,而Ajax请求是给JS代码去用的. 所以Ajax请求的页面一般比普通的HTTP请求的响应内容还要简单,可能是一个页面的一 ...

  7. html 中文占位符

    => 普通的英文半角空格   =>   =>   => no-break space (普通的英文半角空格但不换行)   => 中文全角空格 (一个中文宽度)   =&g ...

  8. swiper 使用参考 禁止手动滑动 监听事件

    最外层容器加类名  swiper-no-swiping 监听切换事件 onTransitionEnd: function(swiper){ console.log('过渡结束'); }

  9. dotnet 使用 Environment.FailFast 结束程序

    在运行到一些诡异的代码,这时的程序已经无法继续运行,需要退出,那么如何在记完日志之后在退出程序记录更多信息?可以通过 Environment.FailFast 里面添加字符串告诉用户当前的进程无法继续 ...

  10. mysql find_in_set 与 in 的用法与区别,mysql范围搜索,mysql范围查询

    mysql find_in_set 与 in 的用法与区别 1.find_in_set 用于模糊查询,并且数据库中的值是用英文逗号分隔的: 例如: (1).去字段中查询 select find_in_ ...