HDOJ 1823 Luck and Love

4354 ワード

2 D線分ツリーテンプレートの問題...
Luck and Love
Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5397    Accepted Submission(s): 1348
Problem Description
世界で一番遠い距離は天地の果てではない.
君の前にいる
あなたは私があなたを爱することを知らない
                ―― 張小?
先日、枫氷の叶がWiskeyに结婚式のお知らせをしました.招聘礼は500万に达しましたよ.なんてことだ.でも、天文数字ですね.何MMが押し寄せてきたのか、すぐに万人が路地裏にいて、掃除のおばさんまでにぎやかになりました.
人数が多すぎて、Wiskeyが忙しくて手が回らないので、統計のことは全部楓氷葉子に任せて、自分で家に帰って休みました.これはカエデの氷の葉が忙しくて、彼が処理しなければならないのは2種類の事があって、1つはMMの申し込みを受け入れなければならなくて、2つはWiskeyを手伝って要求に合ったMMの中で縁の最高値を探します.
 
Input
本題には複数のテストデータがあり、最初の数字Mは、次に連続するM個の操作があることを示し、M=0の場合、処理は中止される.
次はオペレータCです.
オペレータが“I”の时、1つのMMが申し込むことを表して、后ろに1つの整数が続いて、Hは身长を表して、2つの浮動小数点数、Aは活発度を表して、Lは縁の値を表します.(100<=H<=200, 0.0<=A,L<=100.0)
オペレータが「Q」である場合、後から4つの浮動小数点数、H 1、H 2は身長区間、A 1、A 2は活発度区間、身長と活発度の要求に合致するMMの中の縁最高値を出力する.(100<=H1,H2<=200, 0.0<=A1,A2<=100.0)
すべての入力浮動小数点数は、小数点数が1つしかありません.
 
Output
質問操作ごとに、1行に縁の最高値を出力し、小数点を保持します.
見つからない問い合わせに対して、-1を出力します.
 
Sample Input

   
   
   
   
8 I 160 50.5 60.0 I 165 30.0 80.5 I 166 10.0 50.0 I 170 80.5 77.5 Q 150 166 10.0 60.0 Q 166 177 10.0 50.0 I 166 40.0 99.9 Q 166 177 10.0 50.0 0

 
Sample Output

   
   
   
   
80.5 50.0 99.9

 
Author
ウイスキー
 
Source
HDOJ 2007 Summer Exercise(3)- Hold by Wiskey
 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

const double eps=1e-6;
const int maxn=2100;

int xL,xR,yL,yR,Value;
int Max[220<<2][maxn<<2];
int N,M;
int maxv;

void pushup(int xrt,int rt)
{
    Max[xrt][rt]=max(Max[xrt][rt<<1],Max[xrt][rt<<1|1]);
}

void updateY(int xrt,int x,int l,int r,int rt)
{
    if(l==r)
    {
        if(x==-1)
        {
            Max[xrt][rt]=max(Max[xrt<<1][rt],Max[xrt<<1|1][rt]);
        }
        else
        {
            Max[xrt][rt]=max(Max[xrt][rt],Value);
        }
        return ;
    }
    int m=(l+r)/2;
    if(yL<=m) updateY(xrt,x,lson);
    else updateY(xrt,x,rson);
    pushup(xrt,rt);
}

void updateX(int l,int r,int rt)
{
    if(l==r)
    {
        updateY(rt,l,1,M,1);
        return ;
    }
    int m=(l+r)/2;
    if(xL<=m) updateX(lson);
    else updateX(rson);
    updateY(rt,-1,1,M,1);
}

void queryY(int xrt,int l,int r,int rt)
{
    if(yL<=l&&r<=yR)
    {
        maxv=max(maxv,Max[xrt][rt]);
        return ;
    }
    int m=(l+r)/2;
    if(yL<=m) queryY(xrt,lson);
    if(yR>m) queryY(xrt,rson);
}

void queryX(int l,int r,int rt)
{
    if(xL<=l&&r<=xR)
    {
        queryY(rt,1,M,1);
        return ;
    }
    int m=(l+r)/2;
    if(xL<=m) queryX(lson);
    if(xR>m) queryX(rson);
}

int main()
{
    int op;char cmd[20];
    N=200;M=2100;
    while(scanf("%d",&op)!=EOF&&op)
    {
        memset(Max,-1,sizeof(Max));
        while(op--)
        {
            scanf("%s",cmd);
            if(cmd[0]=='I')
            {
                int H;
                double a,l;
                scanf("%d%lf%lf",&H,&a,&l);
                H-=99;
                int A=(int)((a+eps)*10);
                int L=(int)((l+eps)*10);
                xL=H;yL=A;Value=L;
                updateX(1,N,1);
            }
            else if(cmd[0]=='Q')
            {
                int H1,H2;
                double a1,a2;
                scanf("%d%d%lf%lf",&H1,&H2,&a1,&a2);
                int A1=(int)((a1+eps)*10);
                int A2=(int)((a2+eps)*10);
                xL=min(H1,H2)-99,xR=max(H1,H2)-99;
                yL=min(A1,A2),yR=max(A1,A2);
                maxv=-(1<<30);
                queryX(1,N,1);
                if(maxv==-1) printf("-1
"); else printf("%.1lf
",maxv/10.); } } } return 0; }