題解:
雖然知道有點問題但是並沒有debug出來
發現錯誤了。。相同元素的處理有錯誤
網上題解大都是分塊。。(hn怎麼道道分塊)
用最普通的思路,可以列舉每個點作為最小值,向左向右延伸
但是多組詢問顯然我們是要去優化詢問過程的
有一種方法就是先找出最大值
(其實也可以是隨意乙個位置吧,但yy一下應該最大值能擴充套件的比較快)
然後向兩邊分別找第乙個比它小的值
那麼我們會發現,中間這一段元素他們一定是小於兩邊的值的
也就是說,如果這兩個點在區間裡,中間的點也全部在區間裡
那麼就可以用字首和來預處理了
當比它小的點已經超出邊界的時候,顯然是可以遞迴處理的
查詢最大值用倍增維護一下(線段樹多了個log)
時間複雜度在資料不隨機的情況下大概會炸的
並沒有ac的**:
#include usingnamespace
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 ...