PKU2482 2叉检索树。_lolihunter的狩猎场_百度空间
我要哭了,这题太折磨了。

又是一个单恋的孩子,很有才。然后就写情书。看星星啊,什么希望我俩看到是一颗星星。给出一个w*h的长方形矩形窗框,每个星星有一个权值,问能框住的{zd0}权值是多少。在边上的星星不算内。

黑书有详细讲解。

简单说说我自己做这题的过程吧。

好吧,这题困我好些时间。最开始用传统线段树做,一个结点记录起始点,终结点,此区间的权值。RE了几次,想一想,哇塞,这一存,极限数据,数组要开到2^32。必然RE了。好吧,传统线段树就搁浅了。

用2叉检索树,也就是黑书对应的那一节,每个节点只存星星中存在的一个y值。然后建树,插入操作和维护如黑书所说。

{zh1}一句,框上的点不属于矩形,只要排好序进行插入。不需考虑这点。证明很简单。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Node
{
__int64 x,y;
int w;      
}node[50005];//存点


__int64 ty[200005];//存y坐标,注意除重点。

__int64 tree[205537];//建树


int tn;
int n,num;
int maxt[205537],sum[205537];//存当前节点{zd0}值,和当前节点值。
__int64 w,h;

int cmp1(const void* a,const void* b)
{
return *(__int64*)a>*(__int64*)b?1:-1;  
}//对y坐标排序。

int len,ans;

int cmp(const void* a,const void* b)
{
if(((struct Node*)a)->x==((struct Node*)b)->x)
{
if(((struct Node*)a)->y==((struct Node*)b)->y)
return ((struct Node*)a)->w-((struct Node*)b)->w;
return ((struct Node*)a)->y-((struct Node*)b)->y;
}
return ((struct Node*)a)->x-((struct Node*)b)->x;   
}//对点排序,依次是x y w。

void create(int v,int star,int end)
{
if(v>tn)
tn=v;
int mid=(star+end)>>1;
tree[v]=ty[mid];
if(star<end)
{
if(star<mid)
create(v*2,star,mid);
if(mid<end)
create(v*2+1,mid+1,end);    
}
return ;
}//对y坐标。建树

int max(int a,int b)
{
return a>b?a:b;   
}


void insert(__int64 y,int w,int v)
{
int i,j,temp1,temp2;

for(i=1;tree[i]!=y;)
{
if(tree[i]<y)
i=i*2+1;
else
i=i<<1;                   
}

for(;i;i=i>>1)
{
sum[i]+=w;
j=i*2;
maxt[i]=max(maxt[j],sum[i]-sum[j+1]);
maxt[i]=max(maxt[i],sum[i]-sum[j+1]+maxt[j+1]);          
}
return ;    
}//插入操作。


int main()
{
while(scanf("%d %I64d %I64d",&n,&w,&h)!=EOF)
{
len=0;
ans=0;
tn=0;
len=0;
memset(maxt,0,sizeof(maxt));
memset(sum,0,sizeof(sum));
for(int i=0;i<n;i++)
{
scanf("%I64d %I64d %d",&node[i].x,&node[i].y,&node[i].w);
node[i+n].x=node[i].x+w;
node[i+n].y=node[i].y;
node[i+n].w=-1*node[i].w;     
}
num=n<<1;
for(int i=0;i<n;i++)
{
bool flag1=false;
bool flag2=false;
__int64 hy1=node[i].y;
__int64 hy2=node[i].y+h;
for(int j=0;j<len;j++)
{
if(ty[j]==hy1)
flag1=true;
if(ty[j]==hy2)
flag2=true;
}
if(!flag1)
ty[len++]=hy1;
if(!flag2)
ty[len++]=hy2;
}
qsort(node,num,sizeof(Node),cmp);
qsort(ty,len,sizeof(__int64),cmp1);


create(1,0,len-1);


for(int i=0;i<num;)
{  
__int64 x=node[i].x;
for(;i<num&&node[i].x==x;i++)
{
insert(node[i].y,node[i].w,1);
insert(node[i].y+h,-1*node[i].w,1);  
}
ans=max(ans,maxt[1]);
}
printf("%d\n",ans);


}
return 0;   
}


郑重声明:资讯 【PKU2482 2叉检索树。_lolihunter的狩猎场_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——