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 |
实在没办法了,贴一下自己WA的代码(有详细的注释),哪位大牛帮我看一下,或者给几组我过不了的数据,小弟不胜感激!!In Reply To:排序后直接扫描A了,但排序后离散化+树状数组却狂WA,无语了。。。 Posted by:new_begin at 2009-09-20 01:43:51 #include<iostream> #include<algorithm> using namespace std; const int N=50005; struct point { int x,y; bool operator<(const point&bb)const { if(x!=bb.x) return x>bb.x; return y>bb.x; } } p[N]; struct node { int y,num; bool operator<(const node&bb)const { return y<bb.y; } } q[N]; int a[N],yy[N]; int n; int lowbit(int x) { return x&(-x); } int getsum(int x) { int i,sum; if(x==0) return 0; sum=0; i=x; while(i>0) { sum+=a[i]; i-=lowbit(i); } return sum; } void change(int x) { int i=x; while(i<=n) { a[i]++; i+=lowbit(i); } return; } int main() { int i,j,sum,u,v; while(scanf("%d",&n)==1&&n) { i=1; while(i<=n) { scanf("%d%d",&p[i].x,&p[i].y); i++; } sort(p+1,p+n+1);//对x坐标排序,如果x坐标相等,按y坐标排序。 //离散化,离散化后的y坐标值保存在yy数组中。 i=1; while(i<=n) { q[i].y=p[i].y; q[i].num=i; i++; } sort(q+1,q+n+1); j=1; yy[q[1].num]=1; i=2; while(i<=n) { if(q[i].y!=q[i-1].y) { ++j; yy[q[i].num]=j; } else yy[q[i].num]=j; i++; } //树状数组。 memset(a,0,sizeof(a)); change(yy[1]);//每插入一个y值,就在树状数组相应点加1。 sum=1; i=2; while(i<=n) { change(yy[i]); u=getsum(yy[i]); v=getsum(yy[i]-1); //当前y值比之前插入的y值都要大,则sum加1,即1到yy[i]得和为i,而yy[i]这点为1。 if(u==i&&v==i-1) sum++; i++; } printf("%d\n",sum); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator