hdu1754
线段树的问题,不知道为什么我的代码老是runtime error ,哪位大牛能告诉我啊
#include <stdio.h> int max(int d,int b)//这里如果用inline会加速好多啊 { return d>b?d:b; } #define MAXN 2000000 int a[MAXN+5]; struct node { int left; int right; int sum; } b[MAXN*2]; void build(int left , int right , int i)//为left,right ,sum赋值 { int mid; b[i].left=left; b[i].right=right; if(left==right) { b[i].sum=a[left]; return ; } mid=(left+right)/2; build(left,mid,2*i); build(mid+1,right,2*i+1); b[i].sum=max(b[2*i].sum , b[2*i+1].sum); } void Update(int id,int value,int i) { if(b[i].left==b[i].right) { b[i].sum=value; return ; } int mid =(b[i].left+b[i].right)/2; if(mid>=id) Update(id,value,2*i); if(id>mid) Update(id ,value,2*i+1); b[i].sum=max(b[i*2].sum , b[2*i+1].sum);//注意更新的时候不仅更新子节点,还要更新父节点 } int Query(int left, int right,int i) { int mid; if(b[i].left==left && b[i].right ==right) return b[i].sum; mid=(b[i].left+b[i].right)/2; if(right<=mid) return Query(left,right,2*i); if (left>mid ) return Query(left,right,2*i+1); if(left<=mid && mid<right) return max(Query(left,mid,2*i) , Query(mid+1,right,2*i+1)); } int main() { int n,m; char c; int id,value; int i; while(scanf("%d%d",&n,&m)!=EOF) { //scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { scanf("%d",&a[i]); } build(1,n,1); for(i=0;i<m;i++) { scanf("%c",&c); scanf("%d%d",&id,&value); if(c=='U') Update(id,value,1); if(c=='Q') printf("%d\n",Query(id,value,1)); } } return 0; }
终于知道哪错了,有两个地方,第一b[]数组开小了,至少要三倍或者四倍a[]数组,第二输入char c时有误,要用char c[3],要输入一个字符串,因为单独输入一个字符的话会把回车给独到
char c 中,在最下面贴最新的代码
另外附一个能A的
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 const int MAXN=2000000; 6 7 int n,m,a[MAXN+5]; 8 9 struct tree 10 { 11 int l,r; 12 13 int v; 14 15 }trees[MAXN*2]; 16 17 int max(int k,int l) 18 { 19 return k>l?k:l; 20 } 21 22 void buildtree(int rs,int l,int r) 23 { 24 //printf("%d %d %d\n",rs,l,r); 25 trees[rs].l=l; 26 trees[rs].r=r; 27 if(r==l) 28 { 29 trees[rs].v=a[l]; 30 return ; 31 } 32 33 int mid=(l+r)/2; 34 35 buildtree(rs*2,l,mid); 36 buildtree(rs*2+1,mid+1,r); 37 38 trees[rs].v=max(trees[rs*2].v,trees[rs*2+1].v); 39 } 40 41 void update(int rs,int k,int l) 42 { 43 //printf("%d %d %d %d %d\n",rs,k,l,trees[rs].l,trees[rs].r); 44 45 if(trees[rs].l==k&&trees[rs].r==k) 46 { 47 trees[rs].v=l; 48 return ; 49 } 50 51 int mid=(trees[rs].l+trees[rs].r)/2; 52 53 if(k<=mid)update(rs*2,k,l); 54 if(k>mid)update(rs*2+1,k,l); 55 56 trees[rs].v=max(trees[rs*2].v,trees[rs*2+1].v); 57 } 58 59 int querry(int rs,int l,int r) 60 { 61 //printf("%d %d %d\n",rs,l,r); 62 if(trees[rs].l==l&&trees[rs].r==r) 63 return trees[rs].v; 64 65 int mid=(trees[rs].l+trees[rs].r)/2; 66 67 if(r<=mid)return querry(rs*2,l,r); 68 if(l>mid)return querry(rs*2+1,l,r); 69 if(l<=mid&&r>mid) 70 return max(querry(rs*2,l,mid),querry(rs*2+1,mid+1,r)); 71 72 return 0; 73 } 74 75 int main() 76 { 77 int i,ac,bc; 78 79 char c; 80 81 while(scanf("%d%d",&n,&m)!=EOF) 82 { 83 for(i=1;i<=n;i++) 84 scanf("%d",&a[i]); 85 86 buildtree(1,1,n); 87 88 for(i=1;i<=m;i++) 89 { 90 getchar(); 91 92 scanf("%c%d%d",&c,&ac,&bc); 93 94 if(c=='Q') 95 printf("%d\n",querry(1,ac,bc)); 96 else 97 update(1,ac,bc); 98 } 99 } 100 101 return 0; 102 }