首页 > 代码库 > 二维线段树
二维线段树
xiaoz 征婚,首先输入M,表示有M个操作。
借下来M行,对每一行 Ih a l I 表示有一个MM报名,H是高度, a是活泼度,L是缘分。
或 Q h1 h2 a1 a2 求出身高在h1 h2 活泼度在a1 a2之间的最大缘分值。
1 #include"iostream" 2 #include"cstdio" 3 #include"cstring" 4 #include"algorithm" 5 using namespace std; 6 struct seg_ment_node 7 { 8 int al; 9 int ar; 10 double dl; 11 }; 12 struct seg_ment_tree 13 { 14 int hl; 15 int hr; 16 struct seg_ment_node next[2100]; 17 }node[300]; 18 #define eps 1e-6 19 void creat_tree(int p,int hll,int hrr); 20 void creat_node(int p,int pp,int all,int arr); 21 void init(); 22 void insert_h(int p,int h,int a,double l); 23 void insert_a(int p,int pp,int a,double l); 24 double search_h(int p,double hl,double hr,double al,double ar); 25 double search_a(int p,int pp,double al,double ar); 26 int main() 27 { 28 int m; 29 int h; 30 double a,l; 31 double hl,hr,al,ar; 32 double hhl,hhr,aal,aar; 33 char oper; 34 creat_tree(1,100,200); 35 while(scanf("%d",&m)==1) 36 { 37 if(m==0) 38 break; 39 init(); 40 while(m--) 41 { 42 getchar(); 43 scanf("%c",&oper); 44 if(oper==‘I‘) 45 { 46 scanf("%d%lf%lf",&h,&a,&l); 47 insert_h(1,h,(int)(a*10+0.1),l); 48 } 49 else if(oper==‘Q‘) 50 { 51 scanf("%lf%lf%lf%lf",&hl,&hr,&al,&ar); 52 if(hl>hr) 53 swap(hl,hr); 54 if(al>ar) 55 swap(al,ar); 56 double ans=search_h(1,hl,hr,al*10,ar*10); 57 if(ans>=0) 58 printf("%.1lf\n",ans); 59 else 60 puts("-1"); 61 } 62 } 63 } 64 return 0; 65 } 66 void init() 67 { 68 for(int i=0;i<300;i++) 69 for(int j=0;j<2100;j++) 70 { 71 node[i].next[j].dl=-1; 72 } 73 return ; 74 } 75 void creat_tree(int p,int hll,int hrr) 76 { 77 node[p].hl=hll; 78 node[p].hr=hrr; 79 creat_node(p,1,0,100); 80 if(hll==hrr) 81 return ; 82 int mid=(hll+hrr)/2; 83 creat_tree(p*2,hll,mid); 84 creat_tree(p*2+1,mid+1,hrr); 85 return ; 86 } 87 void creat_node(int p,int pp,int all,int arr) 88 { 89 node[p].next[pp].al=all; 90 node[p].next[pp].ar=arr; 91 if(all==arr) 92 return ; 93 int mid=(all+arr)/2; 94 creat_node(p,pp*2,all,mid); 95 creat_node(p,pp*2+1,mid+1,arr); 96 return ; 97 } 98 void insert_h(int p,int h,int a,double l) 99 {100 insert_a(p,1,a,l);101 if(node[p].hl==node[p].hr)102 return ;103 int mid=(node[p].hl+node[p].hr)/2;104 if(h<=mid)105 insert_h(p*2,h,a,l);106 else107 insert_h(p*2+1,h,a,l);108 return ;109 }110 void insert_a(int p,int pp,int a,double l)111 {112 if(node[p].next[pp].dl<l)113 node[p].next[pp].dl=l;114 if(node[p].next[pp].al==node[p].next[pp].ar)115 return ;116 int mid=(node[p].next[pp].al+node[p].next[pp].ar)/2;117 if(a<=mid)118 insert_a(p,pp*2,a,l);119 else120 insert_a(p,pp*2+1,a,l);121 return ;122 }123 double search_h(int p,double hl,double hr,double al,double ar)124 {125 double ans=-1;126 if(hl<=node[p].hl&&node[p].hr<=hr)127 return search_a(p,1,al,ar);128 if(node[p].hl==node[p].hr)129 return ans;130 int mid=(node[p].hl+node[p].hr)/2;131 if(hl<=mid)132 ans=max(ans,search_h(p*2,hl,hr,al,ar));133 if(hr>mid)134 ans=max(ans,search_h(p*2+1,hl,hr,al,ar));135 return ans;136 }137 double search_a(int p,int pp,double al,double ar)138 {139 double ans=-1;140 if(al<=node[p].next[pp].al&&node[p].next[pp].ar<=ar)141 return node[p].next[pp].dl;142 if(node[p].next[pp].al==node[p].next[pp].ar)143 return ans;144 int mid=(node[p].next[pp].al+node[p].next[pp].ar)/2;145 if(al<=mid)146 search_a(p,pp*2,al,ar);147 if(ar>mid)148 search_a(p,pp*2+1,al,ar);149 return ans;150 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。