HNOI AHOI2018 轉盤 題解

2021-09-27 09:08:03 字數 2382 閱讀 8388

題目鏈結

好難的題。

首先,有等待操作不太好弄。

可以發現:在總時間一定的情況下,到每個點越晚越好。

所以,可以把所有等待都移到起點處,解不會變差。

由於是環,破環為鏈處理。

如果在\(s\)時間在\(i (1<=i<=n)\)出發,那麼到\(j (i<=j的時間為\(s+(j-i)\)。根據要求,得\(s+(j-i)>=t_j\),

即\(s=max(t_j-j)+i (i<=j。總時間為\(max(t_j-j)+i+n-1 (i<=j。

就是要找乙個\(i (1<=i<=n)\),使得\(max(t_j-j)+i+n-1 (i<=j最小。

設\(a_j=t_j-j\),則式子變為\(max(a_j)+i+n-1 (i<=j。

這樣就得出的答案的式子。

發現\(max(a_j)+i+n-1 (i<=j等於\(max(max(a_j) (i<=j<=n),max(a_j) (n+1<=j,

而由於\(a\)的後半段是由前半段複製過來並減\(n\),

所以\(max(a_j) (i+1<=j<=n+n)。

所以式子可以變為\(max(a_j)+i+n-1 (i<=j<=n+n)\)(即字尾最值)。

但是有修改,這樣還是不好維護答案。增加很好做,區間覆蓋即可,但因為有減小的操作,減小後,修改的段會很多,無法處理。

我們發現,在\(max(a_j)\)一定時,\(i\)越小越好。

所以維護所有讓\(max(a_j)\)變大的\(j\),就是從後往前的單調遞增序列。

設這個序列為\(w_i\),那麼若\(i=+1\),則\(max(a_j)=a_}\)。

這樣,式子變為\(a_}++1+i+n-1\),即\(a_}++i+n\)。

單調遞增序列可以用線段樹維護,方法如下:

首先,單調遞增序列只是用於合併答案,所以儲存\(w\)的第乙個和最後乙個,還有這段序列的答案就行。

維護每個節點的\(max\),單調遞增序列,還有整體考慮時左子節點的單調遞增序列。

設計乙個\(getst(l,r,x)\)表示求\(l~r\)的元素只考慮》\(x\)的答案。

若右兒子的最值不大於x,則不用考慮右兒子,只考慮左兒子即可。

否則,左兒子的遞增序列一定完全包含在答案中,只考慮右兒子即可。

考慮\(pushup\)操作的實現:只要用左兒子的\(getst\)加上右兒子即可。

每次\(pushup\),時間複雜度為\(o(logn)\),總時間複雜度為\(o(nlog^2n)\)。

**還不算太難寫,主要是推導比較複雜。

#include #define max(a, b)(a > b ? a: b)

#define min(a, b)(a < b ? a: b)

int sz[200010],inf = 999999999;

struct sjd

sjd(int a)

sjd(int l, int r, int w) }}

};sjd operator + (sjd a, sjd b)

sjd jd[400010],zz[400010];

int ma[400010],wz[400010];

sjd getst(int i, int l, int r, int w)

void pushup(int i, int l, int r)

void getddz(int i, int l, int r)

void jianshu(int i, int l, int r)

int m = (l + r) >> 1;

jianshu(i << 1, l, m);

jianshu((i << 1) | 1, m, r);

pushup(i, l, r);

}void xiugai(int i, int l, int r, int j)

int m = (l + r) >> 1;

if (j < m) xiugai(i << 1, l, m, j);

else xiugai((i << 1) | 1, m, r, j);

pushup(i, l, r);

}void xiugai(int x, int y, int n)

int getans(int n)

int main()

jianshu(1, 1, n + 1);

int la = getans(n);

printf("%d\n", la);

for (int i = 0; i < m; i++)

xiugai(x, y, n);

la = getans(n);

printf("%d\n", la);

}return 0;

}

題解 HNOI AHOI2018 毒瘤

題目傳送門 給出乙個 n 個點 m 條邊的無向圖,問有多少個點集滿足點集中任意兩點均不存在邊相連。n le 10 5,m n le 10 答案對 998244353 取模。妙啊!首先我們從樹的形態開始考慮,你發現答案其實就是獨立集的個數,具體來說我們可以設 f 表示 u 點選或不選的方案數,可以得到...

HNOI AHOI2018 尋寶遊戲

hnoi ahoi2018 尋寶遊戲 思維好題。將每一位領出來,組成 m 個長度為 n 的二進位制數。考慮將操作轉化為 01 序列,lor to0,land to1 觀察之後發現要使得第 j 位運算結果是 1 則最後乙個 lor1 操作的位置一定要在 land0 後面。轉化一下就是就要求 x gt ...

洛谷 HNOI AHOI2018 道路

初見安 這裡是傳送門 洛谷p4438 道路 題目乍一看很複雜,其實挺簡單的 就是一棵有根的滿二叉樹,要從每個葉子節點出發到根節點,每條路有個性質,公路or鐵路,現在要選n 1條道路翻新,滿足題目所述的條件。看n的範圍明顯是不能暴力列舉的。但是我們可以抓住一點 樹的深度不超過40。也就是說每個節點到根...