分析:要遍历所有的区间,肯定是枚举左端点,然后再枚举右端点.关键是怎么高效地求区间&,|,一般而言是用前缀和的,但是&,|不满足区间可减性,所以可以考虑线段树?这道题不带修改操作,用线段树太浪费了,那么可以用ST表来维护.

查询做到O(1)了,但是怎么快速枚举区间呢?枚举左端点和右端点肯定只能选择一个优化,优化枚举右端点的循环.观察数据范围,100000,很容易想到二分.可以每次固定左端点,然后二分右端点的位置.因为&操作随着区间数的增加而答案减少,|是增加,都满足单调性,所以求满足两个条件的区间的交,统计一下区间的元素个数有多少个就可以了.

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8. const long long inf = 1LL << , mod = 1e9 + ;
  9.  
  10. typedef long long ll;
  11.  
  12. ll n, a, b, c, d, f1[][], f2[][], s[], ans;
  13.  
  14. void init()
  15. {
  16. for (int j = ; j <= ; j++)
  17. for (int i = ; i + ( << j) - <= n; i++)
  18. {
  19. f1[i][j] = f1[i][j - ] & f1[i + ( << (j - ))][j - ];
  20. f2[i][j] = f2[i][j - ] | f2[i + ( << (j - ))][j - ];
  21. }
  22. }
  23.  
  24. ll query(ll l, ll r,ll op)
  25. {
  26. ll k = (ll)((log(r - l + )) / log(2.0));
  27. if (op == )
  28. return f1[l][k] & f1[r - ( << k) + ][k];
  29. else
  30. return f2[l][k] | f2[r - ( << k) + ][k];
  31. }
  32.  
  33. int main()
  34. {
  35. scanf("%lld%lld%lld%lld%lld", &n, &a, &b, &c, &d);
  36. for (int i = ; i <= n; i++)
  37. {
  38. scanf("%lld", &s[i]);
  39. f1[i][] = f2[i][] = s[i];
  40. }
  41. init();
  42. for (int i = ; i <= n; i++)
  43. {
  44. ll l = i, r = n, temp1 = inf, temp2 = -inf, temp3 = inf, temp4 = -inf;
  45. while (l <= r)
  46. {
  47. ll mid = (l + r) >> ;
  48. if (query(i, mid,) >= a)
  49. {
  50. l = mid + ;
  51. temp2 = mid;
  52. }
  53. else
  54. r = mid - ;
  55. }
  56.  
  57. l = i, r = n;
  58. while (l <= r)
  59. {
  60. ll mid = (l + r) >> ;
  61. if (query(i, mid, ) <= b)
  62. {
  63. r = mid - ;
  64. temp1 = mid;
  65. }
  66. else
  67. l = mid + ;
  68. }
  69.  
  70. l = i, r = n;
  71. while (l <= r)
  72. {
  73. ll mid = (l + r) >> ;
  74. if (query(i, mid, ) >= c)
  75. {
  76. r = mid - ;
  77. temp3 = mid;
  78. }
  79. else
  80. l = mid + ;
  81. }
  82.  
  83. l = i, r = n;
  84. while (l <= r)
  85. {
  86. ll mid = (l + r) >> ;
  87. if (query(i, mid, ) <= d)
  88. {
  89. l = mid + ;
  90. temp4 = mid;
  91. }
  92. else
  93. r = mid - ;
  94. }
  95. ll ll = max(temp1, temp3), rr = min(temp2, temp4);
  96. ans += max((long long), rr - ll + );
  97. ans %= mod;
  98. }
  99. printf("%lld\n", ans);
  100.  
  101. return ;
  102. }

noip模拟赛 区间的更多相关文章

  1. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  2. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

  3. NOIP模拟赛-2018.11.6

    NOIP模拟赛 今天想着反正高一高二都要考试,那么干脆跟着高二考吧,因为高二的比赛更有技术含量(我自己带的键盘放在这里). 今天考了一套英文题?发现阅读理解还是有一些困难的. T1:有$n$个点,$m ...

  4. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  5. NOI.AC NOIP模拟赛 第一场 补记

    NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...

  6. NOI.AC NOIP模拟赛 第三场 补记

    NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...

  7. 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护

    线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...

  8. 【HHHOJ】NOIP模拟赛 玖 解题报告

    点此进入比赛 得分: \(100+20+100=220\)(还不错) 排名: \(Rank\ 16\) \(Rating\):\(+20\) \(T1\):[HHHOJ263]「NOIP模拟赛 玖」三 ...

  9. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

随机推荐

  1. Android开发学习——简单类图

    1.类A继承于类B    (B 是父类,A是 子类) 2.小汽车.自行车 实现车的接口 3.A中有B这个成员变量,单向关联 4.聚合,整体与部分的关系.has-a  B中的构造函数(或set方法)需要 ...

  2. RabbitMQ四:生产者--队列--消费者

    AMQP协议的梳理和名词解析  建议先把上篇AMQP协议先看一遍,理解一下,由于用XMind绘图,电脑屏幕比较小,不能截取全部,如果想要全图和源代码,请下面留言....... 可以点击图片,打开到新的 ...

  3. AJPFX关于this用法和注意事项

    this:代表对象.就是所在函数所属对象的引用.哪个对象调用了this所在的函数,this就代表哪个对象,就是哪个对象的引用.开发时在定义功能时,如果该功能内部使用到了调用该功能的对象,这时就用thi ...

  4. CF919D Substring

    思路: 拓扑排序过程中dp.若图有环,返回-1. 实现: #include <bits/stdc++.h> using namespace std; ; vector<int> ...

  5. 行内元素对齐各种问题--从line-height和vertical-align的角度分析

    最近研究行内元素的对齐问题,发现img不管怎么设置,下边都有一块留白,强迫症无法忍受未知,于是开始了查阅探索之旅. 辗转来到张鑫旭的博客,他对行内盒子模型做了详细的介绍,包括“幽灵节点”,“line- ...

  6. Java常用的排序查找算法

    public static void main(String[] args) {      // bubbleSort(); // int[] a = {20,2,10,8,12,17,4,25,11 ...

  7. 护卫神·云查杀系统V4.0-安全检测部分

    感谢使用护卫神·云查杀系统,该软件专门查杀网页木马,完全免费,欢迎大家使用.    护卫神·云查杀系统 下载地址:http://down.huweishen.com/free/HwsKill.zip ...

  8. php从mysql数据库中取数据

    php从数据库中取数据  面向过程 <?php $server_name="localhost:3306"; //数据库服务器名称 $username="root& ...

  9. 软件开发:速度 vs 质量

    程序开发项目进行过程中,通常会冒出这样的困惑:应该选择速度,还是选择质量?很多程序猿都会有偷懒的思维,觉得把一些摸不清头绪.不知道怎么写的代码片段去掉,可以节省很多时间,更早完成项目计划. 其实过去几 ...

  10. html引用ttf字体文件

    在样式表如此定义: @font-face { font-family: MyFontName;//自定义字体名称 src: url(../Gloss_And_Bloom.ttf) } 然后,具体使用: ...