You are on page 1of 15

IOI98 PICTURE

IOI98 PICTURE

+ =

IOI98 Picture

Picture

IOI98 Picture

Picture

1 Picture
Picture IOI98

1 30

IOI99 - 21 -
IOI98 PICTURE

1


0<5000
[-1000010000]

1

1
2 2 3

A
C

B D

A L1 L2 L3 B

2 3 4
AB CD

2

[-1000010000]

4 AB
L1L2L3 L1L2L3

3

20001*20000*2
[-1,000,0001,000,000] 8*10^12

- 22 - IOI99
IOI98 PICTURE

2*N
2*N N
(2*N+1)^2 5

A B C

5 6

AB CD

4*N

(1)

1
2 ans 0
3
ans
4 ans

3 Picture

(1)

O(NlogN)
Type

IOI99 - 23 -
IOI98 PICTURE

Mapped_TYPE = Object
Len : 0..Max; {}
Coord : array[1..Max] of integer; {}
Procedure Creat; {}
Procedure Insert(X : integer); { X}
Procedure Sort; {}
End

Procedure Mapped_TYPE.Creat
1 Len 0
{Creat }

Procedure Mapped_TYPE.Insert(X : Integer)


1 Len Len + 1
2 Coord[Len] X
{Insert }

Procedure Mapped_TYPE.Sort

{Sort Len Coord Sort
N = LenSort O(NlogN)
}

Var
X_map, Y_map : Mapped_TYPE {}

X_map.Creat
X_map.Insert X_map.Coord
X_map.Sort


Creat Insert O(1)Sort O(NlogN)

(2)

1N*2-1(N )
S Length(S)
S Belong(S)

N * 2 1

ANS = Length( s) * Belong ( s)


S 1

Lenth(s)
Length(s) X_Map.coord[s] X_map.Coord[s-1]
- 24 - IOI99
IOI98 PICTURE

Belongs
6
N*2

Var
A : array[1..MaxSize] of integer

Belong(s) A[I]
I I
7
add=0
a[1]=1
add=1
a[2]=1

add=2
a[3]=-1
add=1
a[4]=1
add=2
a[5]=-1

add=1
a[6]=-1
add=0
7

add a[I] 7
I
1A[I]0 add = 0 I

2A[I]0 add = 0 I

Belong(s)
1 A[I]
2 add
Belong(s)

Type
Group_TYPE = Object
A : array[1..MaxSize] of Integer; {
7}
Procedure Count; {}
Function Adding; { Belong(s)}
End

Procedure Group_TYPE.Count {}
1 A
2 for I 1 to N

IOI99 - 25 -
IOI98 PICTURE

3 do if I S
{}
4 then A[ I ] A[ I ] + 1
5 A[ I ] A[ I ] - 1
{ I I I }

Function Group_TYPE.Adding { Belong(S)}


1 Count
2 add 0
3 sum 0
4 for I 1 to
5 do if a[I] 0
6 then if add = 0
7 then sum sum + 1
{}
8 add add + a[I]
9 if add = 0
10 then sum sum + 1
{}
11 return sum
{Count Adding }
Var
Scan : Group_TYPE
Belong(s) Scan.Adding

Scan.Adding O(N) 2*N-1
O(N^2)
O(N^2) Picture O(N^2)
N 5000

Picture

- 26 - IOI99
IOI98 PICTURE

Picture

Picture

Picture Group_TYPE.Count 45

O(N)

Picture Picture
5000

Picture

Belong(s)
2

IOI99 - 27 -
IOI98 PICTURE


Picture

Picture
Picture

1

Y
Q
Q

A[1..N]
P=[x,y] 1ijN
x=a[i] y=a[j] i, j x,y
[x, y]xy

[I, I+1] (I=1N-1)


[ I, J ]
(J I > 1)
Type
Lines_Tree = Object
i, j : integer; { I, J}
count : integer; {}
leftchild, rightchild : Lines_Tree; {}
end
Lines_Tree 8
10 [36]
[35][56] count 1 count
0

- 28 - IOI99
IOI98 PICTURE

[1,10]

[1,5] [5,10]

[1,3] [3,5] [5,7] [7,10]

[1,2] [2,3] [3,4] [4,5] [5,6] [6,7] [7,8] [8,10]

[8,9] [9,10]
8

L, R
Lines_Tree.Build(l, r : integer):
Procedure Lines_tree.Build(l, r : integer)
1 I l {}
2 J r {}
3 Count 0 {}
4 If r - l > 1 { r-l=1 }
5 then k (l + r) {}
6 new(leftchild)
7 leftchild.Build(l, k) {}
8 new(rightchild)
9 rightchild.Build(k, r) {}
10 else leftchild nil
11 rightchild nil
Root Root.Build
logN
O(N)

Lines_Tree.Insert(l, r :
integer)
Procedure Lines_Tree.Insert(l, r : integer)
{[l, r]lr }
1 if (l <= a[i]) and (a[j] <= r)
2 then count count + 1 {}
3 else if l < a[(i + j) div 2] {}
4 then leftchild.Insert(l, r) {}
5 if r > a[(i + j) div 2 ] {}
6 then rightchild.Insert(l, r) {}

Lines_Tree.Delete(l, r : integer)
Procedure Lines_Tree.Delete(l, r : integer)
{[l, r]lr }

IOI99 - 29 -
IOI98 PICTURE

1 if (l <= a[i]) and (a[j] <= r)


2 then count count - 1 {}
3 else if l < a[(i + j) div 2 ] {}
4 then leftchild.Delete(l, r) {}
5 if r > a[(i + j) div 2 ] {}
6 then rightchild.Delete(l, r) {}
Lines_Tree.Delete(l, r : integer) [l, r]
[25][34]
Lines_Tree.Insert Lines_Tree.Delete
O(logN)([ 1])

(1)

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.MUpData
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)
(2)

[12][23][56][13][56] 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

- 30 - IOI99
IOI98 PICTURE

lbd = 0 count = 0
leftchild.lbd Count=0
1 count > 0
rbd = 0 count = 0
rightchild.rbd Count=0
lbd rbdLine
1 count > 0
Line = 0 count = 0
Leftchild.Line + Rightchild.Line - 1
Count=0Leftchild.rbd = 1 Rightchild.lbd = 1
Leftchild.Line + Rightchild.Line
Count=0Leftchild.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}

LineM Lines_Tree.Build

Lines_Tree = object
i, j : integer;
count : integer;
line : integer;
lbd, rbd : byte;
m : integer;
leftchild,
rightchild : Lines_tree;
procedure Build(l, r : integer);
procedure Insert(l, r : integer);
procedure Delete(l, r : integer);
procedure UpData;
procedure UpData;
end

IOI99 - 31 -
IOI98 PICTURE

2 Picture

9 CD EF AGHB
DD FF

- 32 - IOI99
IOI98 PICTURE

A B A B

C D D' C D D'

E F F' E F F'
G H G H

L L

9 10

9DD FF
CDEF BF
DDFF

1. L
2. L 10
3. L
*2 10L
[G,A][E,C] 1 1*2=2
L [E,C], 1
1*2=2

4. L 10L
[H,B][G,A]
L
Insert
Delete

Belong(s)

10
L [G,A][E,C][H,F][D,B]
[G,A][E,C] L
Tree1Tree2|Tree1.M Tree2.M|

[ 2]

1.
X_Map Y_Map
2.

IOI99 - 33 -
IOI98 PICTURE

3.
Root.Build(1, N*2)
Nowm 0
4.
NowLine 0
5.
6.
Ans 0
for I 1 to
7.
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
O(NlogN) N*2
O(logN) O(NlogN)

3

O(N^2)
O(NlogN)


Data_4_1.Txt
1
Data_4_2.Txt
Data_4_3.Txt 1
Data_4_4.Txt 30
Data_4_5.Txt
300/Borland Pascal [ 1]
[ 2]

4 Picture
Picture

Picture
Mapped.Coord
Lines_Tree.M ans

Picture Picture Picture


L
L
IL
*X_Map.coord[I] X_Map.coord[I-1]

- 34 - IOI99
IOI98 PICTURE

[ 3]Picture

Picture


Picture
O(N^2)
O(NlogN)


+ = N

IOI99 - 35 -

You might also like