SPOJ-HJB Segmentation(RMQ+BIT)
生活随笔
收集整理的這篇文章主要介紹了
SPOJ-HJB Segmentation(RMQ+BIT)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
SPOJ-HJB
給出一段長度為n(1≤n≤500000)的數(shù)列A(0≤a[i]≤109),定義f(a,b)=min{A[i]|a≤i≤b}求該數(shù)列的
首先離散化,對于區(qū)間[l,r],RMQ找值最小的位置pos,計算含有這個位置的區(qū)間個數(shù)tot=(pos?l+1)(r?pos)這些區(qū)間的f值都為a[pos],樹狀數(shù)組中求得小于等于它的區(qū)間個數(shù)num,這些區(qū)間的影響為tot?num再加上這個區(qū)間中含有該位置的區(qū)間對答案的影響為(pos?l+1)(r?pos)(r?pos+1)(r?pos+2)6(推導過程略)遞歸處理[l,pos?1],[pos+1,r],最后再把tot插入樹狀數(shù)組中。注意模防止溢出,復雜度為O(nlogn)
#include <cstdio> #include <queue> #include <vector> #include <cstring> #include <algorithm> using namespace std; const int maxn=5e5+7; const int mod=1e9+7; int n,m; int dp[maxn][22]; int mm[maxn],a[maxn]; int bit[maxn]; int inv6; vector<int> hh; void initRMQ(int n,int b[]) {mm[0] = -1;for(int i = 1; i <= n; i++){mm[i] = ((i&(i-1)) == 0)?mm[i-1]+1:mm[i-1];dp[i][0] = i;}for(int j = 1; j <= mm[n]; j++)for(int i = 1; i + (1<<j) -1 <= n; i++){int ll=dp[i][j-1],rr=dp[i+(1<<(j-1))][j-1];if(a[ll]<a[rr])dp[i][j] = ll;elsedp[i][j] = rr;} } int qpow(int a,int b) {long long r=1,x=a;while(b){if(b&1)r=r*x%mod;b>>=1;x=x*x%mod;}return r; } int rmq(int x,int y) {int k = mm[y-x+1];int ll=dp[x][k],rr=dp[y-(1<<k)+1][k];if(a[ll]<a[rr])return ll;elsereturn rr; } int getid(int x) {return lower_bound(hh.begin(),hh.end(),x)-hh.begin()+1; } void add(int x,int d) {while(x<=n){bit[x]=(bit[x]+d)%mod;x+=x&-x;} } int sum(int x) {int res=0;while(x){res=(res+bit[x])%mod;x-=x&-x;}return res; } long long ans=0; void divide(int L,int R) {if(L>R)return ;int pos=rmq(L,R),res=0;int val=getid(a[pos]),rl=R-pos;res=(pos-L+1ll)*rl%mod*(rl+1)%mod*(rl+2)%mod*inv6%mod;long long tot=(pos-L+1ll)*(rl+1)%mod;ans=(ans+tot*sum(val))%mod;ans=(ans+res)%mod;divide(L,pos-1);divide(pos+1,R);add(val,tot); } int main() {inv6=qpow(6,mod-2);scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);hh.push_back(a[i]);}initRMQ(n,a);sort(hh.begin(),hh.end());divide(1,n);printf("%d\n",ans);return 0; }總結
以上是生活随笔為你收集整理的SPOJ-HJB Segmentation(RMQ+BIT)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 收藏we-hjb的BLOG
- 下一篇: 2019hjb 安卓平台搭建 项目一