Professional Documents
Culture Documents
MC LC
1
Phng
php
lu
tha
ma
trn
..........................................................................................
1
1.1
Tm
s
Fibonacci
............................................................................................................................
1
1.2
Tnh
lu
tha
ca
mt
s
.............................................................................................................
2
1.3
Tnh
lu
tha
ca
mt
ma
trn
vung
.....................................................................................
3
1.4
Gii
bi
10229
-
Modular
Fibonacci
........................................................................................
3
1.5
Bi
hc
kinh
nghim
.....................................................................................................................
4
1.6
Cc
bi
tng
t
.............................................................................................................................
4
1.7
M
ngun
cho
bi
10229
..............................................................................................................
4
2
Quy
hoch
ng
........................................................................................................................
5
2.1
Gii
thiu
..........................................................................................................................................
5
2.2
Bi
ton
sn
nh
.............................................................................................................................
5
2.3
Bi
hc
kinh
nghim
.....................................................................................................................
6
2.4
Cc
bi
tng
t
.............................................................................................................................
7
3
S
hc
ng
d
.......................................................................................................................
13
3.1
Chia
ht
v
chia
c
d
................................................................................................................
13
3.2
S
nguyn
t
..................................................................................................................................
14
3.3
Bi
ton
t-prime
..........................................................................................................................
15
3.4
Phn
tch
mt
s
thnh
tch
cc
tha
s
nguyn
t
.........................................................
16
3.5
S
d
ca
(a/b)
%
MOD
............................................................................................................
21
4
Cy
phn
on
(Segment
Tree/Interval
Tree)
............................................................
24
4.1
Bi
ton
tnh
trung
bnh
nhanh
..............................................................................................
24
4.2
Ci
t
interval
tree
...................................................................................................................
24
4.3
Gii
bi
tnh
trung
bnh
nhanh
...............................................................................................
25
4.4
Bi
hc
kinh
nghim
..................................................................................................................
30
4.5
Cc
bi
tng
t
..........................................................................................................................
30
4.6
Cc
bi
nng
cao
..........................................................................................................................
30
5
Tm
kim
tam
phn
(Ternary
Search)
..........................
Error!
Bookmark
not
defined.
5.1
Bi
ton
khong
cch
ngn
nht
............................................................................................
48
5.2
Bi
tng
t
.................................................................................................................................
50
6
Gii
thut
trn
th
............................................................................................................
52
6.1
Gii
thut
Dijkstra
tm
ng
i
ngn
nht
.......................................................................
52
6.2
Gii
thut
Kruskal
tm
cy
khung
c
trng
s
nh
nht
.................................................
56
7
Cn
tip
...
...............................................................................
Error!
Bookmark
not
defined.
1.1 Tm s Fibonacci
!!!
!
!
1 1
=
!!!
1 0
! !
(4)
! !!
1 1!
Vy Fn (hng 2 ct 1)= hng cui ca ma trn
nhn vi ct u tin ca ma trn
1 0
! !
1
1 1!
hay
= phn t hng 2 ct 1 ca ma trn
.
! !!
0
1 0
Ch l trong cng thc (4), gi tr ca F-1 bng bao nhiu khng quan trng v ta khng s
dng n tnh Fn.
1 1!
Tm li tnh Fn ta tnh
v ly phn t hng 2 ct 1.
1 0
1 1!
Nh th, thay v tnh Fn ta tnh
. Tnh lu tha ca ma trn nh th no ? C nhanh
1 0
hn tnh Fn trc tip khng ?
phn tch thi gian tnh lu tha ca ma trn, ta quay li bi ton tnh lu tha ca mt s
(s l ma trn 1 hng 1 ct).
Gii thut n gin tnh lu tha ca mt s (xn) l:
int lt = 1;
for (int i = 1; i <= n; i++) {
lt = lt*x;
}
return x;
Vng lp for ny vn chy n ln => thi gian chy vn l O(n). Vy th c g hay hn tnh s
Fibonacci trc tip ? C cch no tnh xn nhanh hn khng ?
Tnh xn bng cch nhn lin tip nh trn ta cn n php nhn. Gi s n l s chn, ta vit li:
xn = xn/2 * xn/2
Nh th s php nhn s gim bt gn . Nu n l s l, xn = xn-1*x, xn-1 s c tnh nh
trng hp n chn.
Gii thut quy tnh xn nh bn di.
int power(int x, int n) {
if (n == 0) return 1;
if (n % 1) return power(x, n-1) * x;
int temp = power(x, n/2);
return temp*temp;
}
Mt tip cn khc tnh xn bng phng php lp nh sau.
Gi s bk-1 bk-2 b1 b0 l biu din nh phn ca n, ta c
xn = x(bk-1 bk-2 b1 0) * xb0 = x2(bk-1 bk-2 b1) * xb0 = (x^2) (bk-1 bk-2 b1) * xb0 =
((x^2)^2) (bk-1 bk-2 b2) * (x^2) b1 * xb0 =
(vi (x^2) = x2).
Nh th ta thy rng nu b0 = 1 ta nhn kt qu vi x. K tip, loi b bit cui cng i. Sau
cng thay x bng x^2.
2/61
Matrix =
struct Matrix {
long long a, b, c, d;
};
To ma trn n v
void identity(Matrix& I) {
I.a = I.d = 1;
I.b = I.c = 0;
}
Nhn ma trn
Matrix multiply(Matrix A, Matrix
Matrix C;
C.a = (A.a*B.a + A.b*B.c) %
C.b = (A.a*B.b + A.b*B.d) %
C.c = (A.c*B.a + A.d*B.c) %
C.d = (A.c*B.b + A.d*B.d) %
return C;
}
Vi mod = 2m = (1<<m);
3/61
B) {
mod;
mod;
mod;
mod;
Tnh lu tha ca 1 s hoc 1 ma trn bng phng php lp hoc quy c phc
tp thi gian O(logn). Ta lm c iu ny v 2 l do:
o Ta ch cn tnh xn m khng cn phi tnh tt c x1, x2, , xn-1 nn khng cn
phi duyt qua tt c cc con s t 1 n n.
o Tch bi ton ln thnh 2 bi ton nh ging nhau nn ch cn gii 1 bi.
a bi ton tm s Fibonacci v bi ton tm lu tha nh vo cch biu din ma
trn.
1.6 Cc
bi
tng
t
-
-
if (cin.fail())
break;
if (n <= 1)
cout << n << endl;
else {
F.a = F.b = F.c = 1; F.d = 0;
cout << process(n, m) << endl;
}
}
return 0;
Quy hoch ng
Quy hoch ng l mt k thut c dng thit k cc gii thut c phc tp thi gian
thp (a thc) bng cch lu tr cc kt qu trung gian. Ta c th s dng k thut ny bng
2 cch:
-
-
2.2 Bi
ton
sn
nh
1047 - Neighbor House
The people of Mohammadpur have decided to paint each of their houses red, green, or
blue. They've also decided that no two neighboring houses will be painted the same color.
The neighbors of house i are houses i-1 and i+1. The first and last houses are not
neighbors.
You will be given the information of houses. Each house will contain three integers "R G
B" (quotes for clarity only), where R, G and B are the costs of painting the corresponding
house red, green, and blue, respectively. Return the minimal total cost required to perform
the work.
Input
Input starts with an integer T ( 100), denoting the number of test cases.
Each case begins with a blank line and an integer n (1 n 20) denoting the number of
houses. Each of the next n lines will contain 3 integers "R G B". These integers will lie in
the range [1, 1000].
Output
For each case of input you have to print the case number and the minimal cost.
Sample Input
2
4
13 23 12
77 36 64
44 89 76
5/61
31 78 45
3
26 40 83
49 60 57
13 89 99
Output for Sample Input
Case 1: 137
Case 2: 96
C n cn nh cn sn. Mi cn nh c sn bng 1 trong 3 mu R, G, B vi 3 mc gi
tng ng. Phi sn lm sao cho hai cn nh cnh nhau khng cng mu v tng gi t nht.
Gi r[i], g[i] v b[i] l cc gi tng ng nu sn cn nh i bng cc mu R, G, B.
phn tch cc bi dng nh th ny ta chia bi ton thnh n bc ng vi n cn nh. Ti
bc i, ta gi s cc cn nh t 1 n (i-1) c sn ri v tng gi t cn 1 n (i-1) cng
bit ri. Nu cn nh th (i-1) sn mu R v c tng gi t 1 n (i-1) l R(i-1); nu cn
nh th (i-1) sn mu G c tng gi l G(i-1) v nu sn mu B c tng gi B(i-1) th:
-
-
-
Rt nhiu bi ton c th gii bng k thut quy hoch ng. Cc bi ton quy hoch
ng thng lin quan n vic tm ln nht, nh nht, tng s.
Cch tip cn gii l chia bi ton thnh nhiu bc, mi bc l mt bi ton con
tng t nhau. Ti mi bc ta c 1 s s la chn.
C gng biu din thng tin cn lu tr ti tng bc sao cho vic tnh ton kt qu
ti bc i ch cn s dng cc thng tin tng hp ca cc bc t 1 n i-1. Hay nht
l tnh bc i ta ch cn thng tin ca bc i-1 (khng phi bi no cng ri v
trng hp ny).
2.4 Cc
bi
tng
t
-
1231 Coin Change (I): tm s cch to s tin c gi tr K bng cch dng cc ng tin c
mnh gi: A1, A2 ... An v mi mnh gi c s lng C1, C2, ... Cn.
Ta chia bi ton thnh n bc, mi bc ta xt tng loi mnh gi.
bc i, ta xt ng tin c mnh gi A[i], ta cc s la chn sau:
Chn 0 ng c mnh gi A[i]
Chn 1 ng c mnh gi A[i]
o
o
o
o
7/61
10
12
12
10
Nhn xt:
-
-
-
T hng 1 n hng N-1, s phn t tng dn. T hng N n hng 2N-1 s phn t
gim dn.
Cc hng t 2 n N, (i, j) nu j < i th c chung cnh vi (i-1, j-1) v (i-1, j)
ngc li n l phn t cui cng, ch chung cnh vi (i-1, j-1).
Cc hng t N+1 n 2N-1, (i, j) c chung cnh vi (i-1, j) v (i-1, j+1).
8/61
TG n cc tng
bn thp tri
TG n cc tng
bn thp phi
TG nhy t tng i
ca thp tri sang
tng (i+1) thp phi
TG nhy t tng i
ca thp phi sang
tng (i+1) thp tri
L[i]
9
8
6
5
R[i]
10
3
9
7
L2R[i]
R2L[i]
3
2
5
3
4
2
3
2
1
0
Kt qu: 26
10/61
1037 Agent 47: Cho n mc tiu (1<= n <= 15), mi mc tiu c ch s sc kho l A1, A2,
, An. Nhim v ca Agent 47 l phi tiu dit ht tt c cc mc tiu. u tin Agent c
trang b 1 v kh c kh nng lm tiu hao 1 n v sc kho trn 1 ln bn. Mt mc tiu s
b tiu dit nu ch s sc kho ca n <= 0. Mi khi tiu dit c 1 mc tiu, agent c th
thu gom v kh ca mc tiu tiu dit cc mc tiu khc. V kh ca mt mc tiu c
tc dng khc nhau trn tng mc tiu khc. Gi Cij l kh nng lm tiu hao sc kho ca v
kh (ca mc tiu) i trn mt ln bn i vi mc tiu j, 0 <= Cij <=9. Tm cch cho agent 47
tiu dit ht tt c cc mc tiu vi s ln bn t nht.
Bi ny thuc dng kh. Ta th phn tch cc vn sau:
-
-
Nu ta chia bi ton thnh n bc, mi bc chn 1 mc tiu tiu dit, th vic la chn
mc tiu bc i s ph thuc vo cc bc trc mc tiu no c chn.
K thut quy hoch ng s p dng c trong trng hp ny nu s cch la chn
ca tt c cc bc trc (thng l tch cc s la chn ca cc bc t 1 n i1) nh ta c th lu tr li c. Nu s la chn ny qu ln quy hoch ng
trong trng hp ny s thy bi. Hy tm cch chia bc v biu din li s la
chn. Mt trong nhng cch lm gim s la chn ca tt c cc bc trc l:
phi th t ho s la chn cc bc trc . V d bc 1 chn a, bc 2 chn b,
bc 3 chn c th cng ging nh bc 1 chn b, bc 2 chn c, bc 3 chn a. Chn
cch no th sau 3 bc ta cng c a, b, c. Nu lm c nh th ta gim t giai
tha thnh t hp ! S lng la chn s gim ng k c th lu tr.
Quay tr li bi ton, nu biu din 1 mc tiu b tiu dit l 1, v cha b tiu dit l 0
th mi s la chn ca cc bc t 1 n i-1 c th biu din bng 1 chui nh phn n bit.
Do n <= 15 nn chui nh phn n bit tng ng vi 1 s nguyn 15 bit. Do , ta c th s
dng 1 s nguyn biu din cc s la chn khc nhau ca cc bc t 1 n i-1. Nu gi
j l s nh phn biu din cc s la chn ca cc bc t 1 n i-1, th bc i ta c:
-
-
<j+k> l php ton nh du mc tiu k b tiu dit trong j, hay t bit tng ng
vi k trong j bng 1. iu ny c ngha l tiu dit thm i tng k trong j. D nhin
l k cha b tiu dit trong j.
h(j, k) = s ln bn i tng k vi v kh tt nht trong j.
Trong bi ny ta thy rng khng phi quy hoch ng lc no cng quy hoch trn s
nguyn m cn c th quy hoch trn tp hp. ch s j trong F[i][j] v mt bn cht chnh l
mt tp hp. Ta xt tip mt bi tng t nh th.
1021 - Painful Bases: Cho mt c s base (2 <= base <= 16), mt s nguyn K (1<= K
<=20, K c cho trong h thp phn) v mt chui k t s biu din 1 s nguyn trong h
base-phn (nh phn nu base =2, thp phn nu base = 10, thp lc phn nu base =16, ).
Cc k t trong chui s u khc nhau. Tm s hon v cc phn t trong s sao cho to thnh
mt s trong h base-phn chia ht cho K.
V d:
base = 2, K = 2, s = 10 =>kt qu 1
base = 10, K = 2, s = 5681 =>kt qu 12
Tng t nh bi Agent 47, ta chia bi ton thnh n bc, mi bc la chn 1 s trong s
ghp vo kt qu ca cc bc trc to thnh mt s nguyn. Bc 1 c n cch chn.
Vi mi cch chn bc 2 c n-1 cch chn cho bc 2, Vi mi cch chn ca bc 1,
2, 3, , (i-1), bc i c (n-i+1) cch chn. Do s cch chn cho bc n s l n! Ta phi
tm cch biu din tt hn.
Gi s ta ang xt bc i, gi j l tp hp cc s c chn cc bc t 1 n (i-1).
Cn phi ch l: mi mt hon v trong j li cho ta mt s nguyn khc nhau, v th j c th
t. iu ny s lm s la chn bc i rt ln. Ta lm mt tnh th t ca j nh sau: v ta
quan tm n s d ca cc s c to ra t hon v chia cho K, nn ta phn cc hon v ca
j vo cc nhm t 0 n K-1 tng ng vi s d khi chia K. Nh th s cc hon v ca j l
ln nhng ta ch gom li cn c K trng hp khc nhau. K <= 20 nn c th chp nhn
c. Vi nhn xt ny, nu gi F[j][r] l s cc hon v cc s trong j chia cho K d r th:
12/61
S hc ng d
3.2 S
nguyn
t
S p > 1 c gi l s nguyn t nu n ch c ng 2 c s dng l 1 v chnh n, v d:
2, 3, 5, 7, 11,
Ch :
-
-
int main() {
long long n, x;
erathosthenes();
15/61
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x;
long long q = sqrt(x);
if (q*q == x && prime[q])
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
= pk + S((k-2)/2)* (1 + p(k)/2)
= pk + S((k-2)/2)* (1 + p(k+1)/2)
Nu k l s l
S1(k) = S1(k-1) + pk
Gi s ta ang c S1(i) th S1(2i) = S1(i)*(1 + pi) v
17/61
18/61
19/61
return result;
int main()
{
long nCase, n, K, m;
cin >> nCase;
string s;
erathosthens();
for (long long no = 1; no <= nCase; no++) {
cin >> n >> m;
cout << "Case " << no << ": "
<< process(n, m) << endl;
}
return 0;
}
1067 Combinations (Light Oj) tnh t hp C(n, k) % MOD vi MOD = 1000003 v 0 <=
k <= n <= 1000000.
21/61
!
! !
22/61
long nCase, n, k;
cin >> nCase;
fact();
for (long long no = 1; no <= nCase; no++) {
cin >> n >> k;
long long A = F[n-k]*F[k] % MOD;
long long r = F[n]*mod_power(A, MOD - 2) %MOD;
cout << "Case " << no << ": " << r << endl;
}
return 0;
23/61
Xt
bi
ton
1183
Computing
Fast
Average
trn
Light
Oj
(http://lightoj.com/volume_showproblem.php?problem=1183). Cho 1 mng s nguyn n
phn t 1 n 105. Ch s mng bt u t 0. u tin cc phn t u c gi tr 0. Bn phi
thc hin q (1 q 50000) thao tc thuc 1 trong 2 php ton sau y:
1. 1 i j v gn gi tr cc phn t t i n j bng v (0 v 10000).
2. 2 i j tnh gi tr trung bnh ca cc phn t t i n j.
Nu lm nh thng thng, c ngha l s dng vng lp t i n j gn hoc cng gi tr,
th ta s b time limit exceeded. Nhng bi ton dng ny s c gii quyt hiu qu nu s
dng mt cu trc d liu ph hp: Intertal Tree.
tng chnh ca interval tree l chia mng d liu thnh nhng on (interval), v t chc
cc on thnh mt cy phn cp. Mi nt qun l mt on t ch s left n right. Nt gc
qun l ton b mng, t ch s t 0 n n-1.
Mi khi thc hin thao tc trn mt on [i, j], v nt node ang qun l on ny, ta ch cn
thc hin lu tr hoc truy vn trn nt node m khng cn phi i n tng phn t t i n
j.
24/61
25/61
Khi to:
void init_tree(int node, int left, int right) {
nodes[node].value = -1; nodes[node].sum = 0;
if (left == right) {
return;
}
int mid = (left + right)/2;
init_tree(2*node, left, mid);
init_tree(2*node+1, mid+1, right);
}
Cp nht 1 on [u,v] vi gi tr val:
void update(int node, int left, int right,
int u, int v, int val) {
if (u > right || v < left)
return; //[u,v] nm ngoi on qun l ca node
if (u <= left && v >= right) {
nodes[node].value = val;
nodes[node].sum = (right-left+1)*val;
return;
}
/*y l trng hp cp nht mt on con ca on ang qun
l. Trc ht phi lan truyn gi tr cha cp nht ca n
(node) xung cc con ca n*/
int mid = (left+right)/2;
if (nodes[node].value != -1) {
int value = nodes[node].value;
nodes[2*node].value = value;
nodes[2*node].sum = (mid-left+1)*value;
nodes[2*node+1].value = value;
nodes[2*node+1].sum = (right-mid)*value;
nodes[node].value = -1; // lan truyn xong
}
update(2*node, left, mid, u, v, val);
update(2*node+1, mid+1, right, u, v, val);
//tng hp tng t 2 con
nodes[node].sum = nodes[2*node].sum +
nodes[2*node+1].sum;
26/61
27/61
}
return query(2*node, left, mid, u, v) +
query (2*node+1, mid+1, right, u, v);
printf("%d\n", r);
}
}
return 0;
Ch :
-
S dng scanf, printf thay cho cin/cout tng tc c/ghi d liu. Nu khng
time limit exceeded !
4.5 Cc
bi
tng
t
-
-
-
-
Cho mt s hnh ch nht c cnh song song vi cc trc to , ta cn tm tng din tch b
cc hnh ch nht che ph. Trong v d hnh bn di, tng din tch b che ph l 31 .
Mi hnh ch nht c m t bng 4 s nguyn x1, y1, x2, y2 trong (x1, y1) l gc di
tri cn (x2, y2) l gc trn phi. Trong hnh trn hnh ch nht vng c gc di tri l (0,
2), gc trn phi l (3, 6).
u vo: n hnh ch nht (1 n 30000), mi hnh l 4 s nguyn x1, y1, x2, y2 (0 x1, y1,
x2, y2 109, x1 < x2, y1 < y2).
30/61
Nu gi ymin l to ca cnh thp nht v ymax l to cnh ngang cao nht trong tt c
cc hnh ch nht. Ta s qun l tng chiu cao ca cc vng b bao ph trong tng phn b
chia cch bng cc cnh ng. V d, trong hnh trn, phn u tin c tng chiu cao b bao
ph = 4 (chiu cao ca hnh ch nht vng), phn th hai c tng chiu cao = 5, phn th 3
c tng chiu cao = 6, Ta thy rng tng chiu cao trong tng phn vng s thay i. S
thay i ny l do khi chuyn vng, ta bt u 1 hnh ch nht mi, hoc kt thc mt hnh
ch nht c. Nu ta gp mt cnh l cnh bt u (cnh tri) ca hnh ch nht, ton b chiu
cao t y1 n y2 s b hnh ch nht ang xt bao ph. Ngc li, nu ta gp mt cnh phi
ca hnh ch nht, tng chiu cao b bao ph c th b gim cng c th khng (do mt c
th b nhiu hnh ch nht bao ph).
n y, bn on ra cch dng interval tree qun l vic bao ph ny cha?
Ta s dng mt interval tree qun l mt on t ymin n ymax (thc t ta nn qun l cc
t ymin n ymax-1, thay qun l v cc to ). u tin tt c cc u khng b bao ph
nn c gi tr bng 0.
Sau khi sp xp cc cnh ng theo th t tng dn, ta ln lt duyt qua cc cnh, mi khi
gp mt cnh bt u ta tng gi tr ca cc t y1 n y2 ln 1. Mi khi gp 1 cnh kt thc,
ta ta gim gi tr ca cc t y1 n y2 i 1. Sau mi thao tc tng hay gim ta phi cp nht
s b ph (c gi tr > 0) ca cc nt trong interval tree. m s b ph ta truy vn
trong on t ymin n ymax c bao nhiu b ph. on ny do nt gc qun l, nn ta ch
cn ly thng tin tng hp ca nt gc l .
Tm li bi ton ny s c m hnh ho v cc thao tc trn interval tree nh sau:
-
mi nt, thng tin ring l gi tr tng hay gim (+1/-1), thng tin tng hp l s cc c
gi tr > 0.
Khai bo
//10^9
#define MAX 10000000001
struct NodeType {
int value;
int sum;
};
NodeType nodes[MAX*4];
Khi to:
value = 0; sum = 0
Tng 1 on:
void increase(int node, int left, int right,
int u, int v) {
if (u > right || v < left)
return; //[u,v] nm ngoi on qun l ca node
if (u <= left && v >= right) {
nodes[node].value++;
nodes[node].sum = left - right + 1;
return;
}
increase(2*node, left, mid, u, v);
increase(2*node+1, mid+1, right, u, v);
//tng hp tng t 2 con
nodes[node].sum = nodes[2*node].sum +
nodes[2*node+1].sum;
}
32/61
Gim 1 on:
void decrease(int node, int left, int right,
int u, int v) {
if (u > right || v < left)
return; //[u,v] nm ngoi on qun l ca node
if (u <= left && v >= right) {
nodes[node].value--; //1 on ch c th >= 0
if (nodes[node].value == 0)
if (left != right)
nodes[node].sum = nodes[2*node].sum +
nodes[2*node+1].sum;
else
nodes[node].sum = 0;
return;
}
//khng cn lan truyn
decrease(2*node, left, mid, u, v);
decrease(2*node+1, mid+1, right, u, v);
//tng hp tng t 2 con
nodes[node].sum = nodes[2*node].sum +
nodes[2*node+1].sum;
}
Tuy nhin do (0 x1, y1, x2, y2 109) nn nu qun l trc tip tng t ymin n ymax, s tn
kh nhiu b nh v thi gian. Ta c th gim s trong on t 109 xung cn 30,000*2 =
60,000 khong thi (s hnh ch nht n 30,000 nn c 2*n cnh ngang => s khong = 2*n
- 1). Mi khong c gii hn bng 2 gi tr ymin v ymax. Trong v d bn di, ta c 3
hnh ch nht nn c 6 cnh ngang v to thnh 5 khong. Mi khong by gi ng vai tr
nh 1 phn t trong mng d liu trong bi ton Fast Average.
Phng php ny gi l ri rc ho d liu. qun l cc khong ta ch cn mt mng lu
cc cao tng dn, horizontals. Trong v d trn, nu tnh d di ln ta lu: 1, 2, 3, 4, 6 v
7 tng ng vi 5 khong. Interval tree qun l on t ymin n ymax nh sau:
5
4
3
2
1
33/61
Khai bo:
//2*30000
#define MAX 60001
struct NodeType {
int value;
long long sum;
long long ymin, ymax;
};
NodeType nodes[MAX*4];
long long height[MAX];
struct Rectangle {
long long x1, y1, x2, y2;
};
//Danh sch cc hnh ch nht
Rectangle rects[30000];
struct Vert {
long long x;
bool begin;
int id;
};
//Cc cnh ng
Vert verticals[MAX];
long long horizontals[MAX];
Khi to:
Vi mi nt ta lu li khong ymin v ymax m n qun l. Ch khong [ymin, ymax]
tng ng vi mt on d liu no trong mng d liu. Trong bi gii ny, horizontal c
ch s tnh t 0, ch s nt trn interval tree tnh t 1 nn khong i c ymin = horizontal[left1] v ymax = horizontal[left].
void init_tree(int node, int left, int right) {
nodes[node].value = 0; nodes[node].sum = 0;
if (left == right) {
nodes[node].ymin = horizontals[left-1];
nodes[node].ymax = horizontals[left];
return;
}
int mid = (left + right)/2;
init_tree(2*node, left, mid);
init_tree(2*node+1, mid+1, right);
nodes[node].ymin = nodes[2*node].ymin;
nodes[node].ymax = nodes[2*node+1].ymax;
34/61
Tng 1 on:
Trong cc hm tng/gim, ta s dng ymin, ymax xc nh khong qun l nt thay v
on trong mng d liu. Khi tng mt on bao ph hon ton khong ca mt nt, chc
chn khong ny b ph t nht 1 hnh ch nht nn ta khng cn i xung cc nt con ca
n. Cc con ca n s c cp nht da vo c ch lazy update ngha l ch cp nht khi
ta cp nht/truy vn con/chu ca n.
void increase(int node, int left, int right, int u, int v) {
if (u >= nodes[node].ymax || v <= nodes[node].ymin)
return; //[u,v] nm ngoi on qun l ca node
if (u <= nodes[node].ymin && v >= nodes[node].ymax) {
nodes[node].value++;
nodes[node].sum = nodes[node].ymax - nodes[node].ymin;
return;
}
int mid = (left + right)/2;
increase(2*node, left, mid, u, v);
increase(2*node+1, mid+1, right, u, v);
Gim 1 on:
Khi gi tr ca mt on b gim v 0, s b ph ca khong ny ph thuc vo 2 khong
ca 2 con ca n. Nu n l nt l, s b ph chc chn s l 0.
void decrease(int node, int left, int right, int u, int v) {
if (u >= nodes[node].ymax || v <= nodes[node].ymin)
return; //[u,v] nm ngoi on qun l ca node
if (u <= nodes[node].ymin && v >= nodes[node].ymax) {
nodes[node].value--; //value ca 1 on ch c th >= 0
if (nodes[node].value == 0) {
if (left != right)
nodes[node].sum = nodes[2*node].sum +
nodes[2*node+1].sum;
else
nodes[node].sum = 0;
}
return;
}
int mid = (left +right)/2;
decrease(2*node, left, mid, u, v);
decrease(2*node+1, mid+1, right, u, v);
//tng hp tng t 2 con
if (nodes[node].value == 0)
nodes[node].sum = nodes[2*node].sum +
nodes[2*node+1].sum;
}
35/61
verticals[2*i+1].x = rects[i].x2;
verticals[2*i+1].begin = false;
verticals[2*i+1].id = i;
ys[2*i] = rects[i].y1;
ys[2*i+1] = rects[i].y2;
}
sort(verticals, verticals + 2*n, my_compare);
sort(ys, ys + 2*n);
//unique
int k = 0; int y = -1;
for (int i = 0; i < 2*n; i++) {
if (y != ys[i]) {
horizontals[k] = ys[i];
y = ys[i];
k++;
}
}
return k-1;
}
void init_tree(int node, int left, int right) {
nodes[node].value = 0; nodes[node].sum = 0;
if (left == right) {
nodes[node].ymin = horizontals[left-1];
nodes[node].ymax = horizontals[left];
return;
}
int mid = (left + right)/2;
init_tree(2*node, left, mid);
init_tree(2*node+1, mid+1, right);
nodes[node].ymin = nodes[2*node].ymin;
nodes[node].ymax = nodes[2*node+1].ymax;
nodes[2*node+1].sum;
}
void decrease(int node, int left, int right, int u, int v) {
if (u >= nodes[node].ymax || v <= nodes[node].ymin)
return; //[u,v] nm ngoi on qun l ca node
if (u <= nodes[node].ymin && v >= nodes[node].ymax) {
nodes[node].value--; //value ca 1 on ch c th >= 0
if (nodes[node].value == 0) {
if (left != right)
nodes[node].sum = nodes[2*node].sum +
nodes[2*node+1].sum;
else
nodes[node].sum = 0;
}
return;
}
int mid = (left +right)/2;
decrease(2*node, left, mid, u, v);
decrease(2*node+1, mid+1, right, u, v);
//tng hp tng t 2 con
if (nodes[node].value == 0)
nodes[node].sum = nodes[2*node].sum +
nodes[2*node+1].sum;
}
int main() {
int nCase, n;
scanf("%d", &nCase);
for (int no = 1; no <= nCase; no++) {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%lld %lld %lld %lld",
&rects[i].x1, &rects[i].y1,
&rects[i].x2, &rects[i].y2);
int k = create_interval(n);
//cout << "k = " << k << endl;
init_tree(1, 1, k);
long long result = 0ll;
for (int i = 0; i < 2*n - 1; i++) {
int id = verticals[i].id;
if (verticals[i].begin) {
increase(1, 1, k, rects[id].y1, rects[id].y2);
} else {
decrease(1, 1, k, rects[id].y1, rects[id].y2);
}
result += nodes[1].sum*
(verticals[i+1].x - verticals[i].x);
}
39/61
Cch tnh s nh trong mt vng ch nht khc vi din tch ca hnh ch nht.
Ta phi m s nh c qung co t nht k ln. k c th ln hn 1.
40/61
41/61
Gim mt on:
void decrease(int node, int left, int right,
int u, int v, int parent) {
if (u >= nodes[node].ymax || v <= nodes[node].ymin)
return; //[u,v] nm ngoi on qun l ca node
if (u <= nodes[node].ymin && v >= nodes[node].ymax) {
nodes[node].value--;
//m s nh v kt thc
count(node, left, right, parent);
return;
}
int mid = (left + right)/2;
decrease(2*node, left, mid, u, v,
parent + nodes[node].value);
decrease(2*node+1, mid+1, right, u, v,
parent + nodes[node].value);
mi cch gom nhm khc nhau, ta c tng gi tr ca hng cy cng khc nhau. Nhim v
ca bn l tm gi thp nht.
V d: hng 5 cy nh bn di c gi thp nht l 26.
5
3
2
1
2
3
11
13
12
9
13
nodes[2*node+!].h = h;
nodes[2*node+1].min_fh =
nodes[2*node+1].min_f + h;
nodes[node].h= 0; // lan truyn xong
}
Tng hp
44/61
45/61
46/61
47/61
Hm main()
int main() {
int nCase, n;
scanf("%d", &nCase);
for (int no = 1; no <= nCase; no++) {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d %d", &type[i], &height[i]);
init_tree(1, 1, n);
compute_left(n);
compute_before(n);
F[0] = 0;
for (int i = 1; i <= n; i++) {
insert(1, 1, n, i);
update(1, 1, n, Before[i], i, height[i]);
F[i] = query(1, 1, n, Left[i], i);
}
printf("Case %d: %lld\n", no, F[n]);
}
return 0;
}
No ta cng submit.
C rt nhiu bi ton thay v gii bng cch lp v tm kim, ta c th gii c n bng cch
p dng cc kt qu ca ton.
Bi ny c xp trong nhm tm kim tam phn (Ternary Search), tuy nhin ta c th gii
bi ny bng cch tm cc tr ca mt hm 1 bin. tm cc tr ta ly o hm v gii
phng trnh o hm = 0. So snh gi tr ca hm ti 2 im cc bin v gi tr ti im c
o hm = 0.
Gi xA, yA, xB, yB, xC, yC, xD, yD l to ca cc im A, B, C v D. Ta c phng
trnh chuyn ng ca ngi th nht theo thi gian t nh sau:
= ( ) +
= ( ) +
Tng t phng trnh chuyn ng ca ngi th 2 l:
48/61
= ( ) +
= ( ) +
Bnh phng khong cch gia hai ngi theo t:
() = ) + ( ) !
+ ) + ( ) !
tm khong cch nh nht ta o hm d(t) theo t v gii phng trnh d(t) = 0 ta tm c
t*. Sau so snh 3 khong cch (A, C), (B, D) v d(t*) tm khong cch ln nht.
Code chng trnh mu:
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
double xA, xB, xC, xD, yA, yB, yC, yD;
double pow2(double x) {
return x*x;
}
double process() {
double deltaX = xB - xA - xD + xC;
double deltaY = yB - yA - yD + yC;
double dx = xA - xC;
double dy = yA - yC;
double dist1 = sqrt(pow2(xA - xC) + pow2(yA - yC));
double dist2 = sqrt(pow2(xB - xD) + pow2(yB - yD));
double dist0;
if (deltaX*deltaX + deltaY*deltaY == 0)
dist0 = -1;
else {
double t = -(deltaX * dx + deltaY * dy)/
(deltaX*deltaX + deltaY*deltaY);
if (t < 0 || t > 1)
dist0 = -1;
else
dist0 = sqrt(pow2(deltaX*t + dx) +
pow2(deltaY*t + dy));
}
if (dist0 < 0)
return std::min(dist1, dist2);
return std::min(dist1, std::min(dist2, dist0));
}
int main() {
int nCase, n;
cin >> nCase;
cout.precision(12);
for (int no = 1; no <= nCase; no++) {
cin >> xA >> yA >> xB >> yB >> xC >> yC >> xD >> yD;
cout << "Case " << no << ": " << process() << endl;
}
return 0;
}
49/61
5.2 Bi
tng
t
-
D
2
Nu gi gc ACB = , p dng tng ca 3 gc trong tam gic bng 180o, ta d dng suy ra
gc AOB = 2.
Na chu vi ca sn vn ng = AD + OA* 2 = AD + AC*.
Mt khc AC = BD/cos() = AD/cos(). Thay vo trn ta
AD + AD*/cos() = 400/2 = 200
Suy ra:
Chiu di = AD = 200(1 + /cos())
Chiu rng = chiu di/t l
tm , ta xt:
tan() = chiu rng/chiu di
=> = atan(chiu rng/chiu di).
n y th xem nh bi ton gii xong.
No cc bn cng submit nh!
Code mu:
50/61
//1056 - Olympics
#include <iostream>
#include <math.h>
using namespace std;
void solve(int l, int w) {
double alpha = atan2(w, l);
double length = 200.0/(1.0 + alpha/cos(alpha));
double width = length*w/l;
cout << length << ' ' << width << endl;
}
int main() {
int nCase, w, l;
char c;
cin >> nCase;
cout.precision(9);
for (int no = 1; no <= nCase; no++) {
cin >> l;
cin >> c; //b qua du :
cin >> w;
cout << "Case " << no << ": ";
solve(l, w);
}
return 0;
}
51/61
For example, in the above picture, if we want to go from 0 to 4, then we can choose
1)
2)
3)
53/61
check[s] = 1;
}
for (int i = 0; i < n; i++)
if (d[i] < Inf)
printf("%d\n", d[i]);
else
printf("Impossible\n");
}
int main() {
int nCase, n, m, t, u, v, c;
scanf("%d", &nCase);
for (int no = 1; no <= nCase; no++) {
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
M[i][j] = Inf;
for (int i = 0; i < m; i++) {
scanf("%d %d %d", &u, &v, &c);
if (M[u][v] > c)
M[u][v] = M[v][u] = c;
}
scanf("%d", &t);
printf("Case %d:\n", no);
Dijkstra(n, t);
}
return 0;
}
c[u,v]
s
d[u]
55/61
T gm cc nh ca G
T lin thng
T khng cha chu trnh
0 0
0 0
Khi gii thut kt thc, ta c tng chi ph ca cc con ng v s sn bay cn phi xy. In
kt qu ny ra.
No, cc bn th submit nh !
//1059 - Air Ports
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
#define MAX 100001
struct Edge {
int x, y, c;
};
Edge edges[MAX];
int p[10001];
58/61
}
return 0;
}
Nhn xt:
-
R rng, tm kim nh phn tt hn. Tuy nhin c hai gii php u phi tn b nh
lu tr l n nh lu n phn t. i vi mt s bi ton c n ln, c hai phng
php u khng th p dng c.
Gi nguyn tp L v sp xp tp R
tm xem k c trong n s nguyn ny khng, ta ln lt xt tng phn t L[i], nu k
>= L[i], th ta tm xem phn cn li k L[i] c trong tp R khng. Nu c th k c mt
trong n s nguyn. Nu sau khi duyt qua tt c cc phn t ca L m vn khng
tm thy th k khng c trong n s nguyn.
-
-
-
61/61