BZOJ1218(線段樹 掃瞄線)

2022-02-27 16:10:08 字數 2600 閱讀 6214

1.掃瞄線掃瞄x軸,線段樹維護y軸。

2.座標+1,線段樹是從1開始維護。然後讓邊長--,這樣就能包含邊上的點了。

3.為了保證點在正方形內:在x軸上利用差分的思想,在x出add(val),在x+r(已經-1了)處add(-val);在y軸上利用線段樹維護1~5001這個區間,在y~y+r上add(val)。

題解部落格大家都是口胡感覺難以講清這個事情,這篇部落格雖然沒解釋但**邏輯不錯,看懂的。

1

#pragma comment(linker, "/stack:1024000000,1024000000")

2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include

13 #include 14 #include 15 #include 16 #include

17 #include 18 #include 19 #include 20 #include 21 #include 22

#define init(a, b) memset(a, b, sizeof(a))

23#define rep(i, a, b) for (int i = a; i <= b; i++)

24#define irep(i, a, b) for (int i = a; i >= b; i--)

25#define ls(p) p << 1

26#define rs(p) p << 1 | 1

27using

namespace

std;

2829 typedef double

db;30 typedef long

long

ll;31 typedef unsigned long

long

ull;

32 typedef pairp;

33const

int inf = 0x3f3f3f3f;34

const ll inf =1e18;

3536 template void read(t &x)

4546 template void

write(t x)

5152 template void

writeln(t x)

5657

const

int maxn = 1e4 + 5, m = 5001;58

intn, r, cnt;

59struct

seg t[(m + 5) << 2

];62

struct

node c[maxn << 1

];65

66void build(int l, int r, int

p) 72

int mid = (l + r) >> 1;73

build(l, mid, ls(p));

74 build(mid + 1

, r, rs(p));75}

7677

void push_down(int

p) 86}87

88void add(int l, int r, int p, int

k) 94

push_down(p);

95int mid = (t[p].l + t[p].r) >> 1;96

if (l <=mid) add(l, r, ls(p), k);

97if (mid 98 t[p].mx =max(t[ls(p)].mx, t[rs(p)].mx);99}

100101

int query(int l, int r, int

p) 105

push_down(p);

106int ret = 0

;107

int mid = (t[p].l + t[p].r) >> 1

;108

if (l <= mid) ret =max(ret, query(l, mid, ls(p)));

109if (mid < r) ret = max(ret, query(mid + 1

, r, rs(p)));

110return

ret;

111}

112113

bool

cmp(node a, node b)

117118

intsolve() ;

125 c[++cnt] = ;

126}

127 sort(c + 1, c + 1 +cnt, cmp);

128129

for (int i = 1, j, k; i <= cnt; i =j)

135 ans = max(ans, query(1, m, 1

));136

for (; k < j; k++)

139}

140return

ans;

141}

142143

intmain()

Bzoj1218 雷射炸彈

給你n個點的座標xi,yi。求乙個邊長為k的正方形能覆蓋多少點。可以列舉。但是要加乙個二維字首和。統計的時候可以畫乙個圖。首先a i j 是乙個大矩形。之後在旁邊切掉兩個小矩形,但多切掉了乙個重複部分,要把它加上。include include define rep i begin end for ...

線段樹 掃瞄線

pku 1151 hdu1542 atlantis 矩形面積並 題意 給出n個矩形,每個矩形給出左下角座標,右上角座標。然後求矩形並的總面積 思路 浮點數先要離散化 然後把矩形分成兩條邊,上邊和下邊,對橫軸建樹,然後從下到上掃瞄上去,用cnt表示該區間下邊比上邊多幾個,sum代表該區間內被覆蓋的線段...

掃瞄線 線段樹

問題描述 小明的家旁邊有條河流,但最近,周圍的三個工廠開始向這條河排放汙水,這條河的一部分被汙染了,被乙個工廠汙染的部分可以看做乙個矩形,現在小明想知道這條河被汙染的面積是多少。輸入 第一行乙個整數t,表示有多少組資料,之後每一組資料報括三行,每一行有lx,ly,rx,ry四個整數,表示被乙個工廠汙...