Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

up

Posted by insotc at 2009-09-15 23:15:06
In Reply To:求教,网络赛farming题,这个四分树有问题吗? Posted by:insotc at 2009-09-15 11:13:20
> zoj 3245
> zoj网络赛farming那道题,第一次写四分树,哪里有问题吗,或者这种方法有问题? 
> 提交一直RE 
> #include <iostream>
> using namespace std;
> //动态四分树 
> typedef long long Int64;
> struct node{
>        node *n1,*n2,*n3,*n4;
>        int ma,xl,xr,yt,yb;
>        int full;
> }no[201000];
> 
> int nocnt;
> //申请节点编号,测试用 
> int k(){
> 	if(nocnt==201000){ while(1); }
>     else {
>         nocnt++;
>         return nocnt-1;
>     }
> }       
> //将叶节点四分 
> void co(node *now){
>     int xmid=(now->xl+now->xr)/2;
>     int ymid=(now->yt+now->yb)/2;
>     now->n1=&no[k()];
>     now->n2=&no[k()];
>     now->n3=&no[k()];
>     now->n4=&no[k()];
>     now->n1->full=1;
>     now->n1->ma=now->ma;
>     now->n2->full=1;
>     now->n2->ma=now->ma;
>     now->n3->full=1;
>     now->n3->ma=now->ma;
>     now->n4->full=1;
>     now->n4->ma=now->ma;
>     now->n1->xl=now->n3->xl=now->xl;
>     now->n1->yt=now->n2->yt=now->yt;
>     now->n2->xr=now->n4->xr=now->xr;
>     now->n3->yb=now->n4->yb=now->yb;
>     now->n1->xr=now->n3->xr=now->n2->xl=now->n4->xl=xmid;
>     now->n1->yb=now->n2->yb=now->n3->yt=now->n4->yt=ymid;
>     now->n1->n1=now->n2->n1=now->n3->n1=now->n4->n1=NULL;
>     return ;
> }
> //修改,记录最值 
> void mod(node *now,int xl,int xr,int yt,int yb,int k){
>     if(xl<now->xl||xr>now->xr||yt<now->yt||yb>now->yb)while(1);
>     int xmid=(now->xl+now->xr)/2;
>     int ymid=(now->yt+now->yb)/2;
>     if(xl==now->xl&&xr==now->xr&&yt==now->yt&&yb==now->yb){
>         if(now->full==1){
>             if(now->ma<k)now->ma=k;
>         }
>         
> 		else {
>             mod(now->n1,xl,xmid,yt,ymid,k);
>             mod(now->n2,xmid,xr,yt,ymid,k);
>             mod(now->n3,xl,xmid,ymid,yb,k);
>             mod(now->n4,xmid,xr,ymid,yb,k);
>         }   
>     }
>     else {
>         if(now->full==1){
>             now->full=0;
>             co(now);
>         }
>         if(xl<xmid&&yt<ymid){
>             if(xr>xmid&&yb>ymid){
>                 mod(now->n1,xl,xmid,yt,ymid,k);
>                 mod(now->n2,xmid,xr,yt,ymid,k);
>                 mod(now->n3,xl,xmid,ymid,yb,k);
>                 mod(now->n4,xmid,xr,ymid,yb,k);
>             }
>             if(xr<=xmid&&yb>ymid){
>                 mod(now->n1,xl,xr,yt,ymid,k);
>                 mod(now->n3,xl,xr,ymid,yb,k);
>             }
>             if(xr>xmid&&yb<=ymid){
>                 mod(now->n1,xl,xmid,yt,yb,k);
>                 mod(now->n2,xmid,xr,yt,yb,k);
>             }
>             if(xr<=xmid&&yb<=ymid){
>                 mod(now->n1,xl,xr,yt,yb,k);
>             }
>         }
>         else if(xl>=xmid&&yt<ymid){
>             if(yb>ymid){
>                 mod(now->n2,xl,xr,yt,ymid,k);
>                 mod(now->n4,xl,xr,ymid,yb,k);
>             }
>             else {
>                 mod(now->n2,xl,xr,yt,yb,k);
>             }
>         }
>         else if(xl<xmid&&yt>=ymid){
>             if(xr>xmid){
>                 mod(now->n3,xl,xmid,yt,yb,k);
>                 mod(now->n4,xmid,xr,yt,yb,k);
>             }
>             else {
>                 mod(now->n3,xl,xr,yt,yb,k);
>             }
>         }
>         else if(xl>=xmid&&yt>=ymid){
>             mod(now->n4,xl,xr,yt,yb,k);
>         }  
>     }
>     return ;
> }
> //计算结果 
> Int64 cal(node *now){
>     if(now->full==1){
>         return (Int64)(now->xr-now->xl)*(Int64)(now->yb-now->yt)*now->ma;
>     }
>     else return (Int64)(cal(now->n1)+cal(now->n2)+(Int64)cal(now->n3)+cal(now->n4));
> }
> int main(){
>     int cas,n,m,i,a[5],j,xl,xr,yt,yb,ca=1;
>     cin>>cas;
>     while(cas--){
>         nocnt=0;
>         cin>>n>>m;
>         node *root=&no[k()];
>         root->ma=0;
>         root->full=1;
>         root->n1=NULL;
>         root->xl=0;
>         root->xr=1<<21;
>         root->yt=0;
>         root->yb=1<<21;
>         for(i=1;i<=n;i++)cin>>a[i];
>         for(i=0;i<m;i++){
>             cin>>xl>>yt>>xr>>yb>>j;
>             mod(root,xl+(1<<20),xr+(1<<20),yt+(1<<20),yb+(1<<20),a[j]);
>         }
> 		cout<<"Case "<<ca++<<": "<< cal(root)<<endl;
>         //printf("Case %d: %d\n",ca++,cal(root));
>     }
>     return 0;
> }

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator