【線段樹+掃瞄線】
簡單的說就是從下到上掃瞄線段,累加記錄該線段新增進去之後在總區間的對映有效長度*高度差。
線段樹掃瞄線詳解:矩形面積的並:
矩形面積的交:
注意資料的離散化。。。
col[root]列舉到當前邊的時候,下方有多少有用線段。(該區間矩形的下邊比上邊多幾條)
即當前結點區間的覆蓋情況,不必向下更新,當遇到矩形的上邊的時候,直接更新當前結點。
sum[root]區間被覆蓋的長度
summ[root]區間被重複覆蓋的長度/*注意更新*/
hdu 1542 【矩形面積的並】code:
#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f
#define lson l,m,root<<1
#define rson m+1,r,root<<1|1
typedef long long ll;
using namespace std;
const int mod=998244353;
const int maxn=5005;
double sum[maxn<<2],x[maxn<<2];
int col[maxn<<2];
struct node
; node(double a,double b,double c,int d)
bool operator <(const node &cmp)const
int main()
; node(double a,double b,double c,int d)
bool operator <(const node &cmp)const
void update(int l,int r,int c,int l,int r,int root)
int m=(l+r)>>1;
if(l<=m)
update(l,r,c,lson);
if(r>m)
update(l,r,c,rson);
pushup(l,r,root);
}int main()
{ int n,t;
scanf("%d",&t);
while(t--)
{scanf("%d",&n);
int m=0,k=1;
double a,b,c,d;
for(int i=0; i
hdu4007 線段樹掃瞄線
用變長為r的正方形最多能框住幾個點,線段樹,離散化,掃瞄線,延時標記lz include include include include include define n 2005 define inf 1 30 const double eps 1e 12 const double pi acos...
hdu1828線段樹 掃瞄線
矩形求周長類似矩形合併求面積,只是多了需要統計豎邊的個數,對於每次求到的下底邊長還要增加目前底邊與下一條底邊之間的豎邊總長 1,n個矩形有2 n條線段,按從小到大排列,如上圖得到的線段順序 開始掃瞄第一條線段,得到總底邊長sum為a這部分,得到豎邊個數segnum 2,每增加一條底邊segnum 2...
hdu5091(掃瞄線 線段樹)
題意 給n個點,和長w寬h的矩形,問矩形最多能包含多少個點。思路 掃瞄線 線段樹,首先將座標轉化成非負數,對於每個點 x,y 標記為1,生成乙個 x w,y 的點,標記為 1,然後將y軸建立線段樹,維護乙個最大值即可。如不不明白的話,畫個圖,理解一下就好了。如下 include include in...