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 <iostream> using namespace std; #define MA 2000000 #define N 100005 struct point{ int begin,end; }; point location[N*4]; int length=0; struct node{ int a,b,max; bool yezhi; }; node str[N*4]; void init(int root,int x,int y); int getmax(int root,int x,int y); int main() { int n,m,i; while(scanf("%d",&n)==1&&n) { scanf("%d",&m); memset(str,0,sizeof(str)); int bef=MA,loc=0; for(i=0;i<n;i++) { int d; scanf("%d",&d); if(bef==MA) { bef=d; location[length].begin=i; } else { if(d!=bef) { bef=d; location[length++].end=i-1; location[length].begin=i; } } } location[length].end=i-1; init(0,0,length); for(i=0;i<m;i++) { int x,y; scanf("%d %d",&x,&y); printf("%d\n",getmax(0,x-1,y-1)); } } return 0; } void init(int root,int x,int y) { if(x==y) { str[root].a=location[x].begin; str[root].b=location[x].end; str[root].max=str[root].b-str[root].a+1; str[root].yezhi=true; } else { init(2*root+1,x,(x+y)/2); str[root].a=str[2*root+1].a; init(2*root+2,(x+y)/2+1,y); str[root].b=str[2*root+2].b; str[root].max=str[2*root+1].max>str[2*root+2].max?str[2*root+1].max:str[2*root+2].max; } } int getmax(int root,int x,int y) { if(x>y) return 0; if(str[root].a>x) x=str[root].a; if(str[root].b<y) y=str[root].b; if(str[root].yezhi) { if(x>y) return 0; else return y-x+1; } else { if(x==str[root].a&&y==str[root].b) return str[root].max; else { int u=getmax(2*root+1,x,y); int v=getmax(2*root+2,x,y); return u>v?u:v; } } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator