题意:给一个数列,按如下公式求和。

分析:场上做的时候,傻傻以为是线段树,也没想出题者为啥出log2,就是S(i,j) 的二进制表示的位数。只能说我做题依旧太死板,让求和就按规矩求和,多考虑一下就能发现这个题目应该是另想办法解决的,类似于改代码的题目,直接告诉你C++代码,让你从TLE改成AC,其实真正让你改的是算法,全身都要变。

看了题解,终于明白这道题目的正解算法:

因为S(i,j)的位数在一定范围内是一样的,所以我们可以枚举位数1~35(顶多是2^34),怎么计算(i+j)?继续枚举起点k,然后找满足位数是所枚举的位数的区间(l,r)即(k,l)~(k,r)都是二进制位数为t的,然后统一计算(k,l)~(k.r)的和,其实就是一个l~r的等差序列(r + l)*(r - l + 1) / 2,一个是k的(r-l+1)倍。一直枚举到位数大于数列全部的和。

PS:枚举区间的时候用的是尺取法,很容易懂,就是从起点k开始,直到有不满足的条件,否则l++,然后r直接从l开始,其实计算的时候一般能想得到。

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define LL long long
#define maxn 101010
LL pow2l[],pow2r[],s[maxn];
int main()
{
for(int i=; i<=; i++)
{
pow2l[i]=(1ll<<i);
pow2r[i]=((1ll<<(i+))-);
}
pow2l[]=;
pow2r[]=;
LL ncase,i,j,n,x;
scanf("%I64d",&ncase);
while(ncase--)
{
scanf("%d",&n);
for(i=; i<=n; i++)
{
scanf("%I64d",&x);
s[i]=s[i-]+x;
}
LL ans=;
for(i=; i<=; i++)
{
if(s[n] < pow2l[i-])
break;
LL l=,r=,temp=;
for(j=; j<=n; j++)
{
l = max(l,j);
while(l <= n && s[l] - s[j-] < pow2l[i-])
l++;
r = max(r,l - );
while(r < n && s[r+] - s[j-] >= pow2l[i-] && s[r+]-s[j-] <= pow2r[i-])
r++;
if(r >= l)
temp+=(r-l+)*j+(r+l)*(r-l+)/;
}
ans += temp * i;
}
printf("%I64d\n",ans);
}
return ;
}

AC

HDU 5358 尺取法+枚举的更多相关文章

  1. Hdu 5358 First One (尺取法+枚举)

    题目链接: Hdu 5358 First One 题目描述: 数组a有n个元素,S[i,j]定义为a[i]+a[i+1]+.....+a[j],问:这个死东西等于多少? 解题思路: 二分肯定超,这个题 ...

  2. HDU 6205(尺取法)2017 ACM/ICPC Asia Regional Shenyang Online

    题目链接 emmmm...思路是群里群巨聊天讲这题是用尺取法.....emmm然后就没难度了,不过时间上3000多,有点.....盗了个低配本的读入挂发现就降到2800左右, 翻了下,发现神犇Clar ...

  3. hdu 5056(尺取法思路题)

    Boring count Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  4. hdu 2739(尺取法)

    Sum of Consecutive Prime Numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22876 ...

  5. 2015多校第6场 HDU 5358 First One 枚举,双指针

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5358 题意:如题. 解法:观察式子发现,由于log函数的存在,使得这个函数的值域<=34,然后我 ...

  6. HDU 5358 First One(枚举)

    这道题假设依照表达式一个个来算肯定超时,下午时候想了一个O(nlogn*logn)的算法.可是t了.由于这道题卡的很紧几百个例子,必须nlogn的算法才干够ac 回到这道题,考虑log(sum(i,j ...

  7. 树形DP+RMQ+尺取法 hdu4123

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123 参考博客:两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race ...

  8. codeforces 701C C. They Are Everywhere(尺取法)

    题目链接: C. They Are Everywhere time limit per test 2 seconds   memory limit per test 256 megabytes inp ...

  9. HDU 5358 First One 数学+尺取法

    多校的题,摆明了数学题,但是没想出来,蠢爆了,之前算了半天的s[i][j]的和,其实是积.其实比赛的时候我连log(s[i][j])+1是s[i][j]的位数都没看出来,说出来都丢人. 知道了这个之后 ...

随机推荐

  1. 右值引用、move与move constructor

    http://blog.chinaunix.net/uid-20726254-id-3486721.htm 这个绝对是新增的top特性,篇幅非常多.看着就有点费劲,总结更费劲. 原来的标准当中,参数与 ...

  2. python(二)数据类型

    一.整数 创建方法 i = 10 i = int(10) i = int("10",base=2)  #“”中是几进制的表示,base是选择要表示的进制,如base=2,用2进制的 ...

  3. ajax (返回类型:text)

    <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...

  4. Java垃圾回收以及内存分配

    http://www.cnblogs.com/ggjucheng/p/3977384.html http://www.blogjava.net/qcyycom/archive/2012/04/14/3 ...

  5. 利用win7系统自带的dos命令把笔记本无线网卡当无线路由器(无线AP发射器)

    利用win7系统自带的dos命令把笔记本无线网卡当无线路由器(无线AP发射器). 1.打开win7开始菜单,找到命令提示符选项,以管理员身份运行cmd.2.在命令行上输入:netsh wlan set ...

  6. [转](五)unity4.6Ugui中文教程文档-------概要-UGUI Interaction Components

    大家好,我是孙广东.   转载请注明出处:http://write.blog.csdn.net/postedit/38922399 更全的内容请看我的游戏蛮牛地址:http://www.unityma ...

  7. 备用帖子1Shell(Shell R语言)

    shell========================== echo 1 > /proc/sys/vm/drop_caches 清理内存 free -m du -h --max-depth= ...

  8. ReactiveCocoa信号使用方法

    最近研究RAC时都是基于UI控件来使用,对单独的signal没有使用过,最近在网上看到一篇文章是关于RAC单独signal的使用.在学习整理后将个人觉得能帮助用于UI控件的一些signal使用方法记录 ...

  9. HBase之计数器

    HBase计数器 #创建counters表 列族['daily','weekly','monthly'] hbase(main):001:0> create 'counters','daily' ...

  10. shell编程—— EOF

    在shell编程中,”EOF“通常与”<<“结合使 用,“<<EOF“表示后续的输入作为子命令或子shell的输入,直到遇到”EOF“,再次返回到主调shell,可将其理解为分 ...