当前位置: 首页 > news >正文

HDU 5358 First One(枚举)

这道题假设依照表达式一个个来算肯定超时,下午时候想了一个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;
}







相关文章:

  • 数据库回归测试
  • SELinux深入理解
  • Android应用资源---绘制资源类型(Drawable)(五)
  • 查看 SELinux状态及关闭SELinux
  • Linux下Qt与mysql建立连接
  • poj 2192 Zipper
  • centos下查看tomcat的版本号
  • 浅谈UML中常用的几种图——用例图
  • [转]项目中Struts/Spring/Hibernate的基本流程
  • mac brew 安装 nginx fpm mysql 教程
  • 微软等公司数据结构+算法面试100题--链表
  • UIPickerView的使用
  • 目标板UBI工具交叉编译
  • 一个web项目web.xml的配置中context-param配置作用
  • Puppet安装dashboard
  • [数据结构]链表的实现在PHP中
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • ➹使用webpack配置多页面应用(MPA)
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Java,console输出实时的转向GUI textbox
  • Js基础知识(一) - 变量
  • Mysql优化
  • Puppeteer:浏览器控制器
  • Python3爬取英雄联盟英雄皮肤大图
  • Theano - 导数
  • tweak 支持第三方库
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 动态魔术使用DBMS_SQL
  • 容器服务kubernetes弹性伸缩高级用法
  • 详解移动APP与web APP的区别
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • Semaphore
  • 通过调用文摘列表API获取文摘
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • # .NET Framework中使用命名管道进行进程间通信
  • #AngularJS#$sce.trustAsResourceUrl
  • #QT(串口助手-界面)
  • #QT(智能家居界面-界面切换)
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • (12)Hive调优——count distinct去重优化
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (八)c52学习之旅-中断实验
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (转)大道至简,职场上做人做事做管理
  • .dwp和.webpart的区别
  • .gitignore文件---让git自动忽略指定文件
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET大文件上传知识整理
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .net流程开发平台的一些难点(1)
  • .Net面试题4
  • .NET企业级应用架构设计系列之技术选型
  • .NET下的多线程编程—1-线程机制概述
  • @RequestParam,@RequestBody和@PathVariable 区别