hdu 1823 Luck and Love 二维线段树
来源:互联网 发布:农村淘宝是什么意思 编辑:程序博客网 时间:2024/05/22 00:35
题意:
共两种操作,
1)I a b c:插入一个MM,身高a,活跃值b,缘分值c。
2)Q a b c d:一次询问,输出身高在[a,b]内,活跃值在[c,d]内的最大缘分值。
共n次操作,开始为空,活跃值和缘分值精确到小数点后一位。
题解:
由于浮点型只有一位小数,所以可以*10来变成int型(注意浮点误差,一开始死在这了,*10竟然也出现误差。。)。之后就是标准的二维线段树了,跟一维线段树类似,不过在判断条件时比较多。这次看别人的写法写在一维数组内了。。汗。浪费了很多空间。
现在写了个标准点二维线段树,空间大幅度下降,时间也下降了一半。
代码:
之后写的代码:
#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <iostream>#include <algorithm>#include <vector>#include <map>#include <queue>#include <stack>using namespace std;const int maxn=110;struct tree1{ int al,ar; int w;};struct tree2{ int hl,hr; tree1 f[maxn*40];}e[maxn*4];void build1(int a,int b,int c,int d){ e[d].f[c].al=a; e[d].f[c].ar=b; e[d].f[c].w=-1; if(a==b)return ; int mid=(a+b)/2; build1(a,mid,2*c,d); build1(mid+1,b,2*c+1,d);}void build2(int a,int b,int x,int y,int c){ e[c].hl=x; e[c].hr=y; build1(a,b,1,c); if(x==y)return; int mid=(x+y)/2; build2(a,b,x,mid,2*c); build2(a,b,mid+1,y,2*c+1);}void update1(int a,int b,int c,int d,int val){ if(e[d].f[c].al==a&&e[d].f[c].ar==b) { if(e[d].f[c].w<val)e[d].f[c].w=val; return ; } int mid=(e[d].f[c].al+e[d].f[c].ar)/2; if(b<=mid)update1(a,b,2*c,d,val); else if(a>mid)update1(a,b,2*c+1,d,val); e[d].f[c].w=max(e[d].f[2*c].w,e[d].f[2*c+1].w);}void update2(int a,int b,int x,int y,int c,int val){ update1(a,b,1,c,val); if(e[c].hl==x&&e[c].hr==y) { return ; } int mid=(e[c].hl+e[c].hr)/2; if(y<=mid)update2(a,b,x,y,2*c,val); else if(x>mid)update2(a,b,x,y,2*c+1,val);}int query1(int a,int b,int c,int d){ if(e[d].f[c].al==a&&e[d].f[c].ar==b) { return e[d].f[c].w; } int mid=(e[d].f[c].al+e[d].f[c].ar)/2; if(b<=mid)return query1(a,b,2*c,d); else if(a>mid)return query1(a,b,2*c+1,d); else return max(query1(a,mid,2*c,d),query1(mid+1,b,2*c+1,d));}int query2(int a,int b,int x,int y,int c){ if(e[c].hl==x&&e[c].hr==y) { return query1(a,b,1,c); } int mid=(e[c].hl+e[c].hr)/2; if(y<=mid)return query2(a,b,x,y,2*c); else if(x>mid)return query2(a,b,x,y,2*c+1); else return max(query2(a,b,x,mid,2*c),query2(a,b,mid+1,y,2*c+1));}int main(){ int n; while(scanf("%d",&n)!=EOF) { if(n==0)break; build2(0,1000,100,200,1); int i,j,k,a,b,x,y,ans; double c,d; char s[2]; for(i=0;i<n;i++) { scanf("%s",s); if(s[0]=='I') { scanf("%d%lf%lf",&a,&c,&d); x=(int)(c*10+0.5); y=(int)(d*10+0.5); update2(x,x,a,a,1,y); } else { scanf("%d%d%lf%lf",&a,&b,&c,&d); x=(int)(c*10+0.5); y=(int)(d*10+0.5); if(a>b)swap(a,b); if(x>y)swap(x,y); //printf("%d %d %d %d\n",x,y,a,b); ans=query2(x,y,a,b,1); if(ans==-1)printf("-1\n"); else printf("%.1f\n",ans/10.0); } } } return 0;}/*#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <iostream>#include <algorithm>#include <vector>#include <map>#include <queue>#include <stack>using namespace std;const int maxn=2100000;struct node{ int al,ar,hl,hr,w;}e[maxn];int maxv=-1;void build(int a,int b,int x,int y,int c){ //if(c>maxv)maxv=c; //printf("%d %d %d %d %d\n",a,b,x,y,c); e[c].al=a;e[c].ar=b;e[c].hl=x;e[c].hr=y; e[c].w=-1; if(a==b&&x==y)return ; int amid=(a+b)/2; int hmid=(x+y)/2; build(a,amid,x,hmid,4*c); if(hmid<y);build(a,amid,hmid+1,y,4*c+1); if(amid<b)build(amid+1,b,x,hmid,4*c+2); if(amid<b&&hmid<y)build(amid+1,b,hmid+1,y,4*c+3);}void update(int a,int b,int x,int y,int c,int val){ if(e[c].al==a&&e[c].ar==b&&e[c].hl==x&&e[c].hr==y) { if(val>e[c].w)e[c].w=val; return ; } int amid=(e[c].al+e[c].ar)/2; int hmid=(e[c].hl+e[c].hr)/2; if(b<=amid&&y<=hmid)update(a,b,x,y,4*c,val); else if(b<=amid&&x>hmid)update(a,b,x,y,4*c+1,val); else if(a>amid&&y<=hmid)update(a,b,x,y,4*c+2,val); else if(a>amid&&x>hmid)update(a,b,x,y,4*c+3,val); e[c].w=max(max(max(e[4*c].w,e[4*c+1].w),e[4*c+2].w),e[4*c+3].w); //printf("%d %d %d %d %d\n",e[c].al,e[c].ar,e[c].hl,e[c].hr,e[c].w);}int query(int a,int b,int x,int y,int c){ if(e[c].al==a&&e[c].ar==b&&e[c].hl==x&&e[c].hr==y)return e[c].w; int amid=(e[c].al+e[c].ar)/2; int hmid=(e[c].hl+e[c].hr)/2; if(b<=amid) { if(y<=hmid)return query(a,b,x,y,4*c); else if(x>hmid)return query(a,b,x,y,4*c+1); else return max(query(a,b,x,hmid,4*c),query(a,b,hmid+1,y,4*c+1)); } else if(a>amid) { if(y<=hmid)return query(a,b,x,y,4*c+2); else if(x>hmid)return query(a,b,x,y,4*c+3); else return max(query(a,b,x,hmid,4*c+2),query(a,b,hmid+1,y,4*c+3)); } else { if(y<=hmid)return max(query(a,amid,x,y,4*c),query(amid+1,b,x,y,4*c+2)); else if(x>hmid)return max(query(a,amid,x,y,4*c+1),query(amid+1,b,x,y,4*c+3)); else return max(max(max(query(a,amid,x,hmid,4*c),query(a,amid,hmid+1,y,4*c+1)), query(amid+1,b,x,hmid,4*c+2)),query(amid+1,b,hmid+1,y,4*c+3)); }}int main(){ int n; while(scanf("%d",&n)!=EOF) { if(n==0)break; build(100,200,0,1000,1); //printf("*%d\n",maxv); int i,j,k,a,b,x,y,ans; double c,d; char s[2]; for(i=0;i<n;i++) { scanf("%s",s); if(s[0]=='I') { scanf("%d%lf%lf",&a,&c,&d); x=(int)(c*10+0.5); y=(int)(d*10+0.5); update(a,a,x,x,1,y); } else { scanf("%d%d%lf%lf",&a,&b,&c,&d); x=(int)(c*10+0.5); y=(int)(d*10+0.5); if(a>b)swap(a,b); if(x>y)swap(x,y); ans=query(a,b,x,y,1); if(ans==-1)printf("-1\n"); else printf("%.1f\n",ans/10.0); } } } return 0;}*/
一开始写的代码,将一堆空间浪费了。。
</pre><pre name="code" class="cpp">#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <iostream>#include <algorithm>#include <vector>#include <map>#include <queue>#include <stack>using namespace std;const int maxn=2100000;struct node{ int al,ar,hl,hr,w;}e[maxn];int maxv=-1;void build(int a,int b,int x,int y,int c){ //if(c>maxv)maxv=c; //printf("%d %d %d %d %d\n",a,b,x,y,c); e[c].al=a;e[c].ar=b;e[c].hl=x;e[c].hr=y; e[c].w=-1; if(a==b&&x==y)return ; int amid=(a+b)/2; int hmid=(x+y)/2; build(a,amid,x,hmid,4*c); if(hmid<y);build(a,amid,hmid+1,y,4*c+1); if(amid<b)build(amid+1,b,x,hmid,4*c+2); if(amid<b&&hmid<y)build(amid+1,b,hmid+1,y,4*c+3);}void update(int a,int b,int x,int y,int c,int val){ if(e[c].al==a&&e[c].ar==b&&e[c].hl==x&&e[c].hr==y) { if(val>e[c].w)e[c].w=val; return ; } int amid=(e[c].al+e[c].ar)/2; int hmid=(e[c].hl+e[c].hr)/2; if(b<=amid&&y<=hmid)update(a,b,x,y,4*c,val); else if(b<=amid&&x>hmid)update(a,b,x,y,4*c+1,val); else if(a>amid&&y<=hmid)update(a,b,x,y,4*c+2,val); else if(a>amid&&x>hmid)update(a,b,x,y,4*c+3,val); e[c].w=max(max(max(e[4*c].w,e[4*c+1].w),e[4*c+2].w),e[4*c+3].w); //printf("%d %d %d %d %d\n",e[c].al,e[c].ar,e[c].hl,e[c].hr,e[c].w);}int query(int a,int b,int x,int y,int c){ if(e[c].al==a&&e[c].ar==b&&e[c].hl==x&&e[c].hr==y)return e[c].w; int amid=(e[c].al+e[c].ar)/2; int hmid=(e[c].hl+e[c].hr)/2; if(b<=amid) { if(y<=hmid)return query(a,b,x,y,4*c); else if(x>hmid)return query(a,b,x,y,4*c+1); else return max(query(a,b,x,hmid,4*c),query(a,b,hmid+1,y,4*c+1)); } else if(a>amid) { if(y<=hmid)return query(a,b,x,y,4*c+2); else if(x>hmid)return query(a,b,x,y,4*c+3); else return max(query(a,b,x,hmid,4*c+2),query(a,b,hmid+1,y,4*c+3)); } else { if(y<=hmid)return max(query(a,amid,x,y,4*c),query(amid+1,b,x,y,4*c+2)); else if(x>hmid)return max(query(a,amid,x,y,4*c+1),query(amid+1,b,x,y,4*c+3)); else return max(max(max(query(a,amid,x,hmid,4*c),query(a,amid,hmid+1,y,4*c+1)), query(amid+1,b,x,hmid,4*c+2)),query(amid+1,b,hmid+1,y,4*c+3)); }}int main(){ int n; while(scanf("%d",&n)!=EOF) { if(n==0)break; build(100,200,0,1000,1); //printf("*%d\n",maxv); int i,j,k,a,b,x,y,ans; double c,d; char s[2]; for(i=0;i<n;i++) { scanf("%s",s); if(s[0]=='I') { scanf("%d%lf%lf",&a,&c,&d); x=(int)(c*10+0.5); y=(int)(d*10+0.5); update(a,a,x,x,1,y); } else { scanf("%d%d%lf%lf",&a,&b,&c,&d); x=(int)(c*10+0.5); y=(int)(d*10+0.5); if(a>b)swap(a,b); if(x>y)swap(x,y); ans=query(a,b,x,y,1); if(ans==-1)printf("-1\n"); else printf("%.1f\n",ans/10.0); } } } return 0;}
0 0
- HDU 1823 Luck and Love 二维线段树 / 矩形树
- HDU 1823 Luck and Love 【二维线段树】
- hdu 1823 Luck and Love 二维线段树
- hdu 1823 Luck and Love(二维线段树)
- hdu -- 1823 Luck and Love(二维线段树)
- hdu 1823 Luck and Love ,二维线段树
- hdu 1823 Luck and Love 二维线段树
- HDU 1823 Luck and Love 二维线段树
- HDU 1823 Luck and Love 二维线段树(树套树)
- hdu 1823 Luck and Love (二维树套树线段树)
- HDU-1823-Luck and Love-二维线段树入门
- hdu 1823 Luck and Love 【二维线段树】
- hdu 1823 Luck and Love(二维线段树)
- HDU 1823 Luck and Love (二维线段树模板)
- HDU 1823 Luck and Love 二维线段树
- hdu-1823-Luck and Love-(二维线段树)
- HDU 1832 Luck and Love (二维线段树)
- HDU 1832:Luck and Love(二维线段树)
- linux lamp 环境搭建
- hdu2048 神、上帝以及老天爷
- 那总是在时尚经典的服装风格
- Linux Makefile
- CentOS安装rpm包时遇到Header V3 DSA signature: NOKEY时解决办法
- hdu 1823 Luck and Love 二维线段树
- UVA141- The Spot Game【运行时间:25ms】
- SQL中DML(数据库操作语言)的使用
- Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE 安卓程序启动报错,
- google-sdk-动态更新手机主题(简单版)
- android 技巧
- SSL通关之keytool 命令(二)
- 迷人的巴宝莉时装附件配置
- 迷人和漂亮的十几岁的明星