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

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

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

(一)、?? 測度

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

?

?

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

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

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

?

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

Procedure? Lines_Tree.UpData

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

2??????? ??then? M? ? ? a[j]? ? [i]????? { 蓋滿區(qū)間,測度為 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 來動態(tài)維護測度后執(zhí)行根結點的 Insert Delete 的復雜度仍為 O(logN)

(二)、?? 連續(xù)段數(shù)

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

?

???????? 1??? 左端點 I 被描述區(qū)間蓋到

lbd? =?

???????? 0? ?? 左端點 I 不被描述區(qū)間蓋到

?

???????? 1???? 右端點 J 被描述區(qū)間蓋到

rbd? =?

??????? ?0 ???? 右端點 J 不被描述區(qū)間蓋到

?

lbd rbd 的實現(xiàn):

????????? 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’ 動態(tài)地維護 Line 域。與 UpData 相似, UpData’ 也在每一次執(zhí)行 Insert Delete 后執(zhí)行。定義如下:

Procedure? Lines_Tree.UpData’

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

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.??????? 以矩形頂點坐標切割平面,實現(xiàn)橫縱坐標的離散化并建立映射 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;? // 連續(xù)段數(shù)
???? 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: 線段樹測度與連續(xù)斷的應用 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)


這個是不是有問題?

只有注冊用戶登錄后才能發(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>
            亚洲人成免费| 欧美一区二区三区成人| 久久久精品一区| 亚洲美女毛片| 亚洲国产成人精品久久久国产成人一区 | 久久综合久久美利坚合众国| 性xx色xx综合久久久xx| 欧美中文在线免费| 久久九九免费视频| 久久精品一二三区| 欧美成人精品在线播放| 欧美成年人视频网站欧美| 欧美成人首页| 韩国福利一区| 亚洲激情综合| 亚洲午夜精品一区二区| 欧美一级视频精品观看| 麻豆av一区二区三区| 欧美黄色日本| 亚洲一二区在线| 久久久久久久网| 欧美一区二区三区成人| 欧美国产成人在线| 日韩一级片网址| 欧美一区二区三区啪啪| 欧美v国产在线一区二区三区| 欧美日韩三级电影在线| 国产一区在线看| 亚洲乱码一区二区| 欧美综合国产精品久久丁香| 麻豆久久精品| 一本久道久久综合中文字幕| 欧美一区激情| 欧美日本乱大交xxxxx| 国产区在线观看成人精品| 亚洲第一中文字幕在线观看| 午夜精品久久久| 亚洲欧洲视频在线| 久久精品九九| 国产精品夜夜嗨| 亚洲国产三级| 久久久最新网址| 在线亚洲欧美视频| 欧美精品网站| 亚洲激情成人| 免费观看日韩av| 欧美亚洲三级| 国产日韩一区欧美| 欧美亚洲一区| 亚洲综合欧美日韩| 国产精品国产三级国产aⅴ无密码| 亚洲精选久久| 亚洲国产精品电影| 免费观看日韩| 91久久久在线| 欧美大片91| 蜜桃久久精品乱码一区二区| 在线不卡视频| 蜜桃av噜噜一区二区三区| 亚洲淫性视频| 国产精品一级在线| 午夜精彩国产免费不卡不顿大片| 一本久久a久久精品亚洲| 欧美激情女人20p| 亚洲精品久久久久| 亚洲日本aⅴ片在线观看香蕉| 久久免费视频这里只有精品| 国产精品成人观看视频免费| 99av国产精品欲麻豆| 亚洲日韩成人| 久久国产精品久久精品国产 | 亚洲午夜伦理| 久久gogo国模裸体人体| 亚洲麻豆一区| 久久一区二区精品| 亚洲精品乱码视频| 亚洲免费中文| 久久综合久久综合久久综合| 亚洲国产午夜| 久久精品国产亚洲一区二区三区| 欧美高清视频免费观看| 国精品一区二区三区| 先锋影音一区二区三区| 亚洲黄色免费电影| 亚洲一区二区在线看| 亚洲人成毛片在线播放女女| 日韩视频一区二区三区在线播放免费观看| 亚洲午夜影视影院在线观看| 久久久久天天天天| 国产亚洲成av人在线观看导航| 亚洲电影在线播放| 国产偷国产偷精品高清尤物| 久久久五月婷婷| 欧美激情视频免费观看| 亚洲欧美日韩一区在线观看| 最新亚洲一区| 亚洲国产日韩精品| 亚洲日韩中文字幕在线播放| 国产欧美日韩视频在线观看| 欧美激情第三页| 亚洲一区二区在线看| 国产一区二区日韩精品| 亚洲午夜一区二区三区| 国产一区二区三区在线观看免费视频| 亚洲人成在线免费观看| 久久久www| 亚洲天堂免费观看| 久久久精品国产免大香伊| 蜜臀a∨国产成人精品 | 欧美r片在线| 亚洲一区日韩| 国产精品欧美日韩| 亚洲一级片在线观看| 日韩一区二区精品视频| 久久精品国产一区二区电影 | 日韩视频中文字幕| 欧美激情第1页| 欧美激情第8页| 一区国产精品| 亚洲高清不卡在线| 欧美高清视频在线| 亚洲乱码国产乱码精品精可以看| 久久九九电影| 亚洲国产二区| 免费久久99精品国产自在现线| 国产一区99| 久久国产视频网站| 久久久久一区二区三区四区| 亚洲国产一区二区三区在线播 | 欧美午夜视频网站| 亚洲丁香婷深爱综合| 欧美在线一级视频| 91久久国产综合久久蜜月精品| 亚洲第一区在线| 欧美日韩成人一区二区三区| 欧美日韩亚洲视频一区| 亚洲午夜久久久久久久久电影院| 午夜精品久久久久久久久久久久久 | 99在线精品视频| 欧美视频一区二区三区…| 99精品国产热久久91蜜凸| 99xxxx成人网| 国产视频一区免费看| 裸体素人女欧美日韩| 老妇喷水一区二区三区| 99热在线精品观看| 欧美一激情一区二区三区| 欧美日本韩国在线| 99re热精品| 激情综合久久| 蜜桃精品久久久久久久免费影院| 欧美激情第六页| 久久久噜噜噜久久人人看| 亚洲天堂视频在线观看| 免费不卡视频| 亚洲一区久久久| 香港久久久电影| 亚洲精品在线三区| 久久在线视频在线| 亚洲免费在线| 亚洲第一区在线观看| 国产日韩av高清| 欧美一区网站| 欧美日本在线播放| 亚洲国产小视频在线观看| 国产欧美日韩视频一区二区| 亚洲国产精品久久91精品| 久久免费视频在线观看| 男女视频一区二区| 国产欧美精品日韩区二区麻豆天美| 亚洲国产黄色| 国产亚洲一区在线| 欧美国产成人在线| 亚洲人成欧美中文字幕| 久久久久久久激情视频| 亚洲激情二区| 欧美日韩国产在线播放网站| 亚洲国产一区在线观看| 在线日韩av永久免费观看| 午夜一级久久| 久久久久久久欧美精品| 国产美女精品视频| 亚洲一区亚洲| 欧美在线播放高清精品| 国产欧美日韩综合一区在线观看| 久久亚洲国产精品一区二区| 欧美精品在线一区二区| 美女诱惑黄网站一区| 国产午夜精品全部视频播放 | 黑人一区二区| 欧美另类在线播放| 亚洲国产精品第一区二区三区| 先锋影音一区二区三区| 欧美亚一区二区| 亚洲美女精品成人在线视频| 亚洲精品之草原avav久久| 久热精品在线| 国产精品剧情在线亚洲| 欧美精品97| 在线一区免费观看|