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 |
Re:线段树G++TLE C++ACIn Reply To:线段树G++TLE C++AC Posted by:xsjlmzs at 2018-07-13 13:43:50 > #include<cstdio> > #include<iostream> > #include<algorithm> > #include<cmath> > #include<climits> > using namespace std; > const int MAXN =1e6+10; > typedef pair<int,int> P; > int ans[2][MAXN]; > struct tree > { > int l,r; > int maxn; > int minn; > }; > tree arr[MAXN*4+1]; > int a[MAXN]; > P buildtree(int l,int r,int k) > { > arr[k].l=l; > arr[k].r=r; > if(l==r) > { > arr[k].maxn=a[l]; > arr[k].minn=a[l]; > return P(arr[k].maxn,arr[k].minn); > } > int m=(l+r)>>1; > P p1=buildtree(l,m,k<<1); > P p2=buildtree(m+1,r,(k<<1)+1); > int mm=max(p1.first,p2.first); > int mii=min(p1.second,p2.second); > arr[k].maxn=mm; > arr[k].minn=mii; > return P(mm,mii); > } > P query(int L,int R,int l,int r,int k) > { > if(L<=l&&r<=R) > return P(arr[k].maxn,arr[k].minn); > int m=(l+r)>>1; > P p1=P(INT_MIN,INT_MAX),p2=P(INT_MIN,INT_MAX); > if(L<=m) > { > p1=query(L,R,l,m,k<<1); > } > if(R>m) > { > p2=query(L,R,m+1,r,(k<<1)+1); > } > return P(max(p1.first,p2.first),min(p1.second,p2.second)); > } > int main() > { > int n; > while(~scanf("%d",&n)) > { > int k; > scanf("%d",&k); > k--; > for(int i=0;i<n;++i) > { > scanf("%d",&a[i]); > } > buildtree(0,n-1,1); > int p=0; > for(int i=0;k<n;++i,++k) > { > P temp=query(i,k,0,n-1,1); > ans[0][p]=temp.second; > ans[1][p]=temp.first; > p++; > } > for(int i=0;i<2;++i) > { > for(int j=0;j<p;++j) > { > if(j!=p-1) printf("%d ",ans[i][j]); > else printf("%d\n",ans[i][j]); > } > } > } > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator