HDU1754 I hate it
来源:互联网 发布:网络化学 编辑:程序博客网 时间:2024/05/03 23:44
HDU 1754 I hate it
RunError33次后才AC的,坑爹的题啊;
虽然是简单的线段树,但在处理上却不能用递归的方法,只能用循环或者用邻接表;两种的具体实现自己看下面代码吧!!!
循环:
#include<stdio.h>#include<string.h>#define L(t)(t<<1)#define R(t)(t<<1|1)#define MAX 200005struct Node{ int l,r,maxn;}T[MAX<<2];int max(int a,int b){ return a>=b?a:b;}int n,t,key[MAX];void Build(int l,int r,int root){ T[root].l=l;T[root].r=r; if(l==r) {T[root].maxn=key[r];return;} int m=(T[root].l+T[root].r)>>1; Build(l,m,L(root)); Build(m+1,r,R(root)); T[root].maxn=max(T[L(root)].maxn,T[R(root)].maxn);}void modify(int id,int score,int root){ if(T[root].l==id&&T[root].r==id) { T[root].maxn=score; int father=root>>1; while(father>=1)//防止破栈 { T[father].maxn=max(T[L(father)].maxn,T[R(father)].maxn); father>>=1; } return; } int m=(T[root].l+T[root].r)>>1; if(m>=id) modify(id,score,L(root)); else modify(id,score,R(root));}int query(int l,int r,int root){ if(T[root].l==l&&T[root].r==r) return T[root].maxn; int m=(T[root].l+T[root].r)>>1; if(r<=m) return query(l,r,L(root)); else if(l>m) return query(l,r,R(root)); else return max(query(l,m,L(root)),query(m+1,r,R(root)));}int main(){ while(~scanf("%d%d",&n,&t)) { int x,y; char str[10]; for(int i=1;i<=n;i++) scanf("%d",&key[i]); Build(1,n,1); while(t--) { scanf("%s%d%d",str,&x,&y); if(str[0]=='U') modify(x,y,1); else printf("%d\n",query(x,y,1)); } } return 0;}
邻接表:
#include<stdio.h>#include<string.h>#define maxN 200010struct node{ int l,r,ln,rn,maxx;}po[2*maxN];int num,n,m,key[maxN];int max(int x,int y){ return x>y?x:y;}int Buildtree(int l,int r){ int m=num++; po[m].l=l,po[m].r=r; if(r==l)return po[m].maxx=key[r]; int mid=(l+r)>>1; po[m].ln=num; po[m].maxx=max(po[m].maxx,Buildtree(l,mid)); po[m].rn=num; po[m].maxx=max(po[m].maxx,Buildtree(mid+1,r));}void add(int k,int v,int st){ po[st].maxx=max(po[st].maxx,v); if(po[st].l==k&&po[st].r==k)return; int mid=(po[st].l+po[st].r)>>1; if(k<=mid)add(k,v,po[st].ln); else add(k,v,po[st].rn);}int query(int l,int r,int st){ if(po[st].l==l&&po[st].r==r) return po[st].maxx; int mid=(po[st].l+po[st].r)>>1; if(r<=mid)return query(l,r,po[st].ln); else if(l>mid)return query(l,r,po[st].rn); else return max(query(l,mid,po[st].ln),query(mid+1,r,po[st].rn));}int main(){ while(~scanf("%d%d",&n,&m)) { int u,v; char str[10]; num=1; memset(po,0,sizeof(po)); for(int i=1;i<=n;i++) scanf("%d",&key[i]); Buildtree(1,n); while(m--) { scanf("%s%d%d",str,&u,&v); if(str[0]=='U') add(u,v,1); else printf("%d\n",query(u,v,1)); } }}
- hdu1754 I Hate It
- HDU1754 I Hate It
- HDU1754:I Hate It
- HDU1754--I Hate It
- HDU1754 I hate it
- hdu1754 I Hate It
- HDU1754:I Hate It
- hdu1754 I Hate It
- hdu1754 I Hate It
- hdu1754 I Hate It
- hdu1754 I Hate It
- hdu1754 I Hate It
- hdu1754 I Hate it
- HDU1754 I Hate It
- hdu1754 I Hate It
- hdu1754 I Hate It
- HDU1754 I Hate It
- HDU1754 I Hate It
- expriment: 找API的特征码
- asp.net ajax controltoolkit 下载
- Java中finally关键字的使用
- 创建邮件
- gamma function
- HDU1754 I hate it
- jQuery实现动画效果
- 仿ZAKER的windows phone风格主界面
- sed 命令详解
- jquery实现fadeTo透明度的使用
- 清华大学老师的一席话
- C++中智能指针的工作原理和简单实现
- 64位win7系统、64位Myeclipse 10.5的破解步骤
- linux内核学习之进程和线程