2014-09-29 23:23:37
思路:這題re到死啊!注意邊界和long long!首先,考慮如果乙個窗戶套住了幾個星星,那麼可以移動窗戶的左下角和最左下角的星星重合而使得套住的星星數不減。
那麼就以每個星星為矩形的左下角,向右上拓展成乙個矩形。那麼如何轉化為線段樹呢?方法:先把所有星星按照y軸座標公升序排序,考慮每個星星的矩形的下底,一條線段,加入線段樹中。即:從下往上掃,每遇到一條矩形下底,就將其加入線段樹中,而且在加完後刪除掉所有y軸座標離當前星星y軸座標》=h的星星下底(因為dis >= h的話就不能在乙個窗戶中了)
,然後每次還要根據當前最優解來更新答案。參考:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9using
namespace
std;
10#define lpos (pos << 1)
11#define rpos (pos << 1|1)
12#define getmid(l,r) (l + (r - l) / 2)
13 typedef long
long
ll;14
const
int inf = 1
<< 29;15
const
int maxn = 20010;16
17ll n,w,h;
1819
struct
nodet[maxn << 2
];23
24struct
stars[maxn];
2728
ll x[maxn];
2930
void
push_down(ll pos)40}
4142
void
update(ll a,ll b,ll c,ll pos,ll l,ll r)
48push_down(pos);
49 ll mid =getmid(l,r);
50if(a <=mid) update(a,b,c,lpos,l,mid);
51if(b > mid) update(a,b,c,rpos,mid + 1
,r);
52 t[pos].tmax =max(t[lpos].tmax,t[rpos].tmax);53}
5455
bool
cmp(star a,star b)
5859
intmain()
69 sort(x + 1,x + cnt + 1
);70 sort(s + 1,s + n + 1
,cmp);
71 ll sz = unique(x + 1,x + cnt + 1) - x - 1
;72 ll ans = 0
,a,b;
73for(ll i = 1,j = 1; i <= n; ++i)
83if(t[1].tmax > ans) ans = t[1
].tmax;84}
85 printf("
%i64d\n
",ans);86}
87return0;
88 }
POJ 1151線段樹 離散化 掃瞄線
poj1151 一開始做的時候,我還用以前做的離散化的方法來離散化這題中的資料,但是後來才發現,它裡面包含了浮點數。不能直接的離散化!必須轉化為整數後,再來影射.又學習了一種離散化的方法。還有就是掃瞄線的方法,第一次聽說,開始看這題的正確 的時候,看半天沒看懂。耽誤了好久時間。後來終於明白了什麼是掃...
POJ 1151 線段樹 掃瞄線
cf上遇到一題掃瞄線,二話不說立刻補。該類題目計算座標中邊平行於x,y軸的矩形的覆蓋面積。這樣可以通過離散化x座標,然後建立區間,通過線段樹管理。然後每條掃瞄線更新區間覆蓋和計算面積。對於上面的矩形就有4條掃瞄線,有3個區間。第一條掃瞄線覆蓋1,2區間。第二條掃瞄線覆蓋2,3區間。第三條掃瞄線是第乙...
POJ1389 掃瞄線 線段樹
一道經典的掃瞄線 線段樹求矩形面積並的題目 用線段樹維護y,記錄所有線段被覆蓋的次數和長度,掃瞄線維護x,把乙個長方形拆成兩個事件,左邊界作為 1,右邊界作為 1,即可利用線段樹進行維護。非離散化版本 include includeusing namespace std define lson k ...