hdu 1754 线段树

来源:互联网 发布:花呗只能在淘宝用吗 编辑:程序博客网 时间:2024/05/21 22:40

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754

题目很基本,线段树的单点更新和区间求最值,前面有相似题,但TLE了几次,感觉没错啊,结果看了下别人的代码,差了个getchar(),原因是如果不加,则会把回车当成字符了,我勒个去...发火发火发火大哭

AC code:

#include<stdio.h>#include<iostream>using namespace std;int a[200002];int max(int a,int b) { return a>b?a:b; }struct T{ int left,right; int Max;}Tree[800001];void InitTree(int left,int right,int num){ if(left==right) {  Tree[num].left=left;  Tree[num].right=right;  Tree[num].Max=a[left];  return ; } else {  Tree[num].left=left;  Tree[num].right=right;  //Tree[num].Max=right;  int mid=(Tree[num].left+Tree[num].right)>>1;  InitTree(left,mid,num<<1);  InitTree(mid+1,right,(num<<1)+1); Tree[num].Max=max(Tree[2*num].Max,Tree[2*num+1].Max);  }}void Update(int x,int change,int num){ if(Tree[num].left==x&&Tree[num].right==x) {  Tree[num].Max=change;  return ; } else {  int mid=(Tree[num].left+Tree[num].right)>>1;  if(x<=mid)  Update(x,change,num<<1);  else  Update(x,change,(num<<1)+1); Tree[num].Max=max(Tree[(num<<1)].Max,Tree[(num<<1)+1].Max);   }}int Search(int st,int ed,int num){    if(Tree[num].left==st&&Tree[num].right==ed) {  return Tree[num].Max; } else {   int mid=(Tree[num].left+Tree[num].right)>>1;   if(ed<=mid)   return Search(st,ed,num<<1);   else if(st>mid)   return Search(st,ed,(num<<1)+1);   else   {    return max(Search(st,mid,(num<<1)),Search(mid+1,ed,(num<<1)+1));   } }}int main(){      int N,M,i,j,s,t;      char str[9];      while(scanf("%d%d",&N,&M)!=EOF)      {   memset(a,0,sizeof(0));   for(j=1;j<=N;++j)   scanf("%d",&a[j]);   InitTree(1,N,1);      while(M--)      {    getchar();              ///////////!!!!!!    cin>>str>>s>>t;    if(str[0]=='Q')    printf("%d\n",Search(s,t,1));    else if(str[0]=='U')    Update(s,t,1);   }  } }
原创粉丝点击