【线段树】 SPOJ 2713 Can you answer these queries IV
更新操作:一段区间内的全部数开根号
查询操作:一段区间内的sum值
在一个值更新操作十几次之后会变成 1 之后就不需要再更新这段了
所以在update 某个区间 r-l+1==sum[rt] j就return
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <cmath>
using namespace std;
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#define cler(arr, val) memset(arr, val, sizeof(arr))
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define IN freopen ("in.txt" , "r" , stdin);
#define OUT freopen ("out.txt" , "w" , stdout);
typedef long long LL;
const int MAXN = 120000;
const int MAXM = 200000;
const int INF = 0x3f3f3f3f;
const int mod = 1000000007;
const double eps= 1e-8;
#define lson l,m, rt<<1
#define rson m+1,r,rt<<1|1
LL sum[MAXN<<2];
void pushup(int rt)
{sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt)
{if(l==r){scanf("%lld",&sum[rt]);return ;}int m=(l+r)>>1;build(lson);build(rson);pushup(rt);
}
LL query(int L,int R,int l,int r,int rt)
{if(L<=l&&r<=R)return sum[rt];int m=(l+r)>>1;LL res=0;if(L<=m) res+=query(L,R,lson);if(R>m) res+=query(L,R,rson);return res;
}
void update(int L,int R,int l,int r,int rt)
{if(r-l+1==sum[rt]&&L<=l && r<=R)return ;if(l==r){sum[rt]=(LL)sqrt(sum[rt]*1.0);return ;}int m=(l+r)>>1;if(L<=m) update(L,R,lson);if(R>m) update(L,R,rson);pushup(rt);
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);//freopen("out.txt", "w", stdout);
#endifint m,n,cas=0,flag=0;while(scanf("%lld",&n)!=EOF){build(1,n,1);scanf("%d",&m);printf("Case #%d:\n",++cas);for(int i=0;i<m;i++){int ls,rs,op;scanf("%d%d%d",&op,&ls,&rs);if(rs<ls)swap(ls,rs);if(op)printf("%lld\n",query(ls,rs,1,n,1));else update(ls,rs,1,n,1);}puts("");}return 0;
}
转载于:https://www.cnblogs.com/kewowlo/p/4088319.html
【线段树】 SPOJ 2713 Can you answer these queries IV相关推荐
- 【线段树】GSS5 - Can you answer these queries V(luogu-SPOJ 2916)
正题 luogu-SPOJ 2916 题目大意 给你一个序列,有若干询问,每次给出左右端点的区间,问你最大字段和 解题思路 用线段树维护区间信息,询问的区间如果有交则分类讨论求解 code #incl ...
- 【SPOJ】2713 Can you answer these queries IV
操作: 1,把[x,y]每个数k变成sqrt(k),向下取整. 2,查询区间的和. 就算10^18,sqrt后减少的很快. 当一个数为0或1时,它不会再变化了,把不会变化的区间标记,不再访问. 所以暴 ...
- SPOJ GSS2 Can you answer these queries II (线段树离线) - xgtao -
Can you answer these queries II 这是一道线段树的题目,维护历史版本,给出N(<=100000)个数字(-100000<=x<=100000),要求求出 ...
- SPOJ - GSS3 Can you answer these queries III(线段树+区间合并)
题目链接:点击查看 题目大意:给出一个长度为n的序列,进行m次操作: 1 x y 查询区间[l,r]中的最大连续子段和 0 x y 将第x个数修改为y 题目分析:因为涉及到单点修改和区间查询等操作 ...
- [SPOJ] 1043 Can you answer these queries I [GSS1]
Pro 给你一个序列{A[1], A[2], ..., A[N]}.( |A[i]| ≤ 15007 , 1 ≤ N ≤ 50000 ) 给定"查询"操作的定义如下: Query( ...
- SPOJ 4487 Can you answer these queries VI
SPOJ_4487 其实这个题目和GSS1是差不多的,只不过由于有增加和删除的操作,这样用线段树就搞不定了,因此可以维护一个splay来实现这些操作. 但是一开始我写出的程序总是TLE,而和网上一些A ...
- SPOJ GSS2 Can you answer these queries II
很好的一道题,想了很久.首先突破的是,可以找到枚举其中一边,假设是尾部y,然后快速找出满足条件的最大的头部x,连续区间的和 很容易想到借助部分和的思想,如果是从y开始往前面累加,那么就是一个关于y的后 ...
- spoj 2916. Can you answer these queries V(线段树)
题目链接:http://www.spoj.com/problems/GSS5/ 题意:给出n个数,求区间最大子段和,但是限制了子段的起点终点,起点要在[x1,y1]内,终点要在[x2,y2]内. 思路 ...
- 解题报告:SP2713 GSS4 - Can you answer these queries IV(GSS线段树八部曲之四)
x>yx>yx>y是真的艹. 然后就是一道模板题了. #include<bits/stdc++.h>using namespace std; typedef long l ...
最新文章
- 计算机组成原理实验pc,计算机组成原理实验报告5- PC实验
- 《预训练周刊》第14期:World-GAN:Minecraft 世界的生成模型、CMU博士论文探究可控文本生成...
- iphone开发 ---- GPS
- linux没有交换分区会怎样,linux – 服务器拒绝使用交换分区
- 聚簇索引与非聚簇索引学习总结
- 2017.8.7 数学作业 思考记录
- 7、扫雷游戏地雷数计算
- 微信公众号H5支付遇到的那些坑
- c ++中字符串长度的_C ++中的字符串长度
- SpringBoot 中 get/post 请求处理方式,以及requestboy为Json时的处理
- 25.211 -- 物理层信道
- visio2007大括号_Microsoft Office Visio如何绘制大括号及其他特殊符号?Microsoft Office Visio绘制大括号及其他特殊符号的方法教程...
- Halcon区域形状特征-area_center、area_holes、select_shape、inner_circle和smallest_rectangle2算子
- 如何有效地阅读技术书籍
- 个人的生活经历和实习经历
- 谈谈怎么可以得到显著性图 特征图 featuremap 深度学习的可解释性 卷积神经网络表征可视化研究综述
- 从《江南百景图》厨艺大赛说起,聊聊博弈和“奶油系统”
- Font-Spider 一个神奇的网页中文字体工具,就是这么任性
- 老照片修复软件有哪些?我只告诉你这几个
- java 代码名称转换_计算机编码基础知识及Java中编码转换