Professional Documents
Culture Documents
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.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
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 }
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
- 28 - IOI99
IOI98 PICTURE
[1,10]
[1,5] [5,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)
Lines_Tree.M M
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
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
- 34 - IOI99
IOI98 PICTURE
[ 3]Picture
Picture
Picture
O(N^2)
O(NlogN)
+ = N
IOI99 - 35 -