P11370 [Ynoi2024] 墮天作戰/虛空處刑
不是我想寫的,是lxl老師布置的題單里有。
仿照P3316的思路,我們將多邊形的每一條邊按橫坐標分拆到\(O(\log n)\)個線段樹節點上。
不過現在我們就需要討論兩種情況,一種是查詢所在結點在修改(指初始的多邊形的邊)下方,

我們在所有查詢結點在線段樹上所有的祖先結點進行操作。
這樣修改形成若干貫穿區間的直線,查詢形成線段。

根據修改直線形成一個多邊形,我們可以得知這些直線是不交的(至多交于端點)。
查詢的時候便可以直接二分得到線段兩個端點的rank,比較是否相等就好了。(判掉端點與直線相交)
另一種則是在下方。

這樣的話多邊形的邊形成若干“牙齒”與”耳朵“:

(很像吧)
對于那些牙齒(也就是與區間左右端點相交的連通塊),一條線段至多顯然只會與它的前驅后繼相交。

所以我們對每個牙齒求一個凸包,查詢的線段(實質上現在是直線)在凸包上二分就好了。
重點是耳朵。
首先特判這種情況:

這個東西按耳朵與左半區間(右耳朵同理)的交排序之后二分就好了。
然后有一個誤區是直線也至多與前驅后繼的耳朵相交,但這是不對的。

按左上作為例子,我們需要加入所有直線左上方的耳朵,并將它們的端點求個凸包就好了。這個過程可以離線之后掃描線解決。
合并凸包的時候比較麻煩,但其實我們只用維護凸殼,這個過程用雙指針做,細細討論就好了。
需要對四個方向分別做一遍。
最后有一個小問題,就是查詢與修改都垂直于\(x\)軸,這個特殊處理一下,做一個區間加區間查,不是大問題。
沒錯這道題就是這樣,思維難度不算高,但是代碼確實難(也許想清楚了可以很快寫完?)。
給幾個樣例:
3 10
7 1
4 4
5 7
1 6 4 1
5 5 8 6
9 10 1 1
2 6 4 2
4 9 9 3
6 8 10 7
2 5 4 6
6 3 6 9
6 3 10 1
5 2 2 2
NO
YES
YES
NO
NO
NO
NO
YES
YES
NO
10 1
6 13
7 11
11 12
16 8
9 3
4 4
2 4
11 6
3 15
16 20
12 8 1 9
YES
還給幾組全是YES的樣例(這些大的樣例主要針對耳朵):
task1:
15 1
58 49
25 82
45 99
32 78
61 51
52 60
45 71
62 80
77 20
73 94
98 46
93 4
15 14
64 52
7 13
52 76 3 100
task2:
15 1
7 24
13 2
45 34
34 14
197 42
77 33
163 87
69 28
64 38
179 142
119 72
186 142
108 154
39 139
24 70
197 129 95 41
task3:
13 1
63 152
165 199
41 176
4 84
29 13
76 96
58 107
93 115
53 157
123 92
168 138
185 93
170 165
38 128 73 97
task4:
10 1
33 11
41 33
24 31
13 35
36 50
46 46
39 41
50 13
23 5
21 28
50 27 40 50
task5:
12 1
15 31
30 39
4 46
3 18
40 7
45 26
29 18
9 19
38 26
29 37
14 26
9 24
50 32 17 43
task6:
15 1
39 28
20 9
73 15
75 16
96 54
73 34
35 32
81 70
65 71
65 73
16 91
12 92
63 68
40 51
20 13
55 71 12 12
task7:
13 1
31 12
49 24
28 39
42 28
6 43
6 31
11 29
3 29
1 13
5 4
36 8
12 13
2 19
8 46 3 31
task8:
10 1
14 47
30 1
49 6
30 7
30 11
38 14
42 33
45 30
41 50
7 47
28 7 39 27
剩下的自己拍。

浙公網安備 33010602011771號