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

回到这道题,考虑log(sum(i,j))+1的特点,能够发现它的值域范围很小。在1-34之间。那么我们能够考虑枚举log(sum(i,j)+1的值。记为k,然后统计(i+j)的和就可以。

对于每个k,找到全部满足2^(k-1)<=sum(i,j)<=2^k-1的(i+j),

那么我们考虑每一个前缀i,找到这个前缀满足2^(k-1)<=sum(i,j)<=2^k-1的区间[l,r],即对于这个区间的每一个元素s(i,j),都满足上式(l<=j<=r)。

这一步枚举有一个小技巧,当我们找到前缀i的区间[l,r]之后。那么前缀i+1满足上式的区间一定不可能在前缀i的[l, r]之前。

那么我们用两个指针维护这个区间就可以,那么时间复杂度就降为了O(n*logn).

ps:下午写的n*logn*logn的代码在我电脑上跑了22000ms,ac代码在我电脑上跑了5500ms,ac代码在oj上跑了1600ms。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<ctime>
#include<map>
#include<set>
#define eps 1e-6
#define LL long long
#define pii (pair<int, int>)
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; const int maxn = 100000 + 500;
//const int INF = 0x3f3f3f3f;
LL a[maxn], s[maxn];
int n; int main() {
clock_t start = clock();
// freopen("input.txt", "r", stdin);
int T; cin >> T;
while(T--) {
scanf("%d", &n);
LL ans = 0;
for(int i = 1; i <= n; i++) {
scanf("%I64d", &a[i]);
s[i] = s[i-1] + a[i];
}
for(int k = 1; k <= 34; k++) {
int l = 1, r = 0;
LL liml = k==1 ? 0 : (1LL<<(k-1)), limr = (1LL<<k)-1;
for(int i = 1; i <= n; i++) {
l = max(i, l);
while(l<=n && s[l]-s[i-1]<liml) l++;
r = max(l-1, r);
while(r+1<=n && s[r+1]-s[i-1]>=liml && s[r+1]-s[i-1]<=limr) r++;
if(l>r) continue;
// if(k==2) cout << l << " " << r << " " << i << endl;
ans += (LL)(i+l+i+r)*(r-l+1)/2*k;
}
// if(k < 5) cout << ans << endl;
}
cout << ans << endl;
}
clock_t end = clock();
// cout << end-start << endl;
return 0;
}


最新文章

  1. jQuery中iframe的操作
  2. ASP.NET 5 使用 TestServer 进行单元测试
  3. linux 下cmake 编译 ,调用,调试 poco 1.6.0 小记
  4. join()、implode()函数
  5. java.net.URL 模拟用户登录网页并维持session
  6. SecureCRT连接linux设置vim显示颜色
  7. sublime Emmet的用法及相关语法
  8. shell 括号学习
  9. 转载:python文件打开方式详解——a、a+、r+、w+区别
  10. centos &quot;cannot open display&quot;的问题
  11. Android----二维码开发
  12. 【bzoj3172】 [Tjoi2013]单词
  13. Java 二次MD5 32位小写加密算法与php页面加密结果相同
  14. jQuery --checkbox全选和取消全选简洁高效的解决办法
  15. IIS部署WCF报 无法读取配置节“protocolMapping”,因为它缺少节声明
  16. ITU-T Technical Paper: IP网络测量模型
  17. 将函数声明为Static的作用
  18. Linux 桌面玩家指南:05. 发博客必备的图片处理和视频录制神器
  19. VS2017 + EF6连接MySql
  20. MySQL内连接、外连接、交叉连接

热门文章

  1. EXC_BAD_ACCESS(code=2,address=0xcc 异常解决 及 建议不要在子线程中刷新界面
  2. arcgis新版本增加的功能
  3. 打印后台程序服务没有启动,每次打开Powerdesigner都会要我安装打印机
  4. unity3d摄像机参数
  5. 清除 Windows 系统垃圾的 bat
  6. 《CWNA官方学习指南(第3版):认证无线网络管理员PW0-105》
  7. Latex初学者入门(三)-- 用BibTeX生成参考文献
  8. @ArrayList剖析
  9. 织梦(Dedecms) V5.6 plus/carbuyaction.php 本地文件包含漏洞
  10. go语言之进阶篇方法面向过程和对象函数的区别