NOIP模擬 奇襲 線段樹 單調棧

2021-08-30 15:22:35 字數 2320 閱讀 9796

題意:

給定數列,求有多少個區間滿足區間最大+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了一波。對於乙個區間,如果他合法,那麼一定是有乙個非最大數在二進位制下與最大數有不同的地方,所以對於乙個數,利用單調棧記錄他作為最大數的區間 左右第乙個至少有一位與他不同的地方,利用容斥原理計算一下統計答案即可,複雜度 然後...