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));        }    }}