Can you answer these queries? (线段树
题意:
初始给你n个数,通过m个操作, 操作0是使区间范围内的每一个a[i]都变成 根号a[i] ,操作1是查询区间范围内数字的和。
思路:
如果一个节点sum[rt]是1的话,根号1还是1,重复遍历这个节点会大大增加计算次数。n和区间左右端点的范围都 <=1e5,所以一个节点最多遍历不超过10次。
如果这个节点sum[rt]是1,那么标记这个节点vis[rt]=1,说明这个节点以后不用往下遍历了。如果一个节点的左右子节点vis[rt<<1]=1, vis[rt<<1|1]==1,那么vis[rt]=1。注意longlong 以及输入要多空一行。
#include<iostream>
#include<cstdio>
#include <cctype>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#include<stack>
#include<queue>
#include<map>
using namespace std;
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
#define se second
#define fi first
const ll mod=1e9+;
const int INF= 0x3f3f3f3f;
const int N=1e5+; ll add[N<<],sum[N<<];
ll a[N<<];
int vis[N<<]; /*
struct node
{
int v,p;
}b[N<<2]; bool cmp(node x,node y)
{
return x.v<y.v;
}*/ void push_up(int rt)
{
sum[rt] = sum[rt<<] + sum[rt<<|] ;
vis[rt] = vis[rt<<] & vis[rt<<|] ; //左右子节点的vis都是1 父节点才是1
}
/*
void push_down(int rt,int ln ,int rn)
{
if(add[rt])
{
add[rt<<1]=add[rt<<1|1]=add[rt];
sum[rt<<1]=add[rt]*ln;
sum[rt<<1|1]=add[rt]*rn;
add[rt]=0;
}
}*/
void Built(int l,int r,int rt)
{
if(l==r)
{
sum[rt]=a[l];
if(sum[rt]<=) vis[rt]=;
return;
}
int m=l+r>>;
Built(l,m,rt<<);
Built(m+,r,rt<<|);
push_up(rt);
} void update(int x,int y,int l,int r,int rt)
{
if(l==r)
{
sum[rt]= 1LL*sqrt(sum[rt]*1.0);
if( sum[rt]<= ) vis[rt]=;
return;
}
int m=l+r>>;
//push_down(rt,m-l+1,r-m);
if(x<=m && !vis[rt<<]) update(x,y,l,m,rt<<);
if(m<y && !vis[rt<<|]) update(x,y,m+,r,rt<<|);
push_up(rt);
} ll Query(int x,int y, int l,int r,int rt)
{
if(x<=l && r<=y)
{
return sum[rt];
}
int m=l+r>>;
//push_down(rt,m-l+1,r-m);
ll ans=;
if(x<=m) ans+=Query(x,y,l,m,rt<<);
if(m<y) ans+=Query(x,y,m+,r,rt<<|);
return ans;
}
int main()
{
int x,y,c=,n,m,q;
while(~scanf("%d",&n) )
{
/*for(int i=1;i<=n;i++) scanf("%d",&b[i].v),b[i].p=i;
sort(b+1,b+1+n,cmp);
int cnt=0;
for(int i=1;i<=n;i++)
{
if(b[i].v != b[i-1].v)
cnt++;
a[b[i].p]=cnt;
}//离散化完毕 */
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
mem(vis,);
mem(sum,);
Built(,n,);
scanf("%d",&m);
printf("Case #%d:\n",++c);
while(m--)
{
scanf("%d%d%d",&q,&x,&y);
if(x>y) swap(x,y);
if(q==)
update(x,y,,n,);
else
printf("%lld\n",Query(x,y,,n,) );
}
cout<<endl;
} }
Can you answer these queries? (线段树的更多相关文章
- HDU 4027 Can you answer these queries? (线段树区间修改查询)
描述 A lot of battleships of evil are arranged in a line before the battle. Our commander decides to u ...
- hdu 4027 Can you answer these queries? 线段树区间开根号,区间求和
Can you answer these queries? Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/sho ...
- HDU4027 Can you answer these queries? —— 线段树 区间修改
题目链接:https://vjudge.net/problem/HDU-4027 A lot of battleships of evil are arranged in a line before ...
- HDU-4027-Can you answer these queries?线段树+区间根号+剪枝
传送门Can you answer these queries? 题意:线段树,只是区间修改变成 把每个点的值开根号: 思路:对[X,Y]的值开根号,由于最大为 263.可以观察到最多开根号7次即为1 ...
- HDU 4027 Can you answer these queries?(线段树,区间更新,区间查询)
题目 线段树 简单题意: 区间(单点?)更新,区间求和 更新是区间内的数开根号并向下取整 这道题不用延迟操作 //注意: //1:查询时的区间端点可能前面的比后面的大: //2:优化:因为每次更新都 ...
- hdu 4027 Can you answer these queries? 线段树
线段树+剪枝优化!!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #includ ...
- HDU4027 Can you answer these queries? 线段树
思路:http://www.cnblogs.com/gufeiyang/p/4182565.html 写写线段树 #include <stdio.h> #include <strin ...
- HDU4027 Can you answer these queries?(线段树 单点修改)
A lot of battleships of evil are arranged in a line before the battle. Our commander decides to use ...
- HDU 4027 Can you answer these queries? (线段树成段更新 && 开根操作 && 规律)
题意 : 给你N个数以及M个操作,操作分两类,第一种输入 "0 l r" 表示将区间[l,r]里的每个数都开根号.第二种输入"1 l r",表示查询区间[l,r ...
- hdu4027Can you answer these queries?(线段树)
链接 算是裸线段树了,因为没个数最多开63次 ,开到不能再看就标记.查询时,如果某段区间被标记直接返回结果,否则继续向儿子节点更新. 注意用——int64 注意L会大于R 这点我很纠结..您出题人故意 ...
随机推荐
- dataTable.NET的column index的不同定義
dataTable.NET是一個jQuery的plug in 第三方的library, 用來實現web page中table的interaction controls, 另外最近有在用的還有Teler ...
- DHCP配置实例(含DHCP中继代理)
https://blog.51cto.com/yuanbin/109759. DHCP配置实例(含DHCP中继代理) 某公司局域网有192.168.1.0/24和192.168.2.0/24这两个 ...
- 12 Spring JdbcTemplate的使用
1.项目搭建 <1>数据库表account对应的账户实体类 package domain; import java.io.Serializable; /** * 账户实体类 */ publ ...
- Java开发笔记(一百一十一)POST方式的HTTP调用
前面介绍了GET方式的HTTP调用,该方式主要用于向服务器索取数据,不管是字符串形式的应答报文,还是二进制形式的网络文件,都属于服务器提供的信息.当然调用方也可以向服务地址传送请求参数,除了通过连接对 ...
- noip2019集训测试赛(二十一)Problem A: Colorful Balls
Problem A: Colorful Balls Description Snuke放了N个一排彩色的球.从左起第i个球的颜色是ci重量是wi她可以通过执行两种操作对这些球重新排序操作1:选择两个相 ...
- Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件,封装函数
总结了一下使用Python对xml文件的解析,用到的模块儿如下: 分别从xml字符串和xml文件转换为xml对象,然后解析xml内容,查询指定信息字段. from xml.dom.minidom im ...
- Sql日期查询-SQL查询今天、昨天、7天内、30天
今天的所有数据:select * from 表名 where DateDiff(dd,datetime类型字段,getdate())=0 昨天的所有数据:select * from 表名 where ...
- 【LEETCODE】43、1002. Find Common Characters
package y2019.Algorithm.array; import java.util.*; /** * @ProjectName: cutter-point * @Package: y201 ...
- Winform 快速开发框架,上位机开发,工控机程序开发,CS程序开发
1.当客户让你做个CS程序时,当你手上一穷二白,所有都要重复造轮,你是不是很烦. 2.但如果有一个通用的,快速开发框架,就可以把你从这些基础的工作解救出来,你专注做业务就好了. 3.本人其中一个项目的 ...
- python3+requests:post请求四种传送正文方式
https://www.cnblogs.com/insane-Mr-Li/p/9145152.html 前言:post请求我在python接口自动化2-发送post请求详解(二)已经讲过一部分了,主要 ...