HDU1823 Luck and Love, 二维线段树

注意几个问题

  1. 存在两个人, 高度和活泼度一样的话, 取最大值
  2. 注意输入数据, 卡精度
  3. H1>H2, A1>A2
  4. g++如果过不了的话, 试一下C++
/*******************************************************************************
 # Author : Neo Fung
 # Email : neosfung@gmail.com
 # Last modified: 2012-02-04 21:05
 # Filename: HDU1823 Luck and Love.cpp
 # Description : 
 ******************************************************************************/
#ifdef _MSC_VER
// #define DEBUG
#endif

#include <fstream>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <limits.h>
#include <algorithm>
#include <math.h>
#include <numeric>
#include <functional>
#include <ctype.h>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MAX 110
#define INF 1e-6
using namespace std;

struct CNODE
{
  int l,r,max;
  int getlen(){return r-l;};
  int getmid(){return (l+r)>>1;};
  void set(const int &lhs,const int &rhs){l=lhs;r=rhs;}
};
struct NODE
{
  int l,r;
  CNODE child[(10*MAX)<<2];
  int getlen(){return r-l;};
  int getmid(){return (l+r)>>1;};
  void set(const int &lhs,const int &rhs){l=lhs;r=rhs;}
}node[MAX<<2];

void init()
{
  memset(node,'\0',sizeof(node));
}

void sub_build(const int &f,const int &t , const int &l,const int &r)
{
  node[f].child[t].set(l,r);
  node[f].child[t].max=-10;
  if(l==r-1)
  {
    if(node[f].getlen()==1)
      node[f].child[t].max=-10;
    else
      node[f].child[t].max=max(node[L(f)].child[t].max,node[R(f)].child[t].max);
    return;
  }
  int mid=(l+r)>>1;
  sub_build(f,L(t),l,mid);
  sub_build(f,R(t),mid,r);      
  node[f].child[t].max=max(node[f].child[L(t)].max,node[f].child[R(t)].max);
}
void build(const int &t,const int &l1,const int &r1,const int &l2,const int &r2)
{
  node[t].set(l1,r1);
  if(l1==r1-1)
  {
    sub_build(t,1,l2,r2);
    return;
  }
  int mid=(l1+r1)>>1;
  build(L(t),l1,mid,l2,r2);
  build(R(t),mid,r1,l2,r2);
  sub_build(t,1,l2,r2);
}

void sub_update(CNODE *p,const int &t,const int &l,const int &r,const int &val)
{
  if(p[t].l>=l && p[t].r<=r)
  {
    p[t].max=max(val,p[t].max);
    return;
  }
  if(p[t].getlen()==1)
  {
    p[t].max=val;
    return;
  }
  int mid=p[t].getmid();
  if(l<mid)
    sub_update(p,L(t),l,r,val);
  if(r>mid)
    sub_update(p,R(t),l,r,val);
  p[t].max =max(p[L(t)].max,p[R(t)].max);
}

void update(const int &t,const int &l1,const int &r1,
            const int &l2,const int &r2, const int &val)
{
  sub_update(node[t].child,1,l2,r2,val);
  if(node[t].l>=l1 && node[t].r<=r1)
    return;
  if(node[t].getlen()==1)
    return;
  int mid=node[t].getmid();
  if(l1<mid)
    update(L(t),l1,r1,l2,r2,val);
  if(r1>mid)
    update(R(t),l1,r1,l2,r2,val);
}

int sub_query(CNODE *p,const int &t,const int &l,const int &r)
{
  if(p[t].l>=l && p[t].r<=r)
    return p[t].max;
  int mid=p[t].getmid();
  int ans=-10;
  if(l<mid)
    ans = max(ans,sub_query(p,L(t),l,r));
  if(r>mid)
    ans = max(ans,sub_query(p,R(t),l,r));
  return ans;
}
int query(const int &t,const int &l1,const int &r1,const int &l2,const int &r2)
{
  if(node[t].l>=l1 && node[t].r<=r1)
    return sub_query(node[t].child,1,l2,r2);
  if(node[t].l==node[t].r-1) return -10;
  int mid=node[t].getmid();
  int ans=-10;
  if(l1<mid) ans = max(ans,query(L(t),l1,r1,l2,r2));
  if(r1>mid)  ans = max(ans,query(R(t),l1,r1,l2,r2));
  return ans;
}

int main(void)
{
#ifdef DEBUG  
  freopen("../stdin.txt","r",stdin);
  freopen("../stdout.txt","w",stdout); 
#endif  

  int n;
  int n_h,l1,r1,l2,r2,val;
  char ch;
  double lf_a,lf_l,lf_a2;

  while(scanf("%d",&n)&&n);
  {
    init();
    build(1,0,101,0,1001);
    while(n--)
    {
      scanf("%c",&ch);
      if(ch=='I')
      {
        scanf("%d%lf%lf",&n_h,&lf_a,&lf_l);
        l1=n_h-100;
        r1=static_cast<int>((lf_a+INF)*10.0);
        val=static_cast<int>((lf_l+INF)*10.0);
        update(1,l1,l1+1,r1,r1+1,val);
      }
      else if(ch=='Q')
      {
        scanf("%d%d%lf%lf",&l1,&r1,&lf_a,&lf_a2);
        if(l1>r1) swap(l1,r1);
        if(lf_a>lf_a2) swap(lf_a,lf_a2);
        l1-=100;
        r1-=99;
        l2=static_cast<int>((lf_a+INF)*10.0);
        r2=static_cast<int>((lf_a2+INF)*10.0+1.0);
        int ans=query(1,l1,r1,l2,r2);
        if(ans==-10)
          printf("-1\n");
        else
          printf("%.1lf\n",ans/10.0);
      }
      getchar();
    }
  }

  return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值