題意:
給定數列,求有多少個區間滿足區間最大+1-區間最小=區間長度滿足條件為:
m ax
+1−m
in=r
+1−l
=>ma
x−mi
n=r−
lmax+1-min=r+1-l=>max-min=r-l
max+1−
min=
r+1−
l=>ma
x−mi
n=r−lma
x−mi
n+l=
rmax-min+l=r
max−mi
n+l=
r所以我們考慮列舉r
rr,線段樹維護max
−min
+l
max-min+l
max−mi
n+l的值,並且求出區間最小值與最小值個數。
在列舉r
rr的過程中,當前區間再加上r
rr後的新區間的new
max≥
max,
newm
in≤m
in
newmax\geq max,newmin\leq min
newmax
≥max
,new
min≤
min
而n ew
max,
newm
in
newmax,newmin
newmax
,new
min的變化也是一段區間同時變化,所以我們用類似分治做法維護兩個單調棧,乙個單調遞增,乙個單調遞減。
由於改變是區間同時變化,所以根據單調棧的值來對線段樹進行區間修改。
由於使用了單調棧,所以根據時間複雜度計算原理,均攤得:o(n
logn
)o(nlog_n)
o(nlog
n)
#include #include #include #include #include #define db double
#define sg string
#define ll long long
#define rel(i,x,y) for(ll i=(x);i<(y);i++)
#define rep(i,x,y) for(ll i=(x);i<=(y);i++)
#define red(i,x,y) for(ll i=(x);i>=(y);i--)
#define res(i,x) for(ll i=head[x];i;i=nxt[i])
using namespace std;
const ll n=5e4+5;
const ll inf=1e18;
const ll mod=1e9+7;
const db eps=1e-10;
ll n,m,ans,a[n],up[n<<2],down[n<<2],mn[n<<2],cnt[n<<2],lazy[n<<2];
#define lson (p<<1)
#define rson (p<<1|1)
inline ll read()
while(ch>='0'&&ch<='9')
return f?-x:x;
}void maketree(ll p,ll l,ll r)
}void pushdown(ll p)
}void update(ll p)
void modify(ll p,ll l,ll r,ll x,ll y,ll z)
pushdown(p);
ll mid=l+r>>1;
if(x<=mid) modify(lson,l,mid,x,y,z);
if(y>mid) modify(rson,mid+1,r,x,y,z);update(p);
}void file()
int main()
maketree(1,1,n);
ll cup=1,cdown=1;up[0]=-1;down[0]=-1;
rep(i,1,n)
up[cup++]=i;down[cdown++]=i;
modify(1,1,n,up[cup-2]+1,up[cup-1],-a[up[cup-1]]);
modify(1,1,n,down[cdown-2]+1,down[cdown-1],a[down[cdown-1]]);ans+=cnt[1];
} printf("%lld\n",ans);
return 0;
}
單調棧 桶 分治 奇襲
問題 c 奇襲 時間限制 1 sec 記憶體限制 256 mb 題目描述 由於各種原因,桐人現在被困在under world 以下簡稱uw 中,而uw馬上 要迎來最終的壓力測試 魔界入侵。唯一乙個神一般存在的administrator被消滅了,靠原本的整合騎士的力量 是遠遠不夠的。所以愛麗絲動員了u...
單調棧 線段樹
sequence 時間限制 c c 3秒,其他語言6秒 空間限制 c c 524288k,其他語言1048576k 64bit io format lld your are given two sequences a1 na a1 n and b1 nb b1 n you need to answe...
NOIP模擬 字胡串(單調棧)
只剩5分鐘的時候打了乙個三重迴圈。完全沒想到固定左端點減少1個n。被diss了一波。對於乙個區間,如果他合法,那麼一定是有乙個非最大數在二進位制下與最大數有不同的地方,所以對於乙個數,利用單調棧記錄他作為最大數的區間 左右第乙個至少有一位與他不同的地方,利用容斥原理計算一下統計答案即可,複雜度 然後...