青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

oyjpArt ACM/ICPC算法程序設計空間

// I am new in programming, welcome to my blog
I am oyjpart(alpc12, 四城)
posts - 224, comments - 694, trackbacks - 0, articles - 6

Picture
Time Limit:2000MS? Memory Limit:10000K
Total Submit:742 Accepted:411

Description
A number of rectangular posters, photographs and other pictures of the same shape are pasted on a wall. Their sides are all vertical or horizontal. Each rectangle can be partially or totally covered by the others. The length of the boundary of the union of all rectangles is called the perimeter.

Write a program to calculate the perimeter. An example with 7 rectangles is shown in Figure 1.


The corresponding boundary is the whole set of line segments drawn in Figure 2.

The vertices of all rectangles have integer coordinates.

Input
Your program is to read from standard input. The first line contains the number of rectangles pasted on the wall. In each of the subsequent lines, one can find the integer coordinates of the lower left vertex and the upper right vertex of each rectangle. The values of those coordinates are given as ordered pairs consisting of an x-coordinate followed by a y-coordinate.

0 <= number of rectangles < 5000
All coordinates are in the range [-10000,10000] and any existing rectangle has a positive area.

Output
Your program is to write to standard output. The output must contain a single line with a non-negative integer which corresponds to the perimeter for the input rectangles.

Sample Input

7
-15 0 5 10
-5 8 20 25
15 -4 24 14
0 -6 16 4
2 15 10 22
30 10 36 20
34 0 40 16

Sample Output

228

Source
IOI 1998

做這道題之前我用線段樹的結構過了幾個題目 效果沒有我想象的好
但是這道題明顯就出了差距 直接離散化與用線段樹來做效果差了有將近10倍!




線段樹的基本應用:請參考這篇文章

http://m.shnenglu.com/sicheng/archive/2006/11/24/15640.html

這里我們再加上測度與連續段的作用:

(一)、?? 測度

由于線段樹結構遞歸定義,其測度也可以遞歸定義。增加數據域 Lines_Tree.M 表示以該結點為根的子樹的測度。 M 取值如下:

?

?

???????? a[j] – a[i] ?? 該結點 Count>0

M? =??? 0???????? ? 該結點為葉結點且 Count=0

???????? Leftchild .M + Rightchild .M ? 該結點為內部結點且 Count=0

?

據此,可以用 Lines_Tree.UpData 來動態地維護 Lines_Tree.M 。 UpData 在每一次執行 Insert Delete 之后執行。定義如下:

Procedure? Lines_Tree.UpData

1??????? if? count? >? 0

2??????? ??then? M? ? ? a[j]? ? [i]????? { 蓋滿區間,測度為 a[j] – a[i]}

3??????? ??else? if? j? -? i? =? 1 ????????{ 是否葉結點 }

4??????? ??????????then? M? ? ? 0 ??????{ 該結點是葉結點 }

5??????? ??????????else? M? ? ? Leftchild .M? +? Rightchild .M
????????????????????????????????????????? ?{
內部結點 }

UpData 的復雜度為 O(1) ,則用 UpData 來動態維護測度后執行根結點的 Insert Delete 的復雜度仍為 O(logN) 。

(二)、?? 連續段數

這里的連續段數指的是區間的并可以分解為多少個獨立的區間。如 [1 2] [2,3] [5 , 6] 可以分解為兩個區間 [1 , 3] [5 6] ,則連續段數為 2 。增加一個數據域 Lines_Tree.line 表示該結點的連續段數。 Line 的討論比較復雜,內部結點不能簡單地將左右孩子的 Line 相加。所以再增加 Lines_Tree.lbd Lines_Tree.rbd 域。定義如下:

?

???????? 1??? 左端點 I 被描述區間蓋到

lbd? =?

???????? 0? ?? 左端點 I 不被描述區間蓋到

?

???????? 1???? 右端點 J 被描述區間蓋到

rbd? =?

??????? ?0 ???? 右端點 J 不被描述區間蓋到

?

lbd rbd 的實現:

????????? 1? 該結點 count > 0

lbd? =??? 0? 該結點是葉結點且 count = 0

????????? leftchild .lbd??? 該結點是內部結點且 Count=0

? ????????1? 該結點 count > 0

rbd? =??? 0? 該結點是葉結點且 count = 0

????????? rightchild .rbd?? 該結點是內部結點且 Count=0

有了 lbd rbd Line 域就可以定義了:

??????? 1? 該結點 count > 0

Line =?? 0? 該結點是葉結點且 count = 0

??????? ?Leftchild .Line? +? Rightchild .Line? -? 1
????????
當該結點是內部結點且 Count=0 , Leftchild .rbd = 1 Rightchild .lbd = 1

???????? Leftchild .Line? +? Rightchild .Line??
??? ?????
當該結點是內部結點且 Count=0 , Leftchild .rbd Rightchild .lbd 不都為 1

?

據此,可以定義 UpData’ 動態地維護 Line 域。與 UpData 相似, UpData’ 也在每一次執行 Insert Delete 后執行。定義如下:

Procedure? Lines_Tree.UpData’

1??????? if? count? >? 0 ??????????{ 是否蓋滿結點表示的區間 }

2??????? ??then? lbd?? ? ? 1

3??????? ???????rbd?? ? ? 1

4??????? ???????Line? ? ? 1

5??????? ??else? if? ?j? -? i? =? 1???? { 是否為葉結點 }

6??????? ??????????then? lbd?? ? ? 0?? { 進行到這一步,如果為葉結點,
??????????????????????????????????????????????? count = 0}

7??????? ????????????????rbd? ? ? 0

8??????? ????????????????line? ? ? 0

9??????? ??????????else? line? ? ?? Leftchild .line? +? Rightchild .line? -?

????????????????????????????? Leftchild .rbd * Rightchild .lbd

{ 用乘法確定 Leftchild .rbd Rightchild .lbd 是否同時為 1}

?

于是我按下面的步驟重寫了程序:

1.??????? 以矩形頂點坐標切割平面,實現橫縱坐標的離散化并建立映射 X_Map 、 Y_Map 。

2.??????? 事件排序

3.??????? Root.Build(1, N*2)

4.??????? Nowm??? ? ? 0

5.??????? NowLine? ? ? 0

6.??????? Ans????? ? ? 0

7.??????? for?? I? ? ? 1? to? 事件的最大編號

8.??????? ??do?? if? I 是插入事件

9.??????? ??????????then? Root.Insert(Y_Map.Coord[ 事件線段頂點 1]
???????????????????????? Y_Map.Coord[
事件線段頂點 2])

10.??? ??????????else? Root.Delete(Y_Map.Coord[ 事件線段頂點 1]
?????????????????? ? ??????Y_Map.Coord[
事件線段頂點 2])

11.??? ????????nowM??? ? ? Root.M

12.??? ????????nowLine? ? ? Root.Line

13.??? ????? ???ans??? ? ? ans? +? lastLine * 2 * (X_Map[I] – Y_Map[I-1])

14.??? ????????ans????? ? ? ans? +? |nowM – lastM|

15.??? ????????lasM???? ? ? nowM

16.??? ????????lastLine?? ? ? nowLine

參考論文《IOI98試題PICTURE談起 陳宏

#include? < stdio.h >
#include?
< stdlib.h >

const ? int ?maxn? = ? 5010 ;
// 寫一個線段樹的過程
struct ?Lines_tree
{
????Lines_tree?
* ?lchild,? * ?rchild;
????
int ?m;? // 測度
???? int ?cnt;??? // count
???? int ?lines;? // 連續段數
???? int ?lbd,?rbd;? // 左右端點是否被覆蓋?
???? int ?f,?r;? // 左右端點
}
;
Lines_tree
* ?root;
struct ?rec { int ?x,?y,?x1,?y1;} r[maxn];
struct ?Line
{
????
int ?x,?y1,?y2; int ?sign;
????Line(
int ?a,? int ?b,? int ?c, int ?d):x(a),?y1(b),?y2(c),?sign(d) {}
????Line(
void ):x( 0 ),y1( 0 ),y2( 0 ),sign( 0 ) {} ?
}
line[ 2 * maxn + 10 ];
int ?nr;
int ?ans;

void ?make_tree( int ?a,? int ?b,?Lines_tree * ?node)
{
????node
-> lines? = ? 0 ;?node -> m? = ? 0 ;?node -> cnt? = ? 0 ;
????node?
-> ?lbd? = ? 0 ;?node? -> ?rbd? = ? 0 ;
????node
-> lchild? = ?NULL;?node -> rchild? = ?NULL;
????node
-> f? = ?a;?node -> r? = ?b;
????
if (b - a > 1 )
????
{
????????node
-> lchild? = ? new ?Lines_tree;
????????make_tree(a,?(a
+ b) / 2 ,?node -> lchild);
????????node
-> rchild? = ? new ?Lines_tree;
????????make_tree((a
+ b) / 2 ,?b,?node -> rchild);
????}

}


void ?make( int ?a,? int ?b)
{
?????root?
= ? new ?Lines_tree;
?????make_tree(a,?b,?root);
}


void ?update(Lines_tree? * ?now)??? // lbd,?rbd,?m的計算都在這個里面!
{
????
if (now -> cnt > 0 )?now -> m? = ?now -> r - now -> f;
????
else ? if (now -> r == now -> f + 1 )?now -> m? = ? 0 ;
????
else ?now -> m? = ?now -> lchild -> m? + ?now -> rchild -> m;
}


void ?update2(Lines_tree * ?now)
{
????
if (now -> cnt > 0 )? {?now -> lbd? = ? 1 ;?now -> rbd? = ? 1 ;?now -> lines? = ? 1 ;?}
????
else ? if (now -> f + 1 == now -> r)? {now -> lbd? = ? 0 ;?now -> rbd? = ? 0 ;?now -> lines? = ? 0 ;}
????
else
????
{
????????now
-> lbd? = ?now -> lchild -> lbd;?now -> rbd? = ?now -> rchild -> rbd;
????????now
-> lines? = ?now -> lchild -> lines + now -> rchild -> lines? - ?now -> lchild -> rbd * now -> rchild -> lbd;
????}

}


void ?insert( int ?a,? int ?b,?Lines_tree? * ?now)
{
????
if (a <= now -> f? && ?b >= now -> r)
????????now
-> cnt ++ ;
????
if (now -> r - now -> f > 1 )
????
{
????????
if (a < (now -> f + now -> r) / 2 )????insert(a,?b,?now -> lchild);
????????
if (b > (now -> f + now -> r) / 2 )????insert(a,?b,?now -> rchild);
????}

????update(now);
????update2(now);
}


void ?del( int ?a,? int ?b,?Lines_tree? * ?now)
{
????
if (a <= now -> f? && ?b >= now -> f)
????
{
????????
if (a == now -> f)?now -> lbd? = ? 0 ;
????????
if (b == now -> r)?now -> rbd? = ? 0 ;
????????now
-> cnt -- ;
????}

????
if (now -> r - now -> f > 1 )
????
{
????????
if (a < (now -> f + now -> r) / 2 )????del(a,?b,?now -> lchild);
????????
if (b > (now -> f + now -> r) / 2 )????del(a,?b,?now -> rchild);
????}

????update(now);
????update2(now);
}


int ?cmp( const ? void ? * ?a,? const ? void ? * ?b)
{
????
return ?( * (Line * )a).x? - ?( * (Line * )b).x;??? // 這里不要寫成->
}


void ?init()
{
????
// initiation
????
// input
???? int ?i;
????scanf(
" %d " ,? & nr);
????
for (i = 0 ;?i < nr;?i ++ )
????
{
????????scanf(
" %d%d%d%d " ,? & r[i].x,? & r[i].y,? & r[i].x1,? & r[i].y1);
????????line[
2 * i]? = ?Line(r[i].x,?r[i].y,?r[i].y1,? 0 );
????????line[
2 * i + 1 ]? = ?Line(r[i].x1,?r[i].y,?r[i].y1,? 1 );
????}
????????
????qsort(line,?nr
* 2 ,? sizeof (line[ 0 ]),?cmp);
????
// pretreatment
}


void ?work()
{
????
int ?nowM? = ? 0 ;
????
int ?nowLine? = ? 0 ;
????
int ?lastM? = ? 0 ;
????
int ?lastLine? = ? 0 ;
????
int ?i;
????
for (i = 0 ;?i < nr * 2 ;?i ++ )
????
{
????????
if (line[i].sign == 0 )
????????????insert(line[i].y1,?line[i].y2,?root);
????????
else ?del(line[i].y1,?line[i].y2,?root);
????????nowM?
= ?root -> m;
????????nowLine?
= ?root -> lines;
????????ans?
+= ?lastLine? * ? 2 ? * ?(line[i].x - line[i - 1 ].x);
????????ans?
+= ?abs(nowM - lastM);
????????lastM?
= ?nowM;
????????lastLine?
= ?nowLine;
????}

}


void ?output()
{
????printf(
" %d\n " ,?ans);
}


int ?main()
{
// ????freopen("t.in",?"r",?stdin);
????make( - 10000 ,? 10000 );
????init();
????work();
????output();
????
return ? 0 ;
}

Feedback

# re: 線段樹測度與連續斷的應用 on IOI98 pictures  回復  更多評論   

2007-04-07 01:01 by
void del( int a, int b, Lines_tree * now)
{
if (a <= now -> f && b >= now -> f)


這個是不是有問題?

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲风情亚aⅴ在线发布| 欧美一区二区三区免费视| 国产精品99久久99久久久二8| 欧美激情一二区| 在线亚洲一区| 老司机精品福利视频| 日韩写真在线| 国产精品视频999| 久久婷婷国产综合国色天香| 亚洲日韩欧美视频| 亚洲欧美日韩视频二区| 激情久久久久久久| 欧美日本国产一区| 欧美在线精品免播放器视频| 亚洲国产精品va在线观看黑人| 亚洲一区在线观看视频| 一区二区在线不卡| 欧美午夜视频在线| 乱人伦精品视频在线观看| 一本久久精品一区二区| 麻豆精品视频在线观看| 亚洲永久免费观看| 樱桃国产成人精品视频| 国产精品初高中精品久久| 久久综合久色欧美综合狠狠| 亚洲一区视频| 亚洲国产精品电影| 久久裸体艺术| 亚洲欧美日韩在线观看a三区| 在线国产精品播放| 国产精品爽爽ⅴa在线观看| 免费观看日韩av| 欧美亚洲综合另类| 在线综合视频| 亚洲人成亚洲人成在线观看图片| 久久久久久久尹人综合网亚洲| 亚洲天堂免费在线观看视频| 亚洲国产成人在线播放| 国产一区二区三区四区在线观看| 欧美日韩中文精品| 欧美成人性网| 久久夜色精品国产亚洲aⅴ| 亚洲欧美精品| 亚洲视频一二三| 亚洲伦理自拍| 亚洲国产另类精品专区| 蜜桃av一区| 狂野欧美激情性xxxx欧美| 久久www免费人成看片高清| aa国产精品| 亚洲另类一区二区| 亚洲激情网址| 亚洲第一偷拍| 在线电影国产精品| 精品999日本| 国内精品久久久久国产盗摄免费观看完整版| 国产精品国产一区二区| 欧美日韩国产影院| 欧美日韩成人精品| 欧美日韩不卡视频| 欧美日产一区二区三区在线观看| 欧美黄色片免费观看| 免费视频最近日韩| 欧美成年人在线观看| 欧美va亚洲va日韩∨a综合色| 久久免费偷拍视频| 老司机久久99久久精品播放免费| 久久蜜臀精品av| 免费观看成人| 欧美黑人在线观看| 欧美日韩视频一区二区| 欧美日韩国产系列| 国产精品九色蝌蚪自拍| 国产精品一页| 国产综合婷婷| 亚洲国产综合91精品麻豆| 亚洲欧洲日产国码二区| 一本大道av伊人久久综合| 亚洲午夜精品网| 欧美亚洲综合在线| 老巨人导航500精品| 欧美夫妇交换俱乐部在线观看| 欧美激情亚洲另类| 99热在这里有精品免费| 亚洲一区二区三区久久| 欧美在线国产| 欧美mv日韩mv国产网站| 欧美日韩一区二区国产| 国产欧美成人| 亚洲国产日韩欧美| 制服丝袜激情欧洲亚洲| 新狼窝色av性久久久久久| 美女999久久久精品视频| 最新国产成人在线观看| 亚洲一区二区三区四区在线观看| 欧美一区二区三区婷婷月色| 欧美88av| 国产嫩草一区二区三区在线观看 | 国产精品一区久久| 在线不卡中文字幕播放| 一区二区三区欧美在线观看| 久久国产婷婷国产香蕉| 欧美国产日本高清在线| 亚洲一区二区成人| 久久综合伊人77777麻豆| 欧美午夜一区二区福利视频| 国模精品一区二区三区色天香| 亚洲伦理久久| 久久久精品日韩| 亚洲精品日韩久久| 久久精品国产综合精品| 欧美日韩视频在线一区二区观看视频| 国产视频精品xxxx| 一本一道久久综合狠狠老精东影业| 欧美伊久线香蕉线新在线| 欧美黄色aa电影| 亚洲欧美成人在线| 欧美日韩国产a| 国产色产综合色产在线视频 | 亚洲影视在线播放| 欧美v国产在线一区二区三区| 99综合视频| 欧美成人激情在线| 国产视频精品网| 亚洲综合欧美| 亚洲精品国产品国语在线app| 久久国产精品99国产精| 国产精品久久久久久久第一福利 | 欧美大片一区二区三区| 国内精品久久久久久影视8| 亚洲在线观看免费视频| 欧美激情一区二区三区在线视频 | 99国产精品99久久久久久| 老司机午夜精品| 国产综合视频在线观看| 午夜在线a亚洲v天堂网2018| 亚洲精品美女久久7777777| 久久久亚洲国产天美传媒修理工 | 亚洲一区二区三区精品动漫| 欧美成人综合在线| 亚洲电影成人| 久久天天综合| 欧美一区亚洲二区| 国产欧美日本一区视频| 亚洲欧美影院| 亚洲网站在线播放| 欧美视频久久| 亚洲一区国产视频| 一本色道久久99精品综合| 欧美人在线观看| 一区二区高清| 日韩视频在线观看| 欧美视频在线观看视频极品| 99视频超级精品| 91久久久久久久久| 欧美另类一区| 在线视频欧美日韩精品| 亚洲九九精品| 欧美日精品一区视频| 亚洲影视九九影院在线观看| 99精品久久久| 国产精品美女久久久久av超清| 亚洲欧美日韩在线不卡| 亚洲男人的天堂在线| 国产日韩欧美一区二区三区四区| 久久精品国产99国产精品| 欧美在线91| 亚洲国产99| 亚洲日本成人| 国产精品久久久久久av下载红粉 | 国产精品日韩久久久久| 欧美一级午夜免费电影| 欧美伊人精品成人久久综合97| 国模精品一区二区三区| 欧美www在线| 欧美日韩国产一级片| 亚洲欧美日本伦理| 久久成人综合视频| 91久久精品www人人做人人爽| 亚洲欧洲精品一区二区精品久久久 | 国产麻豆精品theporn| 久久精品成人一区二区三区| 久久免费99精品久久久久久| 亚洲精品久久久久久下一站 | 狠狠色2019综合网| 欧美顶级艳妇交换群宴| 欧美大尺度在线| 亚洲在线中文字幕| 久久国产综合精品| a91a精品视频在线观看| 亚洲在线免费| 亚洲高清视频一区| 一区二区日本视频| 在线电影欧美日韩一区二区私密| 亚洲国产欧美在线人成| 国产精品大片| 媚黑女一区二区| 国产精品成人一区二区三区夜夜夜 | 午夜精品三级视频福利| 亚洲国产精品va在线看黑人动漫|