機房練習賽4 4 area 掃瞄線

2021-07-30 01:43:44 字數 2385 閱讀 9222

input file: area.in

output file: area.out

time limit: 2 seconds

memory limit: 256 mb

給出n 個矩形,求它們的面積並.

更準確一點,每個矩形將給出它的左上角和右下角的位置:x1; y1; x2; y2

這四個數都是整數且滿足x1 x2; y1 y2.

我們需要你求:

area =j f(x; y) 2 z z j 9 a rect: s:t: x1 x x2 and y1 y y2g j

input

第1 行1 個整數:n,表示矩形的個數。

接下來n 行,每行4 個整數:x1 y1 x2 y2,表示乙個矩形的左上角和右下角的座標。

output

輸出area。

sample

area.in

31 1 2 3

1 2 3 3

3 3 4 4

area.out

11 樣例解釋:一共有11 個點落在了上面三個矩形所表示的區域內:

(1; 1); (1; 2); (1; 3); (2; 1); (2; 2); (2; 3); (3; 2); (3; 3); (3; 4); (4; 3); (4; 4)

note

• 對於30% 的資料,1 n 100,1 x1 x2 100,1 y1 y2 100

• 對於100% 的資料,1 n 105,1 x1 x2 105,1 y1 y2 105

掃瞄線,對於乙個舉行(x1,y1,x2,y2),將它看成兩個事件:在x1 這個時間將

(y1,y2) 這個區間加一,在x2+1 這個時間將(y1,y2) 這個區間減一。

這樣,我們遍歷整個時間,並在執行完這個時間的操作後看看有多少位置非

0, 將其數量加到答案中,就完了,當然時間不能傻傻地乙個乙個枚,因為關鍵

的時間點最多2n 個,其它時候面積是沒有變的,所以要一段一段地算。

至於怎麼用線段樹實現那麼檢視有多少個非零的位置,需要注意對於任何一

個減一操作,前面一定有乙個和它一樣的加一操作,就只需要維護一下每個節

點被完全覆蓋的次數。再用另乙個來統計子樹中的那些修改導致這個節點還有

多少個非零。有點像標記永久化(我們講的第二種區間修改的寫法)。

#include

#include

using namespace std;

const int n = 100000 + 10;

typedef long long ll;

inline int

read()

while( ch >= '0' && ch <= '9' )

return

x*f;

}struct event

event( int type, int

time, int lf, int rg )

:type(type),time(time),lf(lf),rg(rg){}

};bool operator<( const event &r, const event &s )

struct node

void update( int lf, int rg )

}pool[n*2], *tail = pool, *root;

int n,total;

event events[n*2];

node *build( int lf, int rg )

return nd;

}void modify( node *nd, int lf, int rg, int l, int r, int delta )

int mid = (lf + rg) >> 1;

if( l <= mid ) modify( nd->ls, lf, mid, l, r, delta );

if( mid < r ) modify( nd->rs, mid+1, rg, l, r, delta );

nd->update(lf,rg);

}int main()

std::sort( events, events+total );

root = build( gu, yu );

ll ans = 0;

for( int i = 0,j; i < total; i = j + 1 )

printf("%i64d",ans);

return

0;}

20170117 機房 練習賽

現代科學,面廣枝繁,不是一輩子學得了的。惟一的辦法是集中精力,先打破一缺口,建立一塊或幾塊根據地,然後乘勝追擊,逐步擴大研究領域。此法單刀直入,易見成效。王梓坤 我熱愛生活,我是一名快速成長的oier include include include define program name color...

機房練習賽 Dinner

本來看到這道題的第一想法是環形區間dp的,但是模擬完樣例我就恍然大悟,在10的時間內可以同時讓1,5點完餐,那不就是找最大值得最小值嗎?然後就是二分答案了,二分最少時間。然後就是我的玄學check 我在考試的時候是想到了變成二倍鏈在區間上處理的,但我直接o n 處理了每個區間的和不大於x的塊,然後列...

機房練習賽4 3 drive

input file drive.in output file drive.out time limit 2 second 工頭cky 最近開了一家 公司,開始經商。作為cky 的忠實小弟,jyb 當了cky 老總的司機。一天晚上,cky 突然找到了乙個新的客戶,所以第二天一早要急著從成都去上海談生...