题意:

n个数,m个操作。

1,L,R  询问[L , R] 的总和。

2,L,R  将区间所有数都开根号。

思路:

区间和简单。

主要就是一个 区间所有元素相同的标记Same ,但是这样是不是要求太高?

sqrt 好像就算是1e9,也down的非常快到1了,且这里还没有区间加。

so,只要考虑标记区间是否都是1/0就足够了。

水题。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+10; struct Seg{
int Left,Right;
int Flag;
LL Sum;
}q[N*4]; void Build(int num,int Left,int Right){
q[num].Left=Left;q[num].Right=Right;
if(Left == Right){
scanf("%lld",&q[num].Sum);
if(q[num].Sum==0 || q[num].Sum==1)
q[num].Flag=1;
return;
}
int Mid=(Left+Right)>>1;
Build(num<<1,Left,Mid);
Build(num<<1|1,Mid+1,Right);
q[num].Sum=q[num<<1].Sum+q[num<<1|1].Sum;
q[num].Flag=q[num<<1].Flag&q[2*num|1].Flag;
} void Update(int num,int Left,int Right)
{
if(q[num].Flag) return;
if(q[num].Left==q[num].Right)
{
q[num].Sum=sqrt(q[num].Sum);
if(q[num].Sum==0||q[num].Sum==1) q[num].Flag=1;
return;
}
int Mid=(q[num].Left+q[num].Right)>>1;
if(Mid>=Right) Update(num<<1,Left,Right);
else if(Mid<Left) Update(num<<1|1,Left,Right);
else
{
Update(num<<1,Left,Mid);
Update(num<<1|1,Mid+1,Right);
}
q[num].Sum=q[num<<1].Sum+q[num<<1|1].Sum;
q[num].Flag=q[num<<1].Flag&q[num<<1|1].Flag;
} LL Query(int num,int Left,int Right)
{
if(q[num].Left>=Left && q[num].Right<=Right)
return q[num].Sum;
int Mid=(q[num].Left+q[num].Right)>>1;
if(Mid>=Right) return Query(num<<1,Left,Right);
else if(Mid<Left) return Query(num<<1|1,Left,Right);
else
return Query(num<<1,Left,Mid)+Query(num<<1|1,Mid+1,Right);
} int main()
{
int n,Q;
int op,Left,Right;
scanf("%d",&n);
Build(1,1,n);
scanf("%d",&Q);
while(Q--)
{
scanf("%d%d%d",&op,&Left,&Right);
switch(op){
case 1:printf("%lld\n",Query(1,Left,Right));break;
case 2:Update(1,Left,Right);break;
}
}
return 0;
}

BZOJ 3211【线段树】的更多相关文章

  1. bzoj 3211 线段树

    开方操作最多进行5次就可以把出现的任何数变成1. 所以用线段树暴力修改,以后修改时只需看一下是否当前区间都是0或1,如果是那么就直接返回. /***************************** ...

  2. BZOJ 3211 线段树+并查集

    思路: 我们很容易发现 一个数开根号 开几(很小)次 就到了1 1 再怎么开 都是1 由于这个性质 我们就可以用并查集 了 //By SiriusRen #include <cmath> ...

  3. BZOJ 1798 (线段树||分块)的标记合并

    我原来准备做方差的.. 结果发现不会维护两个标记.. 就是操作变成一个 a*x+b ,每次维护a , b 即可 加的时候a=1 ,b=v 乘的时候a=v ,b=0 #include <cstdi ...

  4. bzoj 3999 线段树区间提取 有序链剖

    看错题目了,想成每个城市都可以买一个东西,然后在后面的某个城市卖掉,问最大收益.这个可以类似维护上升序列的方法在O(nlog^3n)的时间复杂度内搞定 这道题用到的一些方法: 1. 可以将有关的线段提 ...

  5. bzoj 1018 线段树维护连通性

    本题将一道LCT的题特殊化(支持加边和删边,询问图的连通性),将图变成了2×m的网格图,然后就神奇地可以用线段树来维护. 对于每个区间[l,r],维护其四个角落之间的连通性(仅仅通过[l,r]这段的边 ...

  6. bzoj 3212 线段树

    裸的线段树 /************************************************************** Problem: User: BLADEVIL Langua ...

  7. bzoj 2120 线段树套平衡树

    先吐下槽,改了快一个小时,最后发现是SBT的delete写错了,顿时就有想死的心..... 首先对于这道题,我们应该先做一下他的小问题,bzoj1878,虽然和这道题几乎一点关系没有, 但是能给我们一 ...

  8. bzoj 1901 线段树套平衡树+二分答案查询

    我们就建一颗线段树,线段树的每一个节点都是一颗平衡树,对于每个询问来说,我们就二分答案, 查询每个二分到的mid在这个区间里的rank,然后就行了 /************************* ...

  9. BZOJ 1012 线段树||单调队列

    非常裸的线段树  || 单调队列: 假设一个节点在队列中既没有时间优势(早点入队)也没有值优势(值更大),那么显然不管在如何的情况下都不会被选为最大值. 既然它仅仅在末尾选.那么自然能够满足以上的条件 ...

  10. BZOJ 3681 线段树合并+网络流

    思路: 暴力建图有n*m条边 考虑怎么优化 (那就只能加个线段树了呗) 然后我就不会写了..... 抄了一波题解 //By SiriusRen #include <bits/stdc++.h&g ...

随机推荐

  1. Druid:一个用于大数据实时处理的开源分布式系统——大数据实时查询和分析的高容错、高性能开源分布式系统

    转自:http://www.36dsj.com/archives/28590 Druid 是一个用于大数据实时查询和分析的高容错.高性能开源分布式系统,旨在快速处理大规模的数据,并能够实现快速查询和分 ...

  2. 【LeetCode】084. Largest Rectangle in Histogram

    题目: Given n non-negative integers representing the histogram's bar height where the width of each ba ...

  3. Windows 任务管理器中的几个内存概念

    我们使用的大部分 PC 是基于 Intel 微处理器的 x86 和 x64 架构计算机. 因此, 我们面对的 windows 避免不了和 Intel 架构有些设计上的契合. 比如接下来要说到的内存管理 ...

  4. Redo Log File(inactive、active)损坏,处理恢复对策

    redolog的生命周期中共有四种状态:current -> 正在使用的active -> 非正在使用的,对应的Dirty Block还没有完全写入到数据文件中inactive -> ...

  5. QE名词解释以及相关文章链接

    百科: http://baike.baidu.com/link?url=ho-aUG2rZwgjx75rwFu5b3XoQnsuJMj9GrJEuaZxnakg19ofO13mrXCMi9_JZ_VY ...

  6. 孤独地、凄惨地AK

    一个\(OIer\)要写多少\(for\) 才能被称为一个\(OIer\) 一位巨佬要爆过多少次零 才能在省选逆袭 手指要多少次掠过键盘 才能安心地休息 \(OI\)啊 我的朋友 在风中\(AK\) ...

  7. Wireshark抓取本地Tcp包(任何数据包)

    没有任何一个程序员在做项目的时候不会遇到网络编程的问题,要解决这些问题除了对各种网络协议深入了解之外,还需要掌握各种网络分析工具的用法,不用多说wireshark绝对是这方面的翘楚,可惜的是,wire ...

  8. shock编程

    Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socket ...

  9. CCNet说明文档

    1.CCNet安装步骤 1)    安装CCNet服务器端:CruiseControl.NET-1.8.5.0-Setup.exe 2)    安装CCNet客户端:CruiseControl.NET ...

  10. 【转】GitHub使用

    1.设置Git全局用户配置 git config --global user.name "xxx" git config --global user.email xxx@gmail ...