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

50题留念~线段树无限TLE,果然树状数组更适合我

Posted by a799581229 at 2014-08-04 16:29:41 on Problem 2352
用线段树搞了一下午都是TLE,用树状数组十分钟解决,靠,
这是我的TLE的线段树代码:
#include<iostream>
#include<string>
#include<fstream>
using namespace std;

int Sum[16000];

typedef struct STAR
{
    int   left;
     int right;
     int cover;  
    STAR   *leftchild;
    STAR   *rightchild;    
};

STAR * build(int   l ,  int r ) 
{
    STAR *root=new STAR;
	root->cover=0;
    root->left = l;
    root->right = r;     
    root->leftchild = NULL;
    root->rightchild = NULL;

    if ( l +1<= r )
    {
       int  mid = (r+l) /2;
       root->leftchild = build ( l , mid ) ;
       root->rightchild = build ( mid+1  , r) ; 
    } 

    return   root; 
}

void bianli(STAR *root)
{
	if(root!=NULL)
	{	 
		printf("%d-%d\n",root->left,root->right);
		bianli(root->leftchild);
		bianli(root->rightchild);
	}
}

void  Insert(int c, int d , STAR  *root )
{     
	if(root==NULL) return ;
	int mid=(root->left+root->right)/2;
	if(c==root->left&&d==root->right) 
		root->cover++;
    else
	{	
		root->cover++;
		if(d<=mid)
			Insert(c,d,root->leftchild);
		else if(c>mid)
			Insert(c,d,root->rightchild);
	}
}

int  Count(STAR *root,int c,int d)
{
    int  mid;
	if(root==NULL) return 0;
	mid=(root->left+root->right)/2;
	if(root->left==c&&root->right==d)
		 return root->cover;
	else
	{
	    if(d<=mid)
			return Count(root->leftchild,c,d);
		 else 
		 {
			return Count(root->leftchild,c,mid)+Count(root->rightchild,mid+1,d);
		 }
	}	
}

void shanchu(STAR *root,STAR *p1,STAR *p2){
	if(root!=NULL)
	{
		p1=root->leftchild;
	    p2=root->rightchild;
	    free(root);
		shanchu(p1,p1,p2);
		shanchu(p2,p1,p2);
	}
}

int main()
{
	int n,i,j,x,y,s;
	STAR *root;
	scanf("%d",&n);
	root=build(0,32100);
	for(i=0;i<n;i++)
		Sum[i]=0;
	for(i=0;i<n;i++)
	{
		scanf("%d%d",&x,&y);
		s=Count(root,0,x);
		Sum[s]++;
		Insert(x,x,root);
	}
	for(i=0;i<n;i++)
		printf("%d\n",Sum[i]);
	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