hdoj4027【线段树】
题意:
给你一个序列,然后给出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【线段树】的更多相关文章
- HDOJ-4027(线段树+区间更新(每个节点更新的值不同))
Can You answer these queries? HDOJ-4027 这道题目和前面做的题目略有不同.以前的题目区间更新的时候都是统一更新的,也就是更新相同的值.但是这里不一样,这里更新的每 ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
- codevs 1080 线段树点修改
先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...
- codevs 1082 线段树区间求和
codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...
- PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
#44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...
- CF719E(线段树+矩阵快速幂)
题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...
- 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序
3779: 重组病毒 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 224 Solved: 95[Submit][Status][Discuss] ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
随机推荐
- Yii 清理缓存
html: <button onclick="clearCache()">ClearCache</button> js: function clearCac ...
- Android--向SD卡读写数据
// 向SD卡写入数据 private void writeSDcard(String str) { try { // 推断是否存在SD卡 if (Environment.getExternalSto ...
- HDU 2018 母牛的故事 [补]
今天刚考完试,和杨曙光玩了RPG,实在不想看题了 /***************************************************/ 母牛的故事 Time Limit: 200 ...
- mvn -v 报错解决办法
由于近期公司需求,我找到了个maven教程:http://wentao365.iteye.com/blog/903396 安装maven其实很简单,就是在Apache官网下载需要的maven包,然后配 ...
- C++中的const完全解析
1. const修饰普通变量和指针 const修饰变量,一般有两种写法:const TYPE value;TYPE const value; 这两种写法在本质上是一样的.它的含义是:const修饰的类 ...
- extjs4 treepanel 多个checkbox先中 多个节点选中 多级节点展开
//<%@ page contentType="text/html; charset=utf-8" %> var checkedNodes = { _data:{}, ...
- ios常用到的第三方库
在iOS开发中不可避免的会用到一些第三方类库,它们提供了很多实用的功能,使我们的开发变得更有效率:同时,也可以从它们的源代码中学习到很多有用的东西. Reachability 检测网络连接 用来检查网 ...
- C语言一个单链表的实现
-- 所谓链表记住一句即可:地址不连续,大家只是握个手而已: list0.c #include<stdio.h> #include<malloc.h> typedef int ...
- 5.3linux下C语言socket网络编程简例
原创文章,转载请注明转载字样和出处,谢谢! 这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后 ...
- CentOS7.2安装Vim8和YouCompleteMe
1.环境 本文使用VMWare虚拟机进行实验,客户机系统是CentOS 7.2最小安装(CentOS-7-x86_64-Minimal-1511.iso) 最终实现效果:安装vim8 + python ...