掃瞄線專題

2022-04-16 19:45:03 字數 4735 閱讀 9624

想法:我們根據題目的意思不難發現,我們可以維護乙個x軸區間對應的 y 值的最大值。然後我們去遍歷我們的 x 軸對應的 y 值,如果前面乙個和當前的 y 相同就說明還是直線,沒有出現轉折點。

但是出現了乙個問題就是:為了避免邊界出現問題,所以我們採取和掃瞄線一樣的做法,讓 【l,r】 代表 【l,r+1】

#include #include 

#include

#define ll long long

#define ull unsigned long long

#define ls nod<<1

#define rs (nod<<1)+1

#define pii pair#define mp make_pair

#define pb push_back

#define inf 0x3f3f3f3f

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

#define min(a, b) (aconst

double eps = 1e-8

;const

int maxn = 1e6 + 10

;const ll mod = 1e9 + 7

;const

int mlog=20

;int sgn(double a)

using

namespace

std;

struct

node

}q[maxn];

intler[maxn],x[maxn],y[maxn];

struct

segment_tree tree[maxn

<< 2

];void pushdown(int l,int r,int

nod)

}void modify(int l,int r,int x,int y,int z,int

nod)

pushdown(l,r,nod);

int mid = (l + r) >> 1

;

if (x <=mid)

modify(l,mid,x,y,z,ls);

if (y >mid)

modify(mid+1

,r,x,y,z,rs);

}int query(int l,int r,int k,int

nod)

int ef(int l1,int r1,int

mb)

returnl;}

intmain()

m--;

sort(ler+1,ler+1+len);

sort(q+1,q+1+m);

int n = 1

;

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

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

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

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

}return0;

}

想法:因為給我們的是乙個固定的矩形。我們不妨就讓每乙個星星其實就是乙個以該星星為矩形左下角的乙個固定大小的矩陣,由於邊界上的星星不能算,所以我們分別把長和寬都進行-1的操作。

然後這樣的話問題就轉化為矩形相交的問題,我要求的就是相交的那段區間裡面的最大亮度就可以了。所以問題再次轉化為掃瞄線的思想。但是這裡的話,由於我們已經對邊界進行了操作所以不會出現前面一道題的邊界的問題,所以我們直接正常的線段樹維護就好了。

#include #include 

#include

#define ll long long

#define ull unsigned long long

#define ls nod<<1

#define rs (nod<<1)+1

#define pii pair#define mp make_pair

#define pb push_back

#define inf 0x3f3f3f3f

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

#define min(a, b) (aconst

double eps = 1e-8

;const

int maxn = 1e6 + 10

;const ll mod = 1e9 + 7

;const

int mlog=20

;int sgn(double a)

using

namespace

std;

ll x1,y1,x2,y2,x[maxn

<< 1

];struct

scanline

} line[maxn

<< 2

];struct

segment_tree tree[maxn

<< 2

];void build(int l,int r,int

nod)

void push_up(int

nod)

void pushdown(int

nod)

}void modify(ll x,ll y,int f,int

nod)

pushdown(nod);

int mid = (l + r) >> 1

;

if (x <=mid)

modify(x,y,f,ls);

if (y >mid)

modify(x,y,f,rs);

push_up(nod);

}int

main() ;

line[

2 * i] = ;}n

<<= 1

; sort(x + 1,x + 1 +n);

sort(line + 1,line + 1 +n);

ll tot = unique(x + 1,x + 1 + n) - x - 1

; build(

1,tot,1

); ll ans = 0

;

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

printf(

"%lld\n

",ans);

}return0;

}

想法:

)只有水平線和垂直線才會對白點的出現產生影響,所以我們可以維護這兩種的線段。

如果出現了水平線,我們就查詢這段區間。 如果出現了垂線,下端點我們讓他+1,上端點我們讓他-1

然後按照 y 的順序對這些線段進行排序。

#include #include 

#include

#define ll long long

#define ull unsigned long long

#define ls nod<<1

#define rs (nod<<1)+1

#define pii pair#define mp make_pair

#define pb push_back

#define inf 0x3f3f3f3f

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

#define min(a, b) (aconst

double eps = 1e-8

;const

int maxn = 1e5 + 10

;const ll mod = 1e9 + 7

;const

int mlog=20

;int sgn(double a)

using

namespace

std;

struct

bit

ll qwq(

intx)

ll qry(

int l,int r)

void upd(int x,ll v=1)

}bit;

struct

scanline

} line[maxn

<< 2

];struct

node p[maxn];

intx[maxn];

bool

cmpx(node a,node b)

bool

cmpy(node a,node b)

intmain()

sort(x+1,x+1+n);

int tot = unique(x+1,x+1+n) - x - 1

; bit.init(tot);

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

sort(p+1,p+1+n,cmpx);

int cnt = 0

;

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

line[++cnt] = ;}}

sort(p+1,p+1+n,cmpy);

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

sort(line+1,line+1+cnt);

int ans = 0

;

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

printf(

"%d\n

",ans +n);

return0;

}

專題 偏序,掃瞄線

關鍵字 偏序,數點,樹狀陣列,線段樹,掃瞄線。因為涉及多種演算法,所以整合到一起。掃瞄線 二維數點,偏序 數點問題 關於偏序問題的一些總結 掃瞄線是一維離線的做法的統稱,常用於解決k維偏序問題。離線 將其中一維的詢問排序後按順序處理,從而實現按時間順序處理的過程中可以o 1 統計空間上小於某個數字的...

P5490 模板 掃瞄線 掃瞄線

題目描述 求 n 個矩形的面積並。輸出格式 一行乙個正整數,表示 n 個矩形的並集覆蓋的總面積。発生 線段樹開小了,因為n變成了兩倍,線段樹就得開4 2 8倍 對每一根掃瞄線,維護所截得的長度,每次乘以兩根掃瞄線高度差就得到了面積並 截得長度用線段樹維護即可 注意線段樹需要離散化 include i...

掃瞄線入門

聽說掃瞄線很牛掰,於是就見識了一下。之前做過一道掃瞄線的題,brother,就是判斷矩形是否被矩形內部的車攻擊到。當時是把矩形拆成出邊和入邊 豎直的 把所有小於x2的車加進圖中,掃 y1,y2 中x最小的車的x.和x1判斷比較。然後交換x,y掃一遍 當時只是感覺線段樹很神奇,還可以這樣搞,後來才知道...