HDU 1823 Luck and Love 2 차원 선분 트 리(나무 커버 트 리)

6056 단어 데이터 구조
클릭 하여 링크 열기
Luck and Love
Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5460    Accepted Submission(s): 1364
Problem Description
세상 에서 가장 먼 거 리 는 하늘 끝 과 바다 끝 을 사이 에 두 고 있 는 것 이 아니다.
내 가 니 앞에서
사랑 한 다 는 걸 넌 몰라
                ―― 장 소 현
얼마 전에 와 이 스 키 에 게 결혼 공 고 를 했 습 니 다.예물 이 500 만 원 에 달 했 습 니 다.세상 에,그런데 천문학 적 인 숫자 가 나 왔 습 니 다.얼마나 많은 MM 이 몰 려 들 었 는 지 모 르 겠 습 니 다.그 러 자 골목 에 사람들 이 몰 려 바닥 을 쓸 어 버 린 아 줌 마 까지 몰 려 들 었 습 니 다.
인원 이 너무 많아 와 이 즈 키 는 정 신 없 이 통계 작성 을 모두 메 이 플 아 이 스 잎 에 맡 기 고 혼자 집 으로 달 려 가 쉬 었 다.단풍 과 얼음 잎 이 바 쁘 기 짝 이 없다.그 가 처리 해 야 할 일 은 두 가지 가 있다.하 나 는 MM 의 신청 을 받 아야 하 는 것 이 고,다른 하 나 는 Wiskey 가 요구 에 부 합 된 MM 에서 인연 의 최고 치 를 찾 아 주 는 것 이다.
 
Input
이 문 제 는 여러 개의 테스트 데이터 가 있 는데 첫 번 째 숫자 M 은 다음 에 연속 적 인 M 개의 조작 이 있 음 을 나타 낸다.M=0 일 때 처리 가 중단 된다.
다음은 조작 부호 C.
조작 부호 가'I'일 때 는 MM 신청 이 하나 있 고 그 뒤에 정수 가 하나 이 어 진 다 는 뜻 이 고 H 는 키,부동 소수점 두 개,A 는 발랄 도,L 은 인연 값 을 나타 낸다.(100<=H<=200, 0.0<=A,L<=100.0)
조작 부호 가'Q'일 때 뒤에 네 개의 부동 소수점 이 이 어 지고 H1,H2 는 신장 구간,A1,A2 는 발랄 도 구간 을 나타 내 며 신장 과 발랄 도 요구 에 부합 하 는 MM 중 가장 높 은 인연 을 출력 한다(100<=H1,H2<=200, 0.0<=A1,A2<=100.0)
모든 입력 한 부동 소수점 은 한 소수 만 있 습 니 다.
 
Output
매번 질문 작업 에 대해 한 줄 에서 인연 의 최고 치 를 출력 하고 작은 수 를 유지 합 니 다.
찾 을 수 없 는 질문,출력-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
 

二维线段树入门题。
第一维是高度,第二维是活泼度。
//171MS	5900K
#include
#include
#define M 1007
#define eps 1e-4
using namespace std;
char s[7];
struct Sub_Tree
{
    int left,right,ans;
    int mid(){return (left+right)>>1;}
};
struct Tree
{
    int left,right;
    int mid(){return (left+right)>>1;}
    Sub_Tree subtree[4*M];
}tree[M];

void build_subtree(int l,int r,int i,int fa)
{
    tree[fa].subtree[i].left=l;
    tree[fa].subtree[i].right=r;
    tree[fa].subtree[i].ans=-1;
    if(l==r)return;
    int mid=(l+r)>>1;
    build_subtree(l,mid,i<<1,fa);
    build_subtree(mid+1,r,i<<1|1,fa);
}

void build(int l,int r,int i)
{
    tree[i].left=l;tree[i].right=r;
    build_subtree(0,1000,1,i);
    if(l==r)return;
    int mid=(l+r)>>1;
    build(l,mid,i<<1);
    build(mid+1,r,i<<1|1);
}

void up(int i,int fa)
{
    tree[fa].subtree[i].ans=max(tree[fa].subtree[i<<1].ans,tree[fa].subtree[i<<1|1].ans);
}

void update_subtree(int a,int l,int i,int fa)
{
    if(tree[fa].subtree[i].left==tree[fa].subtree[i].right)
    {
        tree[fa].subtree[i].ans=max(tree[fa].subtree[i].ans,l);
        return;
    }
    int mid=tree[fa].subtree[i].mid();
    if(a<=mid)update_subtree(a,l,i<<1,fa);
    else update_subtree(a,l,i<<1|1,fa);
    up(i,fa);
}

void update(int h,int a,int l,int i)
{
    update_subtree(a,l,1,i);
    if(tree[i].left==tree[i].right)return;
    int mid=tree[i].mid();
    if(h<=mid)update(h,a,l,i<<1);
    else update(h,a,l,i<<1|1);
}

int query_subtree(int a1,int a2,int i,int fa)
{
    if(tree[fa].subtree[i].left>=a1&&tree[fa].subtree[i].right<=a2)return tree[fa].subtree[i].ans;
    int mid=tree[fa].subtree[i].mid();
    int maxx=-1;
    if(a1<=mid)maxx=max(maxx,query_subtree(a1,a2,i<<1,fa));
    if(mid=h1&&tree[i].right<=h2)return query_subtree(a1,a2,1,i);
    int mid=tree[i].mid();
    int maxx=-1;
    if(h1<=mid)maxx=max(maxx,query(h1,h2,a1,a2,i<<1));
    if(mid

h2)swap(h1,h2); if(a1>a2)swap(a1,a2); int maxx=query(h1,h2,int(a1*10),int(a2*10),1); if(maxx<0)printf("-1
"); else printf("%.1f
",maxx/10.0); } } } return 0; }

좋은 웹페이지 즐겨찾기