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 |
贴个线段树代码,哪位大神帮看看为什么超时啊?#include <stdio.h> #include <stdlib.h> typedef struct tNode{ int left; int right; struct tNode* l; struct tNode* r; int count; }Node; int N; int level[15000]; Node* root; int result; /* 递归创建线段树 */ Node* create_node(int left,int right){ Node* n=(Node*)malloc(sizeof(Node)); n->left=left; n->right=right; n->count=0; n->l=NULL; n->r=NULL; if(left!=right){ int mid=(left+right)/2; n->l=create_node(left,mid); n->r=create_node(mid+1,right); } return n; } /* 根据x坐标更新线段树的count值 */ void insert(Node* node,int value){ if(!node){ return; } node->count++; int mid=(node->left+node->right)/2; if(value<=mid){//走左子还是右子 insert(node->l,value); }else{ insert(node->r,value); } } /* 统计[tleft,tright]的count值 */ void search(Node* node,int tleft,int tright){ int left=node->left; int right=node->right; if(tright<left||tleft>right){//与node区间无交集 return; } if(tleft<=left&&tright>=right){//完全囊括node区间,无须再走孩子 result+=node->count; return; } //部分交集,继续去孩子探索 search(node->l,tleft,tright); search(node->r,tleft,tright); } int main(void){ root=create_node(0,32000); int x,y; int i; scanf("%d",&N); for(i=0;i<N;i++){ scanf("%d %d",&x,&y); result=0; search(root,0,x); level[result]++; insert(root,x); } for(i=0;i<N;i++){ printf("%d\n",level[i]); } return 0; } 目测效率应该可以了呀,自己造的15000行的数据也是秒出,感觉不该超时啊......... Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator