题意:You are given an array A of N non-negative integers and an integer M.

Find the number of pair(i,j) such that 1≤i≤j≤N and min(Ai,Ai+1,...,Aj)⋅(Ai⊕Ai+1⊕...⊕Aj)≤M.

先用把数字从小到大依次插入,用个set预处理出每个最小值控制的子区间的范围,对于大小相同的数,靠左的数优先。

然后对于每个子区间,最小值将它划分成左右两段,枚举较短的那段,在较长的那段中用可持久化Trie查询满足条件的对数。前缀异或和别忘了处理,很经典了。

就是设M/min(Ai,Ai+1,...,Aj)为W,每次向左右儿子查询,如果W的这位是零,那就不累计答案,直接朝零(这里指异或上左端点的前缀和以后的零)走;如果W的这位是一,那就统计上零(这里指异或上左端点的前缀和以后的零)的子树的答案,然后朝一走。别忘了到叶子以后还要在累计一次。(叶子必然满足条件,可以累计。)

  1. #include<cstdio>
  2. #include<set>
  3. #include<algorithm>
  4. using namespace std;
  5. typedef set<int>::iterator ITER;
  6. typedef long long ll;
  7. int n;
  8. ll m,a[100005];
  9. int b[100005],lb[100005],ub[100005];
  10. int w,xors[100005];
  11. bool cmp(const int &x,const int &y){
  12. return (a[x]!=a[y] ? a[x]<a[y] : x<y);
  13. }
  14. ll ans;
  15. #define N 100005
  16. #define MAXBIT 31
  17. int root[N],ch[N*(MAXBIT+1)][2],sz[N*(MAXBIT+1)],tot;
  18. void add(int now,int W)
  19. {
  20. int old=root[now-1];
  21. root[now]=++tot;
  22. now=root[now];
  23. for(int i=MAXBIT;i>=1;--i)
  24. {
  25. int Bit=((W>>(i-1))&1);
  26. sz[now]=sz[old]+1;
  27. ch[now][Bit^1]=ch[old][Bit^1];
  28. ch[now][Bit]=++tot;
  29. now=ch[now][Bit];
  30. old=ch[old][Bit];
  31. }
  32. sz[now]=sz[old]+1;
  33. }
  34. void query(int bef,int L,int R,int W,int fl)
  35. {
  36. L=root[L];R=root[R+1];
  37. for(int i=MAXBIT;i>=1;--i){
  38. int Bit=(W>>(i-1)&1);
  39. if(Bit==1){
  40. if((xors[bef-fl]>>(i-1)&1)==1){
  41. ans+=(ll)(sz[ch[R][1]]-sz[ch[L][1]]);
  42. R=ch[R][0];
  43. L=ch[L][0];
  44. }
  45. else{
  46. ans+=(ll)(sz[ch[R][0]]-sz[ch[L][0]]);
  47. R=ch[R][1];
  48. L=ch[L][1];
  49. }
  50. }
  51. else{
  52. if((xors[bef-fl]>>(i-1)&1)==1){
  53. R=ch[R][1];
  54. L=ch[L][1];
  55. }
  56. else{
  57. R=ch[R][0];
  58. L=ch[L][0];
  59. }
  60. }
  61. }
  62. ans+=(ll)(sz[R]-sz[L]);
  63. }
  64. int main(){
  65. //freopen("f.in","r",stdin);
  66. scanf("%d%lld",&n,&m);
  67. for(int i=1;i<=n;++i){
  68. scanf("%lld",&a[i]);
  69. xors[i]=(xors[i-1]^a[i]);
  70. }
  71. for(int i=1;i<=n;++i){
  72. b[i]=i;
  73. }
  74. sort(b+1,b+n+1,cmp);
  75. set<int> S;
  76. for(int i=1;i<=n;++i){
  77. ITER it=S.lower_bound(b[i]);
  78. if(it!=S.end()){
  79. ub[b[i]]=((*it)-1);
  80. }
  81. else{
  82. ub[b[i]]=n;
  83. }
  84. if(it==S.begin()){
  85. lb[b[i]]=1;
  86. }
  87. else{
  88. --it;
  89. lb[b[i]]=((*it)+1);
  90. }
  91. S.insert(b[i]);
  92. }
  93. add(1,0);
  94. for(int i=1;i<=n;++i){
  95. add(i+1,xors[i]);
  96. }
  97. for(int i=1;i<=n;++i){
  98. if(m/a[i]>=(1ll<<31)){
  99. ans+=(ll)(i-lb[i]+1)*(ll)(ub[i]-i+1);
  100. continue;
  101. }
  102. w=(int)(m/a[i]);
  103. if(i-lb[i]<=ub[i]-i){
  104. for(int j=lb[i];j<=i;++j){
  105. query(j,i,ub[i],w,1);
  106. }
  107. }
  108. else{
  109. for(int j=i;j<=ub[i];++j){
  110. query(j,lb[i]-1,i-1,w,0);
  111. }
  112. }
  113. }
  114. printf("%lld\n",ans);
  115. return 0;
  116. }

【set】【可持久化Trie】The 16th UESTC Programming Contest Preliminary K - Will the circle be broken的更多相关文章

  1. The 15th UESTC Programming Contest Preliminary K - Kidd1ng Me? cdoj1565

    地址:http://acm.uestc.edu.cn/#/problem/show/1565 题目: Kidd1ng Me? Time Limit: 3000/1000MS (Java/Others) ...

  2. 【字符串哈希】The 16th UESTC Programming Contest Preliminary F - Zero One Problem

    题意:给你一个零一矩阵,q次询问,每次给你两个长宽相同的子矩阵,问你它们是恰好有一位不同,还是完全相同,还是有多于一位不同. 对每行分别哈希,先一行一行地尝试匹配,如果恰好发现有一行无法对应,再对那一 ...

  3. 【推导】The 16th UESTC Programming Contest Preliminary L - Foxtrot

    题意:有n瓶药剂,其中只有一瓶药剂有毒.让你用最少的小白鼠试出哪瓶有毒.你只有一次给任意只小白鼠各喂食任意种类药剂的机会. m只老鼠就能对应2^m种“生死状态”的组合,给每种状态分配一个种类的药剂,然 ...

  4. The 15th UESTC Programming Contest Preliminary J - Jermutat1on cdoj1567

    地址:http://acm.uestc.edu.cn/#/problem/show/1567 题目: Jermutat1on Time Limit: 3000/1000MS (Java/Others) ...

  5. The 15th UESTC Programming Contest Preliminary C - C0ins cdoj1554

    地址:http://acm.uestc.edu.cn/#/problem/show/1554 题目: C0ins Time Limit: 3000/1000MS (Java/Others)     M ...

  6. The 15th UESTC Programming Contest Preliminary B - B0n0 Path cdoj1559

    地址:http://acm.uestc.edu.cn/#/problem/show/1559 题目: B0n0 Path Time Limit: 1500/500MS (Java/Others)    ...

  7. The 15th UESTC Programming Contest Preliminary M - Minimum C0st cdoj1557

    地址:http://acm.uestc.edu.cn/#/problem/show/1557 题目: Minimum C0st Time Limit: 3000/1000MS (Java/Others ...

  8. The 16th UESTC Programming Contest Final 游记

    心情不好来写博客. 为了满足ykk想要气球的愿望,NicoDafaGood.Achen和我成功去神大耍了一圈. 因为队名一开始是LargeDumpling应援会,然后队名被和谐,变成了学校的名字,顿时 ...

  9. The 15th UESTC Programming Contest Preliminary G - GC?(X,Y) cdoj1564

    地址:http://acm.uestc.edu.cn/#/problem/show/1564 题目: G - GC?(X,Y) Time Limit: 3000/1000MS (Java/Others ...

随机推荐

  1. [Openwrt 扩展上篇]USB挂载&U盘启动&Samba共享

    最近偷懒,没学习,反想起自己的路由刷了Openwrt,正好闲置了一个硬盘想拿来做个网络硬盘,于是开始了折腾....这里将不谈论如何刷Openwrt,如何ssh,如何添加PPOE,如何添加相对应服务的包 ...

  2. Html 使用技巧 -- 设置display属性可以使div隐藏后释放占用的页面空间

         div的visibility可以控制div的显示和隐藏,但是隐藏后页面显示空白: style="visibility: none;" document.getElemen ...

  3. 关于UNIX的exec函数

    在UNIX系统中,系统为进程相关提供了一系列的控制原语,包括:进程fork,进程exit,进程exec,进程wait等服务. 该篇文章主要与进程exec服务有关,并记录了几个需要注意留意的点. 照例给 ...

  4. [转]CNN 中千奇百怪的卷积方式大汇总

    https://www.leiphone.com/news/201709/AzBc9Sg44fs57hyY.html 推荐另一篇很好的总结:变形卷积核.可分离卷积?卷积神经网络中十大拍案叫绝的操作. ...

  5. oracle建表,设置主键,修改属性等

    --建表 create table book( book_id number(10), book_name varchar2(20), book_price number(10,2), book_au ...

  6. 转载-SVN常用命令

    SVN(Subversion)是一个自由.开源的项目源代码版本控制工具.目前,绝大多数开源软件和企业代码管理,都使用SVN作为代码版本管理软件. Subversion将文件存放在中心版本库里,这个版本 ...

  7. Linux下编译安装qemu和libvirt【转】

    转自:http://www.cnblogs.com/findumars/p/5679742.html 目录 [hide] 1 安装qemu 1.1 qemu介绍 1.2 下载源文件 1.3 编译安装 ...

  8. Django模型和ORM

    一.ORM ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是 ...

  9. poj1976

    dp #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ...

  10. Python 模块进阶

    import导入模块 1. import 搜索路径 import sys sys.path 例子: In [1]: import sys In [2]: sys.path Out[2]: ['', ' ...