hdoj4027【线段树】
2024-08-25 09:18:58
题意:
给你一个序列,然后给出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("");
}
}
最新文章
- 使用--gc-section编译选项减小程序体积
- 3、python,read(),readlines()和readline()
- Joblogs&mdash;&mdash;ContentValues的使用
- IOS - 唯一标识符的获得和更新
- Nginx 反向代理、负载均衡、页面缓存、URL重写以及读写分离
- IOS 友盟使用详解
- C#中 += (s, e) =>; 这些字符什么意思
- SQL SERVER数据库修改是否区分大小写
- Visual Studio 2013密钥
- 简单模拟Hibernate的主要功能实现
- js 连续赋值
- SharePoint 2013 弹窗效果之本地HTML打开方式(二)
- 轻量级GUI enlightenment
- [Ext JS 4] 实战之Grid, Tree Gird编辑Cell
- JavaScriptSerializer类 对象序列化为JSON,JSON反序列化为对象
- tastypie Django REST framework API [Hello JSON]
- PHPMailer发送邮件失败:SMTP connect failed
- web.xml中三种通配符及匹配规则
- struts2拦截器执行模拟 参考马士兵老师
- Delphi 统计Word文档中的字数
热门文章
- poj 1694 An Old Stone Game 树形dp
- time machine不备份指定文件夹
- VS2013 update4+Cocos2d-x 3.7 Win8下安装方法及配置
- C++ 学习总结 复习篇
- wamp配置虚拟域名
- Java堆内存与栈内存对比
- Android研究之游戏开发摄像头更新
- mvc4中 @Url.Action 如何读取javascript变量的值
- POJ 1703 Find them, Catch them(种类并查集)
- 解决gradle多模块依赖在Idea中能运行,gradle build失败的问题。