| ||||||||||
| 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