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

hdu 4027 Can you answer these queries?

题意:将题目的背景去掉,简单的说,就是每一次对一个区间的所有值都分别做一次求平方根的运算,就是将那个值改为它的平方根的值,每次再询问一段区间内的总和

分析:很明显的用线段树来做,不过明显的对线段树还是不熟悉,一开始将每一步update操作都更新到具体的每一个点了,没有任何技巧,直接TLE;很明显,如果每一步都必须更新的具体每一个点的话,就是一个

O(n)复杂度的操作了,这个对使用线段树来说,没太大意义了。

这题目而言,我们发现,任何一个2^63次方以内的数,开根号都至多开八次,也就是,多次询问操作之后,很多都已经不需要update了,所以,只需要在每一个节点中增加一个域,用来标记该区间是否已经全部更新到0或者1了,若满足条件,则不需要更新了

 

#include<iostream>
#include<math.h>
#define MAXN 100002
using namespace std;
__int64 c[MAXN];
struct node
{
	int l,r;
	__int64 sum;
	bool d;
}p[MAXN*4];
void bulid(int s,int t,int k)
{
	p[k].l=s;p[k].r=t;
	if(t==s)
	{
		p[k].sum=c[s];
		p[k].d=(c[s]<=1LL);
		return ;
	}
	int kl=k<<1,kr=kl+1,mid=(s+t)>>1;
	bulid(s,mid,kl);
	bulid(mid+1,t,kr);
	p[k].sum=p[kl].sum+p[kr].sum;
	p[k].d=p[kl].d && p[kr].d;
}
void decr(int k,int l,int r)
{
	if(p[k].l>r||p[k].r<l) return ;
	if(p[k].d) return;
	if(p[k].r==p[k].l)
	{
		p[k].sum=(__int64)(sqrt((double)p[k].sum));
		p[k].d=(p[k].sum<=1LL);
		return ;
	}
	int kl=k<<1,kr=kl+1;
	decr(kl,l,r);
	decr(kr,l,r);
    p[k].sum=p[kr].sum+p[kl].sum;
	p[k].d=p[kr].d && p[kl].d;
}
__int64 query(int k,int l,int r)
{
	if(p[k].l>r||p[k].r<l) return 0;
	if(p[k].l>=l&&p[k].r<=r) 
		return p[k].sum;
	int kl=k<<1,kr=kl+1;
	return query(kl,l,r)+query(kr,l,r);
}
int main()
{
	int n,m,a,b,cas=0,k;
	while(scanf("%d",&n)==1)
	{
		for(int i=1;i<=n;i++)
			scanf("%I64d",&c[i]);
		bulid(1,n,1);
		printf("Case #%d:\n",++cas);
		scanf("%d",&m);
		while(m--)
		{
			scanf("%d %d %d",&k,&a,&b);
			if(a>b) {int temp=a;a=b;b=temp;}
			if(k==0)
				decr(1,a,b);
			else printf("%I64d\n",query(1,a,b));
		}
		printf("\n");
	}
	return 0;
}

转载于:https://www.cnblogs.com/nanke/archive/2011/09/14/2176608.html

相关文章:

  • Windows数据类型探幽——千回百转你是谁?(1)
  • 数据库连接错误: The provider did not return a ProviderManifestToken string.
  • C#编写的winform程序打包方法
  • 2017.11.14 小组第二次例会
  • 032 文本框中的时间格式
  • hdu 4012 Paint on a Wall
  • Android开发者指南(11) —— Optimizing Apps for Android 3.0
  • C#获取当前路径的7种方法
  • android116 轮播 viewPager实现
  • 参加虚拟化达人训练营的体会
  • 转载: 关于ruby中 %Q, %q, %W, %w, %x, %r, %s 的用法
  • django专题—安装、创建项目、添加应用
  • 自定义的asp.net翻页控件
  • python 数学运算符
  • 标题一定要长~~~~长~~~~~~~~~~~~~~长~~~~~~~~
  • 【React系列】如何构建React应用程序
  • Android组件 - 收藏集 - 掘金
  • Angular6错误 Service: No provider for Renderer2
  • C++类中的特殊成员函数
  • echarts的各种常用效果展示
  • Invalidate和postInvalidate的区别
  • pdf文件如何在线转换为jpg图片
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 动态规划入门(以爬楼梯为例)
  • 后端_ThinkPHP5
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 实战|智能家居行业移动应用性能分析
  • 微信小程序填坑清单
  • C# - 为值类型重定义相等性
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一)VirtualBox安装增强功能
  • (转)nsfocus-绿盟科技笔试题目
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET Core WebAPI中封装Swagger配置
  • .NET Core 版本不支持的问题
  • .NET 反射的使用
  • .NET 事件模型教程(二)
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .NET面试题(二)
  • .NET项目中存在多个web.config文件时的加载顺序
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @SuppressWarnings注解
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [1]-基于图搜索的路径规划基础
  • [2]十道算法题【Java实现】