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 |
哪位大大,能帮忙看看,我的线段树??TLE#include<iostream> #define N 10000 #define MAXINT 10000000 using namespace std; struct node { int s,e; int count; int poster; node *lchild,*rchild; }; node* create(node *root,int a,int b) { root=(node*)malloc(sizeof(node)); root->s=a; root->e=b; root->count=0; root->poster=-1; root->lchild=root->rchild=NULL; if(b-a==1) { root->lchild=create(root->lchild,a,(a+b)/2); root->rchild=create(root->rchild,(a+b)/2+1,b); } if(b-a>1) { root->lchild=create(root->lchild,a,(a+b)/2); root->rchild=create(root->rchild,(a+b)/2,b); } return root; } void insert(node *root,int a,int b,int poster) { if(root==NULL) return ; int mid=(root->s+root->e)/2; if(a<=root->s&&b>=root->e) { root->count++; root->poster=poster; insert(root->lchild,a,b,poster); insert(root->rchild,a,b,poster); } else { if(a<=mid) { root->poster=-1; insert(root->lchild,a,b,poster); } if(b>=mid) { root->poster=-1; insert(root->rchild,a,b,poster); } } } int find(node *root,int a,int b,int poster) { if(root==NULL) return 0; int mid=(root->s+root->e)/2; if(root->s<=a&&root->e>=b) { if(root->poster!=-1&&root->poster!=poster) return 0; } if(a<=root->s&&b>=root->e&&(root->count>0&&root->poster==poster)) return 1; else { if(a<=mid) return find(root->lchild,a,b,poster); if(b>=mid) return find(root->rchild,a,b,poster); } return 0; } struct line { int x; int y; }; line l[N+1]; node *root; int n; int pmax,pmin; int max(int x,int y) { if(x>y) return x; else return y; } int min(int x,int y) { if(x<y) return x; else return y; } void input() { pmax=-10000001; pmin=10000001; int i,m1,m2; for(i=1;i<=n;i++) { scanf("%d%d",&l[i].x,&l[i].y); m1=max(l[i].x,l[i].y); m2=min(l[i].x,l[i].y); if(pmax<m1) pmax=m1; if(pmin>m2) pmin=m2; } } int main() { // freopen("pku_2528.in","r",stdin); int CASE,i; scanf("%d",&CASE); while(CASE--) { int count=0; scanf("%d",&n); input(); root=create(root,pmin,pmax); for(i=1;i<=n;i++) insert(root,l[i].x,l[i].y,i); for(i=1;i<=n;i++) if(find(root,l[i].x,l[i].y,i)) count++; printf("%d\n",count); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator