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 |
线段树3333ms表示鸭梨很大多!#include<iostream> #include<cstdio> #include<cstring> #define INF 0xFFFFFF #define M 50009 #define Max(a,b) a>b?a:b #define Min(a,b) a>b?b:a using namespace std; struct node { int left,right,min,max; }; node tree[M*3]; struct C { int height,order; }cow[M]; void built(int L,int R,int id) { tree[id].left=L; tree[id].right=R; tree[id].min=INF; tree[id].max=-INF; if(R==L) return ; int mid=(L+R)>>1; built(L,mid,2*id); built(mid+1,R,2*id+1); } void insert(int j,int i) { //printf("%d---\n",i); // system("pause"); if(tree[i].left==j&&tree[i].right==j) { tree[i].min=cow[j].height; tree[i].max=cow[j].height; return; } int mid=(tree[i].left+tree[i].right)/2; if(j<=mid) insert(j,i*2); else if(j>mid) insert(j,i*2+1); else { insert(j,i*2); insert(j,i*2+1); } tree[i].min=Min(tree[i*2].min,tree[i*2+1].min); tree[i].max=Max(tree[i*2].max,tree[i*2+1].max); } int big=-INF,small=INF; void get_ans(int l,int r,int i) { if(tree[i].left>=l&&tree[i].right<=r) { big=Max(big,tree[i].max); small=Min(small,tree[i].min); return ; } int mid=(tree[i].left+tree[i].right)/2; if(r<=mid) get_ans(l,r,i*2); else if(l>mid) get_ans(l,r,i*2+1); else { get_ans(l,mid,i*2); get_ans(mid+1,r,i*2+1); } } int main() { int n,m; while(~scanf("%d%d",&n,&m)) { int a; built(1,n,1); for(int i=1;i<=n;i++) { scanf("%d",&cow[i].height); insert(i,1); } while(m--) { /* for(int i=1;i<n*2;i++) { printf("tree[%d]=%d %d---%d-----%d\n",i,tree[i].left,tree[i].right,tree[i].min,tree[i].max); } */ int b,c; scanf("%d%d",&b,&c); get_ans(b,c,1); printf("%d-----%d\n",big,small); big=-INF; small=INF; } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator