题意:

给你一个序列,然后给出m个命令,

每个命令有两种:①:在区间内实现开方;②:求一个区间和;

思路:

一开始没思路啊,这个开方又不像加加减减一起来就好了,开方只能自己玩啊,但是仔细一想一个数也才开8次还是7次,那么直接暴力一发就好了。。。中间判断一下区间值是不是已经都是1了,直接返回就好了。能暴力的话,咱就随便搞搞就好啦

一开始还建树出错了,感觉不对就直接把树输出来看看是不是挂了。。。不过还是要自己检查代码,瞎瘠薄输出不好。。。。

挫code….

#include<cstdio>
#include<math.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
typedef __int64 LL; const int N=100007;
struct st{
int left,right;
LL sum;
LL len;
};
st q[N*4]; void build(int num,int L,int R)
{
q[num].left=L;
q[num].right=R;
if(L==R)
{
scanf("%lld",&q[num].sum);
q[num].len=1;
return;
}
build(2*num,L,(L+R)/2);
build(2*num+1,(L+R)/2+1,R);
q[num].len=R-L+1;
q[num].sum=q[2*num].sum+q[2*num+1].sum;
} void update(int num,int s,int t)
{
if(q[num].left>=s&&q[num].right<=t)
{
if(q[num].sum==q[num].len)
return;
if(q[num].left==q[num].right)
{
q[num].sum=LL(sqrt(q[num].sum));
return;
}
update(2*num,q[num].left,(q[num].left+q[num].right)/2);
update(2*num+1,(q[num].left+q[num].right)/2+1,q[num].right);
q[num].sum=q[2*num].sum+q[2*num+1].sum;
return;
}
int mid=(q[num].left+q[num].right)/2;
if(mid>=t)
update(2*num,s,t);
else if(mid<s)
update(2*num+1,s,t);
else
{
update(2*num,s,mid);
update(2*num+1,mid+1,t);
}
q[num].sum=q[2*num].sum+q[2*num+1].sum;
} LL query(int num,int s,int t)
{
if(q[num].left>=s&&q[num].right<=t)
return q[num].sum;
int mid=(q[num].left+q[num].right)/2;
LL ans=0;
if(mid>=t)
ans+=query(2*num,s,t);
else if(mid<s)
ans+=query(2*num+1,s,t);
else
{
ans+=query(2*num,s,mid);
ans+=query(2*num+1,mid+1,t);
}
return ans;
} int main()
{
int n,m;
int cas=1;
while(~scanf("%d",&n))
{
build(1,1,n);
/*for(int i=1;i<=19;i++)
{
printf("%d %d %lld \n",q[i].left,q[i].right,q[i].sum);
}*/
printf("Case #%d:\n",cas++);
scanf("%d",&m);
while(m--)
{
int t,x,y;
scanf("%d%d%d",&t,&x,&y);
if(x>y)
swap(x,y);
if(t)
printf("%lld\n",query(1,x,y));
else
update(1,x,y);
/*puts("");
for(int i=1;i<=19;i++)
{
printf("%d %d %lld \n",q[i].left,q[i].right,q[i].sum);
}
puts("");*/
}
puts("");
}
}

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

  1. HDOJ-4027(线段树+区间更新(每个节点更新的值不同))

    Can You answer these queries? HDOJ-4027 这道题目和前面做的题目略有不同.以前的题目区间更新的时候都是统一更新的,也就是更新相同的值.但是这里不一样,这里更新的每 ...

  2. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  3. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  4. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  5. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  6. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  7. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  8. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

  9. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

  10. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

随机推荐

  1. POJ 1083 &amp;&amp; HDU 1050 Moving Tables (贪心)

    Moving Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  2. 翻翻git之---&quot;有趣效果&quot;的自己定义View EasyArcLoading

    转载请注明出处:王亟亟的大牛之路 早上写了一个关于MD的文章,下午给编译器调了个色,感觉要上天了.所以为了试颜色就出了这篇文章,让大家一起瞎一下 好了废话不说.这一片给大家介绍一个当做Dialog作用 ...

  3. RPM安装mysql5.6

    原文 http://blog.csdn.net/liumm0000/article/details/18841197 a. 检查MySQL及相关RPM包,是否安装,如果有安装,则移除(rpm –e 名 ...

  4. Indri和Terrier搜索引擎的使用

    介绍 Indri和Terrier都是开源的搜索引擎,当中Indri作为Lemur项目的一个重要部分,具有强大的查询接口,易建索引,可扩展,高效率等长处.能够在SourceForge Lemur Pro ...

  5. Effective C++ 43,44

    43.明智地使用多继承. 多继承带来了极大的复杂性.最主要的一条就是二义性. 当派生类为多继承时,其多个基类有同名的成员时,就会出现二义性.通常要明白其使用哪个成员的.显式地限制修饰成员不仅非常笨拙, ...

  6. Android NDK JNI WARNING: illegal start byte 0x

    今天攻克了JNI WARNING: illegal start byte 0x81这个问题. 问题出现的现象是通过jni调用加密方法,调用之后返回密文内容,结果就出现这个问题. 在国外查找一段时间之后 ...

  7. gcc在出现错误的时候停止编译 -Wfatal-errors

    有时候我们编译一个大的项目的时候.会出现非常多错误使得屏幕堆满了非常多没用的信息.普通情况下我们须要找到首次出现错误的地方,在gcc中加入编译选项能够使编译停止在第一次出现错误的地方: $ gcc - ...

  8. npm WARN uninstall not installed in /Users/hrt0kmt/node_modules: "xxx"

    You may meet this error on home directory. % npm uninstall appium npm WARN uninstall not installed i ...

  9. pyspark mongodb yarn

    from pyspark.sql import SparkSession my_spark = SparkSession \ .builder \ .appName("myApp" ...

  10. JSON和JavaScript对象

    var obj={width:100,height:200},这样的并不叫JSON,并且JSON只是一种数据格式,并不是具体的实例. 但很多人把这样的JS对象当成JSON,下面把这个问题讲清楚 一.J ...