HNOI2016 序列(未通過)

2022-05-31 07:30:12 字數 1343 閱讀 3023

題解:

雖然知道有點問題但是並沒有debug出來

發現錯誤了。。相同元素的處理有錯誤

網上題解大都是分塊。。(hn怎麼道道分塊)

用最普通的思路,可以列舉每個點作為最小值,向左向右延伸

但是多組詢問顯然我們是要去優化詢問過程的

有一種方法就是先找出最大值

(其實也可以是隨意乙個位置吧,但yy一下應該最大值能擴充套件的比較快)

然後向兩邊分別找第乙個比它小的值

那麼我們會發現,中間這一段元素他們一定是小於兩邊的值的

也就是說,如果這兩個點在區間裡,中間的點也全部在區間裡

那麼就可以用字首和來預處理了

當比它小的點已經超出邊界的時候,顯然是可以遞迴處理的

查詢最大值用倍增維護一下(線段樹多了個log)

時間複雜度在資料不隨機的情況下大概會炸的

並沒有ac的**:

#include using

namespace

std;

#define maxn 100100

#define inf 1e9

#define ll long longll h,t,n,m;

ll v[maxn],dp1[maxn],dp2[maxn],sum[maxn];

struct

rep[maxn*4

];struct

reebz1[

20][maxn];

ll pd1(ll x,ll y)

ll pd2(ll x,ll y)

void

updata(ll x)

int query(int h,int

t)ll js(ll x,ll h,ll t)

ll queryall(ll h,ll t)

ans+=queryall(x+1,t); x=tmp;

while (dp1[x]>=h)

ans+=queryall(h,x-1

);

return

(ans);

}int

main()

for (ll i=n;i>=1;i--)

for (int i=1;i<=n;i++)

bz1[

0][i].x1=v[i],bz1[0][i].x2=i;

for (int i=1;i<=20;i++)

for (int j=1;j<=n;j++)

if (j+(1

<1

<=n)

for (ll i=1;i<=n;i++)

for (ll i=1;i<=m;i++)

}

題解 HNOI 2016序列

collapse bzoj 這道題在hnoi2016中還算是好的了 這題中如若去掉多組詢問的話可以在o nlogn o n log n 的時間內得解 並查集 但多組詢問必定要優化,發現這種其他結構基本上無法涉足的題目就只能上莫隊了 我也不知道為啥想到莫隊,可能這就是題感吧 減去o nn o n n ...

Hnoi2016 序列 解題報告

我們考慮從左往右掃右端點和從右往左掃左端點的兩遍掃瞄線。以下選取從左往右的掃瞄線來說明 考慮每個點向它左邊第乙個比它大的點連邊形成的樹。設i左邊第乙個比它大的點的座標是la sti 如果沒有則la sti 0 i右邊第乙個比它大的點的座標是ne xti 如果沒有則ne xti n 1 設 l,r 的...

Hnoi2016 序列(莫隊 st表)

給定長度為 n n 的序列 a1 role presentation style position relative a1a 1,a2 a 2,an a n,記為a 1 n a 1 n 類似地,a l r a l r 1 l r n 1 l r n 是指序列 al a l,al 1a l 1,ar ...