| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
50题留念~线段树无限TLE,果然树状数组更适合我用线段树搞了一下午都是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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator