博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 1754
阅读量:7001 次
发布时间:2019-06-27

本文共 2349 字,大约阅读时间需要 7 分钟。

/*ID:billat11LANG:CTASK:namenum*/#include
#include
#include
#include
#include
#include
using namespace std;const int N=200005;struct Node{ int left; int right; int maxScore; int score;}allNode[4*N];int data[N+5];inline int max(int a,int b){ //加了inline速度快了好多,orz~~~ return a>b?a:b;}void build(int l,int r,int n){ if(l==r)//leaf node { allNode[n].left=l; allNode[n].right=r; allNode[n].maxScore=allNode[n].score=data[l]; } else//not leaf node { int mid=(l+r)>>1; allNode[n].left=l; allNode[n].right=r; build(l,mid,2*n); build(mid+1,r,2*n+1); allNode[n].maxScore=max(allNode[2*n].maxScore,allNode[2*n+1].maxScore); }}void print(int l,int r,int n){ if(l==r) { printf("left:%d right:%d max:%d\n",l,r,allNode[n].maxScore); } else { int mid=(l+r)>>1; print(l,mid,2*n); print(mid+1,r,2*n+1); printf("left:%d right:%d max:%d\n",l,r,allNode[n].maxScore); }}int query(int l,int r,int n){ int mid=(allNode[n].left+allNode[n].right)>>1; if((allNode[n].left==l)&&(allNode[n].right==r)) return allNode[n].maxScore; else { if((r<=mid)&&(l>=allNode[n].left)) return query(l,r,2*n); else if((l>mid)&&(r<=allNode[n].right)) return query(l,r,2*n+1); else if((l<=mid)&&(r>mid)) return max(query(l,mid,2*n),query(mid+1,r,2*n+1)); }}void update(int n,int d,int alln){ int mid=(allNode[alln].left+allNode[alln].right)>>1; if((allNode[alln].left==n)&&(allNode[alln].right==n)) { allNode[alln].maxScore=d; int newn=alln>>1; while(newn>=1) { allNode[newn].maxScore=max(allNode[2*newn].maxScore,allNode[2*newn+1].maxScore); newn=newn>>1; } } else { if(n<=mid) update(n,d,2*alln); else if(n>mid) update(n,d,2*alln+1); } /* if(allNode[alln].left==allNode[alln].right) { allNode[alln].maxScore=d; } else { if(n<=mid) update(n,d,2*alln); else if(n>mid) update(n,d,2*alln+1); allNode[alln].maxScore=max(allNode[2*alln].maxScore,allNode[2*alln+1].maxScore); } * */}int main(){ int n,m; char op; while(scanf("%d %d",&n,&m)==2) { for(int i=1;i<=n;i++) scanf("%d",&data[i]); build(1,n,1); //print(1,n,1); for(int i=1;i<=m;i++) { int l,r; scanf("\n%c%d%d",&op,&l,&r); if(op=='Q') { int ans=query(l,r,1); printf("%d\n",ans); } else if(op=='U') { update(l,r,1); } } } //system("pause"); return 0;}

  

转载于:https://www.cnblogs.com/wuzhibin/archive/2012/06/10/2544038.html

你可能感兴趣的文章
淘宝tfs配置
查看>>
漫谈shell脚本
查看>>
passwd shadow文件说明
查看>>
aix 存储管理
查看>>
TCP会绕程序
查看>>
Rsync+inotify实时同步笔记
查看>>
你真的100%相信网络上的试题吗?
查看>>
UI version info of RegionServer Error(hdp3.1 )
查看>>
人工智能各种技术与算法
查看>>
【jUploader】1.0版 基于jQuery文件无刷新上传插件下载及介绍
查看>>
装饰器模式 Decorator 结构型 设计模式 (十)
查看>>
eclipse svn查找你的历史提交记录
查看>>
windows iphone 传输
查看>>
Unity项目中的资源管理
查看>>
MD5
查看>>
用node写个简单的静态服务器
查看>>
H5前端性能测试小结
查看>>
跟我学习Spring Security--在线宠物商店开发(二)
查看>>
css position: absolute、relative详解
查看>>
Linux下Redis-3.0.7版本的安装以及Redis主备的部署(二)
查看>>