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 |
来一发ST表我的线段树太丑就T了... #include<set> #include<map> #include<queue> #include<stack> #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define RG register ll #define rep(i,a,b) for(RG i=a;i<=b;++i) #define per(i,a,b) for(RG i=a;i>=b;--i) #define ll unsigned long long #define inf (1<<29) #define maxn 80005 #define ls (pos<<1) #define rs (pos<<1|1) #define mid ((t[pos].l+t[pos].r)>>1) using namespace std; ll n,ANS; ll num[maxn],mx[maxn][18]; inline ll read() { ll x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } /* void build(ll pos,ll l,ll r) { t[pos].l=l,t[pos].r=r; if(l==r) {t[pos].mx=num[l];return;} build(ls,l,mid);build(rs,mid+1,r); t[pos].mx=max(t[ls].mx,t[rs].mx); } ll query(ll pos,ll l,ll r) { if(l<=t[pos].l&&t[pos].r<=r) return t[pos].mx; ll ans=0; if(l<=mid) ans=query(ls,l,r); if(r>mid) ans=max(ans,query(rs,l,r)); return ans; } */ void ST() { rep(i,1,n) mx[i][0]=num[i]; rep(j,1,17) rep(i,1,n) if(i+(1<<j)-1<=n) mx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]); } int query(int l,int r) { int len=log(r-l+1)/log(2); return max(mx[l][len],mx[r-(1<<len)+1][len]); } int main() { n=read(); rep(i,1,n) num[i]=read(); //build(1,1,n); ST(); rep(i,1,n) { RG l=i+1,r=n,ans=i,md; while(l<=r) { md=(l+r)>>1; if(query(i+1,md)<num[i]) ans=md,l=md+1; else r=md-1; } ANS+=ans-i; } cout<<ANS; return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator