SPOJ 2713 线段树(sqrt)
题意:
给你n个数(n <= 100000),然后两种操作,0 x y :把x-y的数全都sqrt ,1 x y:输出 x-y的和。
思路:
直接线段树更新就行了,对于当前的这个区间,如果里面只有0或者1,那么就把他mark上,以后不用在更新了,10^18 更新不了多少次就会变成0或者1的,所以时间复杂度也没多少,每次更新能返回就返回,不能返回就一定要精确到点,然后sqrt,然后查询的话就是一个简单的段询问。
#include<stdio.h>
#include<string.h>
#include<math.h>
#define lson l ,mid ,t << 1
#define rson mid + 1 ,r ,t << 1 | 1
long long sum[440000];
long long mark[440000];
void Pushup(int t)
{
sum[t] = sum[t<<1] + sum[t<<1|1];
mark[t] = (mark[t<<1] & mark[t<<1|1]);
}
void BuidTree(int l ,int r ,int t)
{
mark[t] = sum[t] = 0;
if(l == r)
{
scanf("%lld" ,&sum[t]);
if(sum[t] == 0 || sum[t] == 1)
mark[t] = 1;
return;
}
int mid = (l + r) >> 1;
BuidTree(lson);
BuidTree(rson);
Pushup(t);
return;
}
void Update(int l ,int r ,int t ,int a ,int b)
{
if(mark[t]) return;
if(l == r)
{
sum[t] = (long long)sqrt(sum[t]*1.0);
if(sum[t] == 1 || sum[t] == 0) mark[t] = 1;
return;
}
int mid = (l + r) >> 1;
if(a <= mid) Update(lson ,a ,b);
if(b > mid) Update(rson ,a ,b);
Pushup(t);
}
long long Query(int l ,int r ,int t ,int a ,int b)
{
if(a <= l && b >= r) return sum[t];
int mid = (l + r) >> 1;
long long Ans = 0;
if(a <= mid) Ans = Query(lson ,a ,b);
if(b > mid) Ans += Query(rson ,a ,b);
return Ans;
}
int main ()
{
int i ,n ,m ,cas = 1;
int key ,a ,b;
while(~scanf("%d" ,&n))
{
BuidTree(1 ,n ,1);
scanf("%d" ,&m);
printf("Case #%d:\n" ,cas ++);
while(m--)
{
scanf("%d %d %d" ,&key ,&a ,&b);
int t;
if(a > b)
{
t = a ,a = b ,b = t;
}
if(!key)
{
Update(1 ,n ,1 ,a ,b);
}
else
{
printf("%lld\n" ,Query(1 ,n ,1 ,a ,b));
}
}
printf("\n");
}
return 0;
}
SPOJ 2713 线段树(sqrt)相关推荐
- SPOJ GGS1 线段树
题意:求区间最大的子段和 这题之前写过 然后今天重写了一遍 感觉确实是区间合并的好题 解法:要开四个域 分别是当前段的和 左起连续最大和 右起连续最大和 区间最大子段和 然后询问的时候维护一个当前最大 ...
- SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并
Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...
- SPOJ - DQUERY D-query(莫队/线段树+离线/主席树)
题目链接:点击查看 题目大意:给出一个由n个数组成的序列,再给出m次查询,每次查询区间[l,r]中有多少个不同的数 题目分析:莫队模板题,直接套板子就好了 有点意思的是函数返回值为布尔类型,然后没有r ...
- SPOJ 375 Query on a tree(线段树维护树链剖分)
题目链接:http://www.spoj.com/problems/QTREE/ 题意:给出一个树,两种操作:(1)修改某条边的权值:(2)询问某两个顶点之间边的最大值. 思路:树的路径剖分和线段树维 ...
- SPOJ KGSS Maximum Sum (线段树)
SPOJ KGSS Maximum Sum 题意:求区间最大值与第二大值之和 思路:线段树维护两个最大值 /********************************************** ...
- SPOJ - QTREE Query on a tree(树链剖分+线段树)
题目链接:点击查看 题目大意:给出一棵由n个点组成的树,再给出数个操作,每次操作分为下列几种类型: QUERY x y:询问点x-点y这条路径上的所有边权的最大值 CHANGE x y:将第x条边的权 ...
- SPOJ - GSS3 Can you answer these queries III(线段树+区间合并)
题目链接:点击查看 题目大意:给出一个长度为n的序列,进行m次操作: 1 x y 查询区间[l,r]中的最大连续子段和 0 x y 将第x个数修改为y 题目分析:因为涉及到单点修改和区间查询等操作 ...
- Can you answer these queries V SPOJ - GSS5 (分类讨论+线段树维护区间最大子段和)
recursion有一个整数序列a[n].现在recursion有m次询问,每次她想知道Max { A[i]+A[i+1]+...+A[j] ; x1 <= i <= y1 , x2 &l ...
- D-query SPOJ - DQUERY(求区间不同数的个数)(树状数组||线段树+离散)(主席树+在线)
English Vietnamese Given a sequence of n numbers a1, a2, -, an and a number of d-queries. A d-query ...
最新文章
- 服务器显示接口类型,查看服务器各接口卡情况的命令是:lspci
- 目标检测开源代码汇总 object detection algorithm codes
- python代码需要背吗-Python 的库、方法这么多,写程序的时候能记住吗?
- 使用brew安装Logstash(Mac)
- TCP的三次握手与四次挥手图文
- wxWidgets:wxSpinEvent类用法
- win 7 系统ie浏览器升级11版本后,f12功能不可用的问题
- 启动服务器如何删除文件,在服务器启动时用Filter来删除某种类型的文件
- cnn文本分类python实现_CNN文本分类
- 3299元起!结缘梅奔F1车队,Redmi K50电竞版发布
- MFC消息映射与消息传递内幕
- 基于java的租房系统源代码_基于jsp的租房管理系统-JavaEE实现租房管理系统 - java项目源码...
- 用计算机上初中英语课的方法,如何上好初中英语读写课
- 蓝桥杯 -罗马数字问题
- LA 3713 Astronauts
- x64dbg调试器使用
- 三色螺旋线 -《跟小海龟学Python》案例代码
- 计算机一级excel中模拟运算,2017年计算机一级《MS Office》操作试题及答案
- Greenplum Python专用库gppylib学习——GpArray
- json数据自动生成图表
热门文章
- 优云携手网易云 助力企业“互联网+”转型
- 一种导致android开发时无法生成R.java文件的原因
- 【python】关于控制台的中文输出出现\x形式的问题 python常用包与如何安装
- JSON API免费接口
- Codeforces 1016F	Road Projects
- Spring 依赖注入(二、注入参数)
- jQuery Layer 弹层组件
- [开心]很搞笑的贴图,必看(收藏)
- Java ---- java io / java nio / java net 学习资源汇总
- javaScript年份下拉列表框内容为当前年份及前后50年