From 1f57e5ee954e160904fb2c369ae5a089c3a80dc3 Mon Sep 17 00:00:00 2001 From: yanglbme Date: 2023年3月29日 00:16:32 +0000 Subject: [PATCH 01/14] chore: auto compress images --- .../images/graph-2.png | Bin 22179 -> 13685 bytes .../images/graph-4.png | Bin 26891 -> 17553 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/solution/2600-2699/2603.Collect Coins in a Tree/images/graph-2.png b/solution/2600-2699/2603.Collect Coins in a Tree/images/graph-2.png index abb216183fd03fb6695106654d07ebad8a48f772..cf82ad990d7ba28420225d70e31b122d4e00e3e6 100644 GIT binary patch literal 13685 zcmd6OcTiN#w=Fp*6+{OC5fwoJ$&!;K$r*_vIfLYkL_tXglH?o&L}17u7)Ej!auiYW zfJg>`yXSlV-uLRe_3Bpr%2K8r`kX%9yVqW8?R}y()D$Sm5M($wIFw3?_qA|v@Zd8Z z83_^mk4(FbF8m;MReb1|fBoSGq^UrLar$R%Eruiq_IXyrkFZ>9Gsq8N{FBjkc4$w|s6t z?ia~Dzo?cY6Oo=5C$jp!lGm#1UWSP0lg0il^@Vc~))OO5o2_d#cIdCd8}$oum#BFC zfAwe0t&Ef0Srv?B zWhV6pbLBE3$mxd$utPrBjg;ypaUUd``ju6ドル_<0tye~mh)ioi#lp}q?ynpe;bpd_!2 zSPBsv9LAUJt%1ks2m$*mdmTYvFWcN>6!qfgW8B-E%UVIUp6nUf{Q23b_Ufi;+@*_+ zUYG|97hvM%Uf)0B7TJ%KrkeKji|-rT9Q>Z|Ydbq-*hRJ-E;1}VC1$#M2fG!WrEUvf zQ%ygMdMvw+HxWOq_1#|lG+TA)p6gXcX*h!6y?OBxX)9m+r|aF^=H^cJ;jX8Py>Atw zu%peZ;1(*}lhxL}55|Lz_cxi{vXYITMEg?UVOM~lRHx+pR;ajD*X!_2(P}sHnI`Wd z3y89iY<7zkjt*-fx-f3u4br2tmspgrhgd^(o^6!bIPKF5MeVm1vZ4q5{vg247ud-0JvvFG3L8}XS zo)0=&DJn*8AFWj?7%SkxJ}b#s`3N{+)~oybTxI%`xwG6StdfP{nLK0Yxt&kNPv!>u zSC(oS32qO`9hR0={Hfub57ドル;#Z7!)FZ}fD~CNgZF-)uXJvlsQ>--x|r8g%%JUgSkK z&ee6l-Br(Td_T1c9;C8+C?|7y?yXN;*s}2m9XlJFyKT}~b6h>C)}JYEH;hAx;J@{W zu)(CsD|6%KvfG!3HW|NmHfE-D+|ornORF8mxYSX)`HG1YsNIdG%^`D`w|TAO1h0G1 z$IP1A^WPyP#hjESlf7=VKmHPvdKLG~b7NYVt6O}{In+e)L42Bs=c*;qO+VcxFAN1r zzps$M!}YZtF{H5Okb!aD!d^x`KKlDc&}hE zkk&4;{W*8*vaf&e->s_50|nuU1Yu4hM328 zR?sWh@$VHy5vTC~`&LibBUDYMc1VH zGXziEIL%tqsaS8}kl<6wrhg5hfjgrj`{fgmlpBW3#B2`6(t3$fN` z<%ygnecji@|lobj6!zoazcx1b^bj>oIV2_DL`i2dWWs*ZW?OF3l(fqPN33JDyl(c1 zdS6z+AEm3P-z!B~ji~RQWH&!>d2dW#=IVJ)&mCva!0|GF_Y(iX?yqDsK|1D^X(gJG zDaBwhvUmV-lBaK-8#~ienEjS>q~c}YFnC@;3`c%$JY0OsXPn}x&wh*EEWmA=*dR1J zgy!Jyc7KK)x-iwI7ドルu@bnI_<{$np{cd}lg&g(mcc1p<$v2fu=ro;!wjvm696;ou07 zqiUH7|GdpmzS246o55RO=v$eeZ^+*lNvdo+O^dsB>*{4E0QsKs_?jbQYwq6i(bspJ z*`xX`;>E3x6y3)^eeByB!#G|~dca+DX410VCmJXjS2H4sdEWGZfbcp?tRr${Y+acR zK^cVRT(HUX{TiU0D(3qk)v#!Cv#|w|N4soLp-cqXJ3i)XW5({WE6GB$KCHB;yq7H^ znSfMjeM;{Y(bsp=#Ql*jC>lG*P}AoZIkEVqc+t=gsrpuMgZq6F-NrypSoM=%U3Xk$ z^WN?L6~&Z>?yik_Bb{d+;1k=Pot`)cFK4w31RUnbMm0`pwwy8t{~g@sIXOMv+&~5$ zV}wN5p9Y=m>Q~?K$QKO>n%>jD7fX9SH=~p^6c4Y)bzWwvdArX&_-Sp-qj%k{5{Exu z_1P6=EJnsbR*84Wq%qlG;7O@V}ZrCJv2CeZd7fpip`>NQ%C{Za!3*z zdjR+9VZ>4_s+daLV$-%nua%)MD}#AaE860IL*s9ZTv|q^qyKbqQPFlE;eTsnaIRruoOPNZNvYr%2{gUxui-3py^`=Fl#qNgM?)WfeR8VSDbcbnC!wKDAmAU-Y^$%Ee)4?tcogH}KNKSAL9F033)w%VuD~i% z;6MY75a2ege%w5(yF6Z%CtLxnVNgi|O_s2f?%sFKA#YhzZsBXJY6^p7P&1#!SBj-K z`ldYEc>`2NGX$K9I8d4&zuwb^N7`b&Ko5bJm^qs!w8Q8?16lEJOQM4UnlYy2u# zCXzUfRQ65ドルcrrJyH6L#@SxYo`Njmta?P?UMWu!2P8@sj>F4n^`u!^utsl(2*l*xWw z)BRwnWHb8iA^%-z+)m5Y;gUsq19KKzgz#dBMvbkeb~_#Rln3GubN~50{|R3*N!Wcc z#e!WcpM-HC?51j(4-<8^0(og=pjgvm#`0y)jkpe-pyrd?9}0ek8pz#&cywm7eqt$n zWtr#o=;pwt032&A$&;N|$I9g{)aH-Mq+0<}jtyy>oTzGRM*~RkbqR*IY~`fGqfChW zfQBq4zOt4mHjN}=sk0sIxT9N9YofDZQfBR%gJUSj;$MYhPC$AZIldx`4?p5!)Ql@ zWTU7Gc;F#*8%G%8FH>((k!^`^S!PU5&YBMqc2FbOD^E=PRtl_%s5)3NFN*Kq5u${E z3^y?q9K9gj92Q!Bp)L3+dWHa^#B-g`YVM-e0YlGOKsZ5#=`fm8VODnAe6p zj8?dCQzaWaNvpkvn!@XmH*OUVoWHF^q}+XKZzbu!)&O~qhx*BIwj8InV_nIO*s%%| zWs9f*wyc21N4ISH(yd*wqs=*5$}V)Y?9Z+sDg}c>4IExa-eviPoZq z(KPL==%Rj>8@`*(+iErt{F+X(!Dkgs8zPpXdxJwjbQD>m5|ZNe&Wiu?!ZqELlkV`a z5r~KWwuhS*b}ZDpE%Ye=@~(54+wk@G%C8+oD*X0{T1HMei~f``1G2O|7fEsXv0l7! zi(jp;Wsc z({Hte-&N6Lb(nn-m3Z~m)whE_c%rT=DCS^_9fNhTQ+Dmb0Uj1!msv41H{u;aJuS%h z?-nY`p0HcTrU>=H?=}h9z58KAls%m}K$@R2hLyH`5i!M!&M62V5kmaD=mOt8VU`yA z^Np3?E2PGnye$mwlIyuP+Q7DUHHl%gC;Ecgz4rCsuP-ipC_ekUH|4TXpV%*XCdP7H ztW^-x)EZT2eeDv$pzHi54Acg_<6r_f`xn>UvE>Zb5`B(^&u_=p>}%}!hZ&Vr3i-*W zpCO~tDR6zHpRhCay*+HE|JmqUsmCP-7vueHbo`*tUvxL;tCNb25*7!1xxP-(MO6(Pvt$TNWk_=Tp%L#=ZUX zust`ujx3LoOLte)qyd;SjGP<3l$bojwil^mf4hd66nowketl2&3qr|6s=b{zsh;kq zn}&%j#4AEUJd&*IvQ7GYr1tf%Vbl_~ll6dI{6r*V&tf;OEr;hCo*L5U!s;s+(!VKLL>#5Y;o{x; zogw8^-c%gvcv)P?QHtP%^pIMOzc(kH2m+1PyXVrlauXqng-gD`oQUiW8SkR?*PUe* zjWKF5VOYu0`Q~=A9U8dKGa|UctX=y}qZcyXk?1{_5{g;0L&vUHmG`B$lRev z;P5ShWrLNZ6&Ixze>9v#$DxzW0}<`w6m($je~bx$ax;;ztp}kloqc_kh#wvp`ivdt zmEhI&6Xb<-)r&kx^078n0uv{l>&44Al#{Lpn0b9S9LU3H>%yT@J$B%5G~lt~^_mOZ z&+zw_|22#oiYMj|dAGMS-)HMb>$aCA_ly_^`7Jy)mjs;HHyOsVX2_7yt8ml=h*35hP!w2(PX@*dG)K0*l zc8a|y{l}Git|9-dTgmj3ggWoa=06Xr&(tzR1}~E$El^ZKv>RYMu*V(38SzxRH&0Ng zBHu}+HfnM?Bs-)&zyh5Ya`l}_(`buNRjJ8i$}9KovUguE%HW*&@UTDSi3Pc)X|$G~D%} zcMtj8Wmcx@T)v~U%Jewh@6^qBF)+TuDbueM#JmLpo*zifaaO*cUDEu`7&xS=C_rZH zS8#=A?M!Q1GMYfKe~edn!-9E<;%@$p4ドルf~~b+mfmlg7_&{54{!=~jo12eg)+^^9f@ zzE`jy&Shh4iI@54fRCM6OxL22@7pde{_Lu4PnTx6sgs^n);Gq^Rhd};o zFlDs_mL?afcQj>)dRuq%zMOWN#LOBDl@(rV1oHIl(3uqsehFC(xJiM0Ha zuk=bL_#M(!CE*S0s|f%zi%Bjp9wzq0?VDpEE`S@n#;l>3{9lM%2Q>6@7=6dX_Nuy1 zE&}v;Cf<+x**tytbfnhq~~4fm;lv|ubdkk zMTT(dG%!vj&uQIK9rLFQ)PH_;C-dUVfHq#ONJ_C^_hSd0LdEPyL;HQkEcoPCdcdE~ z#qbYcK<10=fog83oj)pz$hw|;hoidwapjx4tjp{vkxjnt&ul4mq{m?fr@l8q$km+i z47R-aPf>3d^ds7_rT~?A=v$Z8iJGws>SBq!n};PunUKcAJy%_>jW@FT)quYG{;=S| zo0mbWuL}=W#Q7b^6R5;rFb5s9w>%1hY{kAiTM4YnyUUW}HEtH4O`LDrm*@0L|2*2% zd-E`(KYO5UlqUCco@bi;zS*R6StT6QSE^tmq+RVlCl2qOOI1<Mi{hc36~OqZy^X&XWd(H+GZPT{*tA91 zBoA(S5w>@|xs7gE8E;bX{qs|4#mjaISN8#7h3K0uExUSMb#jwN+xo_Ca!5ZHM5Tq~nV}mN*Fm?#kSA>*KqRKmvYN zp;ygN>3Yrn3NyC`B%;?}e1FIb! zhv%yXe>L@0=Rl6E_K%ZM!0cwTnILsJm;(RiSwXVtk55_AXMdL@H%yW(4Xnla=uJG% zh51NB?m{|EEoRba|6Ri?QAP%6x|37jgJD{Q^?MhjMPHt&PUR@md;`n!X?fsT=|>3oT4+U3_OV7KVF zPaFC%!k`PH$*s17x$K9h0!L=7Q`%N(*_>kF0-uxktNA|S8^6^Pa8H%odbEqwdcAb@ z;K^_hLeA-b+*jb>dcp?4Ek5k}*On23qR$IB$a^j1GMk^qJ5j93>fQ|Uo;HIRo@t`N zy~zKmPV|`0Xn`_4nhJEHFETJ5g3|rT&u`|lOR%Z z59ff_^}AG8W1(iFhaH+}e=ax}84wJ)Bh)t-G5})+Mst$=m7x^pJBS#oxUEPA=WH|p zpSRcQSWhaS-HS7@-X82t+oHhrf#mLo(xlj-Wv{GvcMFeDOi<$ z&HdUSiO*m4xz<3{rez}^ft+d9xi1fdz+cwimqhdu+{!#a$ljd#^96n&6d9mnbjhq; zB6Vg2>noSpa-+IF!A+%;cl*Poy0=B{Q4Oi3uEUcR$Eo7$t~k)p(p)H4a8Z9!s_{%V z5XwW=i1bODj&Rb6AL4Xe#`mlotggq{yNtu*pFsKBZ#Gsn|I2%1b(f)|T zpc>9feh@eEMJ1U7ODoVWJVLVYA3mU}-Z<&c5j=^-yDnfqoXwM)J+*ImpM4^8 z+hq#bdu5vkb!B0FrYSj23k$d>NduM0f(+UNQTx6ドルNj(6?pAd#)d8sfId#f*+74 z{rG**iQoRY&tRj-_@{fl8D_v`z`>zo!1e-siemD6rbaFmMa4MXA8nm^eJEQxtS87B z&>F!6$A&NHuaEn+5`(I1vFC_oBPn<=b}p3e#(~rmoaarkz2oi3!^-;*t5i+n9q9_= zhVzZgMp771UPXgIHiUG`^aR*m4(2JKFS%(|nu?AkZvB(@itaRAt=)&xbCtd7?P68Nym72(?IA!!M z&7CG|#oR6q2Sg#VoJSE$^Ok?+Ux?0p$lAKjnt|1lFxc%@+zMC#Pq{A&2dSI(e^5+UnYHR%aNS&xe{qb##8W5pfa@Kb^O|a>e-EjT_fP+B ztJ{FbV;!N-`8yvsCQaB4a=j?l7AuL}!WM`{y*E4{Z9GCg1m_TO3A=v2e=OavHT;OV zZTo^i^UEi4uKJHP)oMSau~jwUiz6orKJOk@f6d^%Y$u@A`=S_%Rt;;9Hc1#)JQq`K z(j=h@_5dGJmdiS4KTs6(B~pGUiS7Svfk2bumVZZqFhwRsoBBE4h?hLA_pfVjrCr}G z*0`Ny|EScO&sNDNHexV^fKLCz?a;~Oi~duMp0{HuLh(LqKrjlh(ToJ2VI_D1LDT-M z{{@jo@!K9{hA3B%ID;%Kx*&hi3Wn*JAJ4hHxOX^y7DP1VraFr{jNaL{z2@|2d8&^4 zpNkdR^k*)99t5;Pd}8yGXp)hoSueL$O_lXw#G(d4c!T@W*P0gK$tiR0O}$V_5H$-r zyg>=38C8E=u>z#)2tbg;3(36{BG%G2DzaAwXJRmr}d|AxL)wr(mqh_%N zi+4seY|mSHVrkq&JDnP}iy+kUc>=8U9fxrgpsMIR{yt}-QofrteZ4~!A^QP1RQS5Z z{>F?mV=P)twD)0?7bhh!Ox`wIF>J+79*1973sYJ0DrmgcA^Dhd7b^65_%e!U-4V&7 zubT?JvDUq5sV8)I33x7;B5C!fVU4`zIy9>8yP*9qZ$Py`aB*yYZoC0+>-kb>zo;%<3$+m+k=f6 zkmj+!7A&?6JRg#s@Pn4hLq@|u>i5nv>LPk@XgK=Onh;o9(L~g#`euP6jLpSEJ<@ia zxrA#i01;;&zUc29;LhK5n&jVSFuAtM0G_|F^^{5k`Q{8kEDPxn)~oCP4vVdfg3EW! znPNIa9^alHsxT3)t5*}7uzL@VO-`chSJQNLs1|A5*$hIf3h`VZBZ$x`x)7p9kcNnM z)y&DjR(VgMkfTr-yoo*NK`lpGwa072B?~(53jRKZho*)!qY0>6 zD9e!TU-k0Rs5;`Iuj{qcj*IJiTK>x9ckicZ~czZ=~ ziyiqoKz^DQX2sC5KUSOOZrORs@O!-sN~LOmjp^9BUMdvmury!^DxSQ*e1XCH7P&9= z_37%Hcz)|Qe$sivTAC#swS{7KIg+P8H24ec4Qdd2y-3=Nk4Ym0oA0v1;?P>shY!kV zkO+y(zpp*OM3`3V5K$s%N5;?VT3iuyOwlgYVfPk=>REYeUHl`v#GAV)IeHUXwAbm$ zzL^am(IRlCZ34;nMr3gh^)-IEwK3BisCd*<)bwgjoirsqtq0e z3RghsW(fF3{&}NTZ|EiAmw!2}r1(?lw8{e2cnt7KPRWdO!c}_mR?um6Wl7*z?n_#q z#Id7IPYO>TTyc|@(~y5L`>x&4b4ドルUKyJT>sXP{@_n*D9|-5$EcVm%f(pggyFUX>Mt zIb{NP7x`#|Y?T9yR*BLj*IH2f(%;67X5i5bftXbTRmF8?P@ z;z_eiK(ofw1k&m4W$|)J5Dc&8H;X5yl-M#XgSI3OzT+b}^F5jj0`r%8gVtu6>O=#z z>Z<4clde_toi5coqlzhooktw2i^y(|b%y=q7fda-&vk@7&}0t8afpx1th)kis4ue{ zwLb%_eLMN?wKjbqW%3lDLH)XR5=(iBzNn#eD2Wdg_zZ_PuvK^C(9lA|(y#J&q}%m~ z1D7(qm#@;$zHFbYb?B|`00qm_J#sJv98WRO;r@Z`#ZaQWl6V~np<5ij)%2-g4oxaoPh93WajPFw{m*i2Z(&1`3U;7Yq#l* zU8Qy6*>rqXU;~Q=@$+$uy`tyeQ(PNfQbgq|nEsA3F%?^;yABXy9haw(BjZ6vLS|lL z{)vc>X2q39ドル}D~GDm&yE4_ku8Ez*Hzq8mNeREWhU3ドルS~^~oq#W2&fn+!WM1iEhE+_2?t7v*$`mxw5r1s-0WR6@GXh#bP1&&b<=%rghs_~@b zH^n_|fV`{Pqz`94;Y9N9?@!ieM-*@x6Er<*ysh!=gtfw+l-k(ti5h=jcs=}#pisqy zpE&j+%$A+MFHNAE-3a-P53)%0K=P>Tfc+~#>!u~m&Bjlk?-8Ea3A_0-`TTAt4xFiz zP}nnm4>f)fe1eGg&>7?W`T4%^Qu@Lj)8=~>3ドルsVd3{AL(P7#8RiZ%x--FRgfDDg1u z_S>t3;e7>TC;jAj|Lyne#>+?3(_T|fne;D#%V!DSjP-unwsY(p%p66{ywNQ&R&Hcd zD8n0pfCoU_bA9yrIkL6)OCFB0_1q;sf7+Z5$=~sevbi@tS`@gELej{0@8LnEuqXSi z{~RG@OMeuntSdgxEzVKX77q@w@^Whp(TmaG!PYb(7qx}3Y#Ko<LWrtJ$gEtETDpqG24ドルrp*0jY!pvx>o>G9h+sKjlM`hzHacp+*Ly~9*QW11jCVgV z4wM7ドル4ドルhE#i`Jx3wQ2KET@c;CP=^f1Oql{r6^WQ(+eURJyzV)wF%bb9>DYF5rq~FzTlvI+0j4+Xmhh>Y&_vbnEY?>@Hr)p7k z7(IGFOOJY3u7jM;a7a+ZV_Awg;u|QO!#H9;*Whk5JoTZ!0o}S2OBg-Y8t9Ln zZ7jc1qreW2B0q1L~LtkTPUp(BGhwH?Zjw%Z2Jh{%fqYK20mY?KBxJd=Fbx<(#u}DDqqQY^njss!7WFgd)h8{{(k@Kt+5c>Ts6gBiZ z1JAoi7Mij{bIJXV$Uk%y%PSLl0^6N8_Wkvy4=Nlp+1a{R83gQUJuff%Fw!@#&9$}J z?L+N#Y%EmYQ0ze#LnWFY7mgWZX}`%aIKr1l1a%^H<#cl%umf1|jw7)^j$*`)d`#}x zAf98084b?1ip?Qxw_hQqvSAT1H~Mg3N7(4*C1~_!!Pc;B>TfwnXW1@mJ|*I@Zw@08 zD9z2&%hgGw6L*N)yOt+c3>P7!HePkg= zLlw9=qVgP>v@Q&Sj(0~GYU4u*$+e8hA?Q>#pnZyh{ulUY@-2)rx{79JQvD6PJ;H{D zFE~zkJlDq)`^cUVmFYn_1oM2h#UJG~1wB4qb^cI96U_=bVyC2nMY@^RmvWl>?gEnD z?`JmeM}R>-?@Jz{6XeH~f*9qs5mp0)amt=%!qG%`hk4^CeklJIK>=)IuV&b_rrHTw zVZY;xlgIJPX;~SBWk0D*jAQ%uL-K%G{K3$JIHZ}5rE)EA4afKSuXMJHSU>c~v>S?X z@!XpeU(TyLUm08m-oq-J7iwZwxO@DrpCd5w7-Ck2?&6jFgh9DEuJPA zLj?Y~H53!;2R(27$^WFvbNiAW%NioY*a#1+$s0hong(or3E9ドルX{mzQf$DhHza}XX* z#%Zp>9^fd=m8#fkm*SmMw=Y4RqI3D z*De6MhgmMyI8OX|Pw&~n@7)TzzxMIJ zJaZaaTX-4fKV>%mkNy6?eD9ドル)^MBs^`0pe2|99r>KhJRAAvzD1_loNKO73uWAHB`Kg`v@e_)+e zBt>A#e-ZzNfgy*H788Esp}(JrSgWhn9KzZBOxOzHw-mh$F7q4MxEDxBQioF8qY-at zTri&JARv(l3q2owPcEL$S0wyyTSY8>A=Qy|eQbKTl|Baaz4&_lR(f@uP8RswZgDK>n z-xY#>1pmJutM%2o3Z~LU32e^f)JMH9`M8mYe_#W%6}4Namk+ zJi%6?UpF^H{r5qvV5nZ3I@F|pX0%TCNvUUO0Po)inIO^Q#Lrkgd-2bE^eBS2%uajx zckV)Py%+2Ab&*>wJ0jChJqN>XMedWHYKhah;%|0ew34*z$gp{w@a z9sVz9{THSGOH2RP=Hc6vHm}3xXIWkcjYpdw?So?kuIVEM?=KCDi}F!w23TcN&9gk) z#jxe6OV9x5*gksdat)ylZRzC?=mJPny3X#gGyHBdnjU1MPsT_NWe(GZAwfB!A;}zD$aERZ#13t+E1^`; z^ks^?#nJvEIXqv_8KK|JL(XuUwKS|~K1a#+y|$#;)qET9sJ)jin^;}Pwoc}{e#{AA zroI&mCTKF>!eKNJwzBzF552Tx>`@T zxSE+V@Z*0%#KEZRwO_Y#(7ドルS;n|?9xJmjz%MmL!(+lQ@6|GDX=Tn}J1A#}KGzk5$j z*9ouH0@tE>?IQPaP#a^v?scF9CFi)2 zL$L9TwsJ&*D2Sn=sd`BIpt}E60K4F?AIIQEnGF? z0i0M1Q!NSs!$MwIN(|rQ2!m7ZK`?)&VD@CoOKM`j+hZR$&yJ^@olU6P{9pxls?dKy z_*Q5RY2N2z!LZFA)+gF;!F4LAZc6`qd?Sg^>BtH=DWqkGo?Drmd|(X>-y_o&n&|Ql zN&=J`laieb^6aoHg1WZl7l&>V_sFm1vP{jdZJLg|lFHqed@lCK>;w2vTW>d*7)a)R z5m9|ovWQH`j)(p#3E|cEy=wd)!*gid>#@l+Vyo#Z`5)~FZPA#TPgPQFzs`J%_o90# zlQS&+eM1+*-HCF`UQ0Lnr8C20$=X&$M=7nhU)JNg<`+~i`ejlm#^<3~S z`2YldIS2v&So#2#E85!?bU!5P@W>X7JQ8l6KNL-ZNs5ndbT3}dbYJ9#u5F`PpCz0cZLgP*m%?+YKTWqM{UKUrX*3!J z-l^Lmi*!ind`Ci>MqxBg7p5QnPbAsahQmRcb)C}dSc?%Pow`iOzNNn1GZ&0Nf8P|G zK#ZPS8vpj;{;s3K?{2s9q>o{1zi)_B`fUvVd8l~$JMB29p$uAwcWoDeCHW+7(-dYp z8HT|GD1#1B?2|~k)@QGa6)9!v&Y@cx@;y)H6BUxfpwJhgNMlRZjkuo`T5Ev;oWnN< z-MS7=(*5)E_(uGT7_xp-HUm7jS{EUo{=Ivy{e#^yGw) z&Q_n1c&^7eHW8R-u-xw3`$cG7*X|%WWDK2&DpJ|9{r*VA9tg|*x+hEOv>(KJ{?Uu| zaE5ZEh*#e%A{}~-RTa2RFONFVB`rmMg@Dw;ugK~9RSc{@mf>s?0#ByU=JMC`S?iG9 z^6%vv{aWq|u4@f^ZSQzz>%3X@1eU>Ui17@(kCoM>b7`<%v0fj;bisbzvv)d$;r^zi z06DqmpaCSIAdoUEN6J^X=*5D@Y!qu2MPCIbd28k(x1!|kEw~pE1@L9Bb7`*ol9-J;LsRjzt;xVax|w!A?E%-+0A7%F zp6;StfHObnxck?_MHi9%UYygQTeg@CB8iJqq}riga|Ma&pwTUNFl~RfItgrsq@&Tk z<(zh39y!*rq_4vws8iv=x;hghdh%##2akoxig^a9wllk!z^qicmuxc^tnxv2*eths zcoFpug1xTM5RtL%14p=T`t(kTQrcAb4FPaa3zK9K!SXG*~6ZL0}F-_K@ z{UuuxEo5LAA1PsrMvSFn=yOHO{AxlP9QX-!xgRWDB0@RKQ+X6{hb=dDa)Aj8dI}sf zCM**So)2t@4UVpXDePgYNAbUkQBIi2dllUF_{#-u4>zzcxAS7!aa83nd1)D=-V1o{ zk0}a1Ey#4!#__}7_}p6_()|uI&%~7j9f592Q=1)OS(c(;aRe;`Mn$@M$Jmb;*Y7ls zEb41RQ%?HCaFqs>phzPVV2XVK+CYc0^DU#~kI>+jz8}#wH4nbao!E+zi-UokH81(ypqHQ*@nrj{vxMoXe65 zRz4t$o&Q}l+{H(`Z$+#*UG6d1@SRrn#)n=Z_Ue*tS=|y~B`%Ch5$Lfxd}z);klm7J zxQt3yJ+UDO9wR)SdZy>1ycazSH=kf#MkDlt#2XtdRKm7<{fddp#&#;u|apaxkoq2b z7IyoG(}B*-XH}(KN^EC{;gKJ$h;Bo!WxjT@ub8Ij;a#8YYP=w9XU0rOq&&1OQ#e=K zY5!Kq79{e_&Pq#m^`#$J#_)x>=p?LKHO--KaC{E3ドルX;l<L>)2g*shCn{TX0eOHv__ z@U-sJy)fOBr~ly4=mQY$#teJ2aw1KCy`mg%)tQ?1kV|!!yoU6<)0u!hsv}w&;)lk< zMn|5i)Qri87@ju~)Qg76X$d6GYuR->$jha-cZYt0046;1LHi1DV7F>(ZUO2g-;vK6 zPae}6j@5Lfq2W$ZLAh^L^e{8HHywqeSL7_?^G{a=g=P%yD|HO{6`2{~#!yxbqJ)D4 zZxuXX9PU&*Jt~!qJirx+(z-e_zk>3114k;rw-GMftg_h~1*j_w^P#(li#yyDgb9wL zQumL_X}U~LKUj1&y4n!nU9~LlimWH9GlBT>ZeQ}HSw{?lU*#MB?;ua>@X%#YH-;}u zuEj}`TK=9cLX)U%FaLf(*pIe0J{hTOcG+@s5TQZv`TR>H3wi=&0m?vFqoZ8&oZWYJ zwwH68)NMNaBFg~15?RYC;3ez1&1|>z!TSO_6kdQSCe8nF`{&p`_07CkRpcPo&xX@c zS@@hu?K=ny*VEZ%Vnzpvkzq_q+<$ppu3pd2i8xsgztujajaywky8ss>X%x1-?2*RV zlRJf;_O@=%#kvKtS#sq~Xu=18>8nPOmtnk4dg(NHf-^Y*J{~4+Ew|1zmF#c~bEtR2 zN5{{|58dBd{GP@<;5n`y*7x?%cysihc9xlmm8mj#>pFunwkV;woglhi`otK3E*$Hk|(C7xL(weJjcR{Y7gxqBp76ZdrZq+OD4a z0(&(9x|;}+Fr=9kzq(U#8HBm%OCP-KhSSzBX>)c zv4M5tG0xUzm5t7Fl;Q=PYmLl__i3EJ=H+C43vQP8Nw1p%O;{CXDAG^Ldl;?~#}~r) z2nyI97_o%~+tP4tp5!YjLK%0s8oF_vq%Q50VZM~QxFKq{&w6@hLX{QYtBRZ_ED@B| zK+mymeev<7y{*_i`+_jBTg7T`aiQ`;>7B zv7&pMT^HL;pCi-q1e88Gg%X~+reRR(>Xp6UjSe3yWdI=oo}(^JlVh@$Sy<6b>z~X+ zu`QD_XQ1u#xF5=7db;gb&RUfO3Em&a1l??ArBn0Hzf|37NgEyI>Re%0H0^*#nORUi-u}lF0L(a*<_lhfylzf`v`p7-fqc+nyz%mpx0wd$qgou6hpu!$rg;rh^ zy!a=RR0cv2ドルgLiYoo*xBmdg^?%-g?s$l6NKo7gv+Sy>OJBz8)yGcJdwG8DRLxjmZf zBPQL~wx)}UaQ?IW<3mrpa}pmjy~s^udnhju8s6cfc8ob0m$tf&&z1uy#p74gc9i#1 zRBGddE#S(S&GOtNa4$B3^QgnNY@5LDb(~fH%z!$yu@k}N&33BR^qc!zff=IobWhZ> znh2VM-jOnhdNxJ`vTd+WLu$=LM|z&M{&-B(X~LVBXeUAMeS6$(I4Vu|6kCDIutP!B zv{I@Oz5HFn$;x!LF5YEWZQqe31r_}i8MUtwDd3ySN;1-(PDZgxva%7Nh*5S&x@Kjb zZkfLwDVFy3zOgXrIZi6PePYvZ6~kZk{kh-cD;8q>Zr2{^Rka zj(sy%i#i!xs2`SrGO6zn|3&FgXNI&aI3?Qe8}C0HJ?@2&`mV)R*vnlxLZDKMh*zR{;i(BC!O^s}SJ_Tv7%WE}PJzuHK5e2dMc|k_? z>1mbtREi3(Hx8E*?RZiw7s_i2(mvJ zz*31tXW$KTaj(`&S=sG`y&Ziuy5@-Ci(gq0K{b6 zu<=%y0*xt7bmh4dm98lzs6_vwrkd03qy9_gwna0sgjs-e5)t9tm-x|k8dla!(lcr- z3BY3YD@}QkFXC%xnI?G%%F(n@N*uV8KK|_ZlQzp^bsL8h@LrtXuSmVtEPViH3<88j zM~RH%MGQ<%o$lh4no@gekki|uwcl(n@(a63f7hdt(v(n6p?gi=ecp;k&w7de$oiwt z0}*a*>1^+NQ`(%WGMpB>mQ_V*RTrW7_bR;*pdYwgK2GMoW6VKmoa-%}R_O3_oV6@? z3gL4PkW-B@3Cl@0GAV$^R)s5;7d3oKH%qr%)oYmah5LTk;#EpLH{fb=qp|X& zkNlGo{Rg9zQ{gUl-(g4H)u)stv@_8grfHN#7edG;;HB+=JmY~dcn|an>@V`+^H1Lp ziJ6Rld2ebNu{#`X2I2%hsrA_;+Cm#vL75UgrWvQp&#FV9Az*{75~E37Ow!fR^z-!^ z(@3;u0W)p%7ts*3sGoWCvv2ZAy!NULTkp;z^j7)8oXY?aozipH(*&&Nj>rc6em1ID zsc<2=)?gx5k+e)e#sv?to^#-s?h-e>15-nBI$s?fj?DW=c)&Vf2}vRRk~q=!bJV8H zhig(X;Q@|08&h;czo!`F@4}QUWt%u*7y@GGaj>S>n`A#nGA{1V6FHOo=*Uq^-ngOD zA+s;n_Cdm!lsc83@TJn4wG*YCtGVDO2?HBA!wjU)I&;csZ6a{rXKlorX{$lx4l(Qq z4gwkvKL|A_b8d6C9YFSawh43vp=z33(%Nf`o)&B|dK;kQB*{P7nqY*d?rrs`nb4N> zZxz1B!`!c5d}qD;*zNNymJ)ddCayd z3`7Yh(j$J0AZ6*3-v!wmCe^r=54?}LWsxjt$~Ycg?}&_xv)g5}>uGM=o{30_Gz>{a*2o2{%q0A#dWZ0vUKUr5~N9Swo37$xddEIj=g z5Vm4>754GntQ~xJqal6 zy3LrTIDlA_B@PL;Ox*`Ev>>n%Sk$|B*Zp|PIgjB{cnF^Qg(;PD!HB8gJ! z>=><|tmot}v|y}ud)l(;y)o%jtmp8=kp-gzz}0fjdd!`man5ct%~5+5lbge_!^djv zxRDG?S6{rB8}TaKz6uGeoV<{>s4f`>&6X>BlD+Sfc@K393r_54IOeB}*J;X%{Ac5% z@kO{F!^(DKgmRRoGK*H4SSu{Bj+B`5W%`MyX7_CkHVAj;Ig!7H3UDv`!y6T?@T5~D z3?B9YUV;e)^l8iozO_g;j-?`gmw)HUj{0pg-MSsfiO=w~Epp&0BrA8SrlWl1gG(mgkB5=QMCHG5vT#p_T=@6WNz3bnntX-!1_Uhym`_L z&Z+VKQ!9t@h3Z&oC)cKnMK9NEJKIgkKzO=9Re5$b7t;K9CA6?X@0S8Z5TXUHw;hgt zAlC1Dq+m^5Ecy98>855>Es1UefWj58MfFdE`;(MQn6^@@De3{o*JOa-Py0RG z@xGFG8j6(`dpW{AJB@7OH)XQ;nWvC8fCcD~mkam|urGM9L4l7KQAB9y~08lK$gT}3c!mE0xYFBhWTN>1E zLQdGA_67o)J7lb?o0@V8>P_asx^Ne`6hO$~# zzZgD6$JBHr5+SkQWLSvddHuTp(c3?odo%Tyjz62-b8s7E9o;A20%^_+it4MMpYO|( z2DuTYQS{DA^{xSJmUsEMJW28`$P`fV{(BMnW(1Fh`j&ao3#QB^(8K}5bdx-r?3ROo7 z0J%zlhuQ7A3!DM}$RxLn(Ivu+b*3jWaqbW2MlkDzk~xY1G^7nM3tWG0Q(wKUO}1AuO=o z)^m_?*l3bx-$ODUQd&vE@uaMN5C~>8ixo~o#q5&)r5{Z;d4Z~9oZq5Qk1lXYp3FdJ zQmxaeNZ@q>g-es3-3X=@E>=Mq0-rg_3vh;A4i`DW+lQ%mGv(LQ`qxyI+dZ>-2y;P0;gGbHHuGDQ)NRz{f#0IC38RBaYGx-1W)X@D=+ zn$G~$oioZDubp^NQi|o^K)p-8wBfm#R*=tTJ6KzdF$&cOp~7t$!MHLHB<-)&skdb~ z{pJqfJjwB-Fb+ac#5oYp!0ml02%9nM@K%hP9Pis8xOJnk&huHt%5R_MydDw5epF6Q z3(7`slp78*K)~Y;_;Pg2Xv&KA0VG(1KB`vUQ|CaEk3);(Vs$HVWE#5TbNl@zr3+`GNDJ?$%fFRO-nxzNi?o0pru$Dt z$rs^ybPA0yBN=6#W!k0WLB2l&$J7*$LWb|}ZbIm?y;;>|JJIQA z`ggtzu=X>;ZmG$`d4h3HhIdYee1Xz45*9aH4OOJfg!gc~PDdoyyt(yBd0Z^Wr`~h8 z!D+1{rCl8&Zc^JYCkPKEqsbDhM;26gQ#4b2??J`Onh{O3Zw@Lf zChzQvt(Ao_AWaUx)OuVp9Rg~v?4+WqGU@T7MFf<{rf!@!>i`ZCKs6SJ^*G63;56W> zD|2h60V+izOcl|$o&)CRg0hc(C~)){VZ#NxrdNoUG&tWz!W$Q3!f>_3=Mrb*Dddzl zo%E^a*#G8&>W1yLV+urftikAHq@X<7k{o^bc0m|0q<9tm(-+m%h4cees!x*tjv7dv z&jsOTeveGGoY!f-WL2B9EXZt!s!1s^4f7@m^54)N(IIEhyA&@ePuWU^ypqZp&LPs+ ztY!MPom&a45Frpkh?UGCisXD=PM!s-i4NO2A&)^!F~B5`ph1faY>y9OGu3hU@u&k^ zk#D4qA_1x@msZO3u(boM^RIqTI*9Ij^ugiJAZG|rf%x~pcIef712^G$a&DI$;78DP z>J0zH#k>eAj!@xUn(DXb>(=#n*~hGEZV@XL3F7z5HKMO$X#*(1Z4xhZRVG@@_b5sC zSPjdAUrtn2m=P~QUGaxU3;j}fd`WBK1k{+r;02Ci}{4v z0`#9gm4h! zAJ4V@kS9ul>Fo+dBR7e6n!ELJDUNeJfyz{$@Fzh5YNn{)VUZn}WD9#GYK;l!)tt=- z^~{ndzmoj1m`F7#ppqpqbO`MDVwQow(k9hIto&+r8^K|7khC;Y$;?O2iwh*rkgY5) z1v>rK^)Ju?eqZ&6XGJoQ3_J3P>+>coOXuPV;(HWHA z!!6ドルUu#P1wxc%uvF8msl7y%W`=uD4z75}0bRMX|jU8=D~X=_Z3_pX#BNz`yY>{Bzx z166H=sRINtY>$q6aM$tqTU4uGex0Tar#g|0wWfIV5uDXr_`EA>!nyrYtmoN_0I96` z_!Zzk|F{I=EdG7p^LW|-GoXK_(@Y2K*Jxfp!qX%-`yxAdbZ-DT5JEAj;*qciuoQiE zb(X>>ux$x-r4L5VCzkaa zWS{C(8J~vyMm=@IWyxyj>)*m$CbicPfSQpHd6>Fvk~1+_rE4E=OepgF{v0R$nb4pt zJ5gu}tXP;28w4ze0hDR58oe}o$iNS7(52+37jN#wl0|TO>5{k7AkBDJknKxIGUwnh zMo4$GCHTO-`HaHE>F#U_9V#TRMd{r30;0|^z})e~@y#eFHcF}Vrzb!MV5N6cBKz?8 zX}EiNzU!UUSPzBp^PTL6+pQ`kmHHX(tqg1u{Nwj@e?BE=3ju8Bt>XYwo~K+A#CjYE z>)c!@{fQ9_QZ3~sC8)JM1=S#&?+fhKaeG)*PS*NjY&d5iUcTMt0RUVuzy( zlo$fXe+8zr0I?3}^&>y%ixfr+c_PvzrdGFh0H9W?xGQwwXi~;nVFtC@E)&LC4TNaE zlO7LuMH3i`gas9R>&v5+5!e_dB_}#LQ1r6%6o%s$rQP*VOWJ4mimZ7hzW5qB5gG}v z7j2sk74`NflP{(-y~P7nY_sQIny8Dq@OF;{EfSck)bLqNq&OLi%B;5uSQ~-#@U!@{ zYZX;A7v+)rzW$V{l2VA zP~mcm$D&MBxR~=(8S;vob-?aXDT>hcst&jMJroD`P1w7Ak$Q@5Y;Dbt*Z;+A6nC2Z%sDVD44+=oAQwC7N}#4VzT^(8LaJz0N}@qiuj1U1xW4>frWqU zB8O!D-ILq*A5%Y1_0QD^CQ=45?T@~Db156CkOBqYh{rPl5mm4UfD1^HJt^aZma6xs z@Zx*7S-bE1cnx^JCwns8s$KUWR}L14t66uQYS;#4QE6>}dgE1)(tE528O-LjXz5+WAYs!zY#{L4ドルSX22;qV&rKVJ-oXyAB!&tvlToMdYYoi2P$;BJ4 zmMxUkqJpfQLNDJF&?ve+ z_;rWL_E<5u5emsb52iww-l|m4zg9;dg_8u&ygq%a-4m9buzVKemu$-A`<&ep5 z9zFhRZmdBPy8}I^zJqCT`gBRxpqH*kK-9bpXDGX*GeF^kqD8|WbZ5&#PFvKd&@i% zXx!o2W2 zb)^$cxk_39`Z$(}D*@mZ2MMv~E5zwj%`K#1oG5T0}7Pg}<^hs!q6y++kyids9>^d`6}AAkNl&b1X~ggZP}^u| zE&84qDpGeqr5q~jBc|)qF~z(X%z`Jn&d2xTI~jgi=JB~7h<=82^C;j9?Ijs zw~)WEW{^Y2V>8Wsl^WAS$EHeL6XYR6w0fGIV5F2RWll+AM=`GTSkaw&2lH`uuylGg zNfeuxbW?)%FPoYzCa`-}XMnM$La01QoruDTSX{L+w$b8@+W!y31T9-Yn=5XCpLmp! zDU{5^GMRT`m2O}qCI3%Aj=D2l9Ijt*(*b8)ogX%1SZX0c4~Q**JeRQ^)c0aFj;qK9 zL8jF*!bwLb3?X8h${&x9zXz;%$h=X}asw7x1cfBXFs*6+{;+dYmPt?j;+!f#3NR8H z0|eIEG9aS{7%LpG)lFjdyx{o7(oG!aQzFA#v$S_3O_zxSl~E>NPR9|_#^TzwhpYo3 z5QU+vR;9z1=#G4&v35ドル#=CNr(k%@F*AZBEA&t zsY`;qXys0iflQ|D^0pIl1#ZI>OhmxA;uk(;1>m(iGD~f1o}7*D9`#aq`7(85vhW$M z`B)fO)653z=FMAhlOHdd`B>E2vjO(ri_aQX@NRQKf5V1Lyp0Jiz+*y9LybGp=Nb85 zE(eU5uP2u-$FlF=Shattk~c4_n?wPoXdhcAZyX`>1VTtkc2GT02-Ea!$||EyNzrZ0 z76kSdcwFM=SF$G=a!pCReHzUxDWH6a-pOlu&{hYkDkAD>$|cS^kXgHG^!e|uMl4?N z^IiC^G?#zm?}Z0i1u5#BI4+Jm;7i|okL!AXRlR0r#T09ugCYvlc}A2sj}|s>sNq%s zSdO6+*bfa{NvCoyra|lg`rXWJ?jD6DKxb%6zSZ9_&BSw)fdS3^(u&9LntEgf<^6-a zKKuz$qOI2b$~>3Lw$g5MExhlu=ptaImtO#c z(&z;DK&&_KQ(bl&urXlDDjTba1F_dmTM~yV2?DWpdjVSAdT(Mem%laS}78lvelWp*U5iI zG1bV{n-O00!vT2p>U}6e5jsU?jOzALo#9@BE&>bglat5m!h!Dml(1EwK-Cx5ドルjw^z zA;o=N@K0;+xa1ebdqJ8YqAH-S`3Xu> zXi@^}$N?*`tv{0R=_Mgl1!K`d``HAte3KCOE(p-vSu(M?S0JGi%>=7H&L9M}qwaUF z_Y=hQQVTVK6|0C9<2yy0zyq{P8$O2v60xDmHo<`=ny^gyp?b@ zI^9qFaZ*-5yRUQU!)3$rQ*D7edTJeu^@)nz7j%4N*6i=YahY8S1GEBoo@%T5%d5Vd3+Us-K-K= zhdCz-q9U-#eK;+fo_9$of6WcXr*6W^##KnhARR;sV*Eh2^t6R49U&a>Se%^6O%BKr zI1Tg%V<(zuovshq9+flrq3z_46eYgf~RDU4qTk{tS{%J+IHeHFG+evFH~THK~myJ zKIM}xJc$Altr$`l{9_gn$Y72ドルAbIfCYyFV50`pGf+ZJS+(5G3g7x8;T34Acj&%(t= zrhvCO!(H1~A1)585y`oD1EAz^7o%*yxQqwx3nmhT)Gq>Nj%mAz^pd(nX(PO^HkkYf z(72ZUUxd^g>LXO&;sJbT=e@keexE!e7;kaLQBDx%O}`rA1i0Aac6Q8oz^xP(Ew4Nw z>(4Q-&+*%@Th3RssdtK8d`<~w+-)8ra4p^wq$`84{yarzemkmpjm_v;hb;9u)e^aj=fgk(8 zXSF-XvGgUtjemTYknw167BZ|Kxm%p?z&;?{;{2~@Y*t`;BL?O(TX}4n1UT=*jUhEZ(@-c3mDQ!N#jTDrXI+);03>6|CkXzKsS94tPbB0=0i|G?~WFCQ%vj zW&D{%z?Q>^p+x6D9gbUZ^Sn9wGl5Bt5^yAmK!Row*jU$r@hR}PJdlr90K5s?CA*|&e3vmG_a_{6fVdB>6v4+&6Cl%Cv`4!LNn(nTyT)@P%D=%XBPNYsvXfNJr zb;V%WN20#0RnpR%RZKvjhYJ#fvprXPmJ`^3_n_z6V?Ixn9%%+xTSIVLQ=-S}N9`Y%k}??Lrq>|xj4DOX zV(Jex=_%nCV&-|EE)K3obX&$b6iHOjd5|A*i1vI2UI}1j(oF?5W8XguiaQVwFx1rEKIQD4z;%_Q*p1Md!^5}2uJ=eMp$G5+SA~z81 z5RE!fCA)9!4~il*&xctnL@?j|oHb!5vye}v#$?{F+(t%Ai;%`gyOaJ zmfkVVZ2}QCe*Y+z&L-(-f={9rVWs-BH*Fr}6^jDs(eVfud+zAOf^+=NZ?CF*mA}y! z#nUbCYA7BxD1qM>5h{K#TMU2Nn6?}@Zyt57HcX$E6^8kw^{LA|b%#+(c zn_+^m7kvrx99nWS-vI^vIn0&&JRB$f8dUi6h7j)JKFeB@zuSqCWX?+7rW->K{%gsflF@5?g%vw%{o~_kPIO@kxcg1syW*<-dthbqwjy8c$yj^ii))qxz=`bv5(9835%h z8;4w54`C0WXB&4ujpIy5=%WPd9@u!2%%x4NCib|ZkmZ>Ic3-N-2>0iC zG%{=%Nn^DM^G48%XcUO+E9Y(RU^Pjt1d6#L$ghhAB#M?6yPE%ijH=a+WPC_jqC0h? ziW9q9CQ*_FlT)M%zfv$Nm-^y;OhOSJxJvsrmg? zwA~ZU`yeAdftphiN@}kfkd|NfsA1$(EnWR`?>ajcc;KbO^5}P#lW(A*#9k5hpkAdq z{E&4DEG2Q-A8JQ|-(h*Zj~!tpVH)%^;@;tb&YG(E1WJ+MXE4Rxt1_~k(ffn zc527SjTHgF@-8tn0k3gJeWXC+@M&W|NeaKL8KH2@30(HB*r|aA4wF_#5n>(oX$Yd# zE@!Bm%XQ1?jCOn!{L<_-x1yy=lrj_ah}7eexgth4*k4ueo6|kzebmt(5)yo5jm2vw z&71ドルHhK@rE<9>MvBu^G)6;i4Uv;y&rXN{EGmY^i+F%TdW9of`%5sQdzUwv9J@d2hq zG_)NuE?w7|1Pda2s&m1v(!dv}E1(}~t$^+m3Jj@2(@SIi^V&J{93=~*klyrZjZJpG zm^tODnEL3Ja)NYjG$SsJ0y758`_DFWk>IXJFQ2>gEk?j5+$#Ct6 zV_`Y+jOq!4RBJPpwZ#(h3;tP%D<2)qb@teuk=r-(0+7fam+ znT1ドル;XSD&@pJ=RQ?XwgY!|D;#md7Xm!YTL7T_gzwF31D4Zs~|#hfVk58R1ZQU-LKm z7Tf5V%5V@ia{LRZywPYDD#?B^&mZ*;)??Uu0&6*xjE;?1)=|o)Kv@mv0jDJ|R6!o< z*;EFj<*ti_{*nz(g4^``(9lh-c|2(h5q4utdh|jeyG{s$qK#HB)p4@jq2` z&4?ppufD>hbp;tYP!x@u+NSC!-tl7mJ2WIT1ko%xKQ8t2mR9PZ*N=h$Ho-VwgAkyu$Xq>@f=O&<^o?t8rigduvhkiz;qnv!$jjs@he5onnhk$f2vu+ zUqYbJv9V$Rox-z|rnLB=3U@Ohl?$h>A~i*FhR#l@&j+-nRY}3B#6i8xopdYi=}^n2 z8DPjLqf~lU_KGg$NJnpnjKLRVoTkk_+8W)%A0#5Xi_kmd3RzHzP$&{^R&OSmKlOEc z1NY|Kn?&V0e1brv`g9%LKTLM{Z>Y8gFNH zt(c<2xq#wzs>wDm#ytUEB{EZQZ@ezNyoDo^ySE((NYc8FKXKv3zb6~`Ug47@NFK5C zDIvi+egn_yN}#WHMg#rIQ|`<|n!f7bd>pIFN1ドル~6y?}Vpmyo8QPxSMm)mcwDrpXyW z!@~;DbE65SAg6`{Fu8V93wS!+8h|F|s*0>G_=u2@No}~#6ドルb=Jt&esBlv*kNkkMPy zuG@UV5ドル?u1w0|5yuWg-M$~_YUc3JQ5F4GAP-(Ft4R)Fbg&g$k;TgJ&TzlXmjC-nn8 z8GU1Fa`2FiJZ97k*bRK}BKsz)$Xn z7zqrdHBEX~S6Ik2=#95#q7S2A=nE0`rOgd zjRv&5b3@mGXrNiJ@zQG!)U)xi4{K)ub;uIfoliJsQ4BRL*~;wmpzg>8ekAuLl9WiP z<@9yt!aoj6cf<+ysbtwzqt@<-b%77?uaxxf%h&cbpfgzs7yv(v;`wi_c46#quby_u zib@N+0FmGJOOiUF=ib836_@@Jf`bhou#X!3$j{;c2B2=GX~rLTaW6uf7Nwgne>sM? z`C3DL@WsF%XA#fbc-MQpG^eeHZy}e&$eq6kY^)!3zYLa;9|2*n8$$+*%299Pd!hpe z?azF!97<0t@$lrwqk+-o7e-ohn2xvehm6~u_@kag;j8{pvuomg511n54gl-`wv-6{ z0H&tPpZ(>eANybga=)Ey@5wLnO-35>0ClK9D%4mJ9_8W%D*s)b(rQFmr;!tL4p|+R z3ec3nQ*Z!mqL(Sx;HAW6Wjf7z_k39afJsNf$WmBri zVPc36wX{*417*&RPr@IrZ+kE$i7{o>|E?DlH~@?-#id9oP?)RW)>9)9xJ@?lW)1Qr(EM&O z3u#zr^O%Q7ドルBpg!;;R7S2>2Uj1#nCqDPNq!65|8QReKdj7BEz`7nhV1LIIf>v?X;b zaml<e~QVd1?qC}bMyW)(Q*LtERNlvn(GRvTA^~$`GU*(G)Cde576#K z2Xz{#quQjVlO_ILmw#4Mv+@pnj6t9pAA^7dYC7mSdjNqeFpMsX>u*y!(3Bv@Wz4VW zz&FvHiyn_8YtsH645?4};I&xnzCvFI08^m`$Tqf<VQpy2bswDMldL{A`$!`Dcc)2w*6zxjo9iYa#^q6RcRcV@=XO4rY9jv53LIF_?N8q|sQ&MRsKHS2(`L_}|MMR7pfOP?@?+V* zr&Su9R_dz3S1SLmG_VWj;B)HydphHRcrIo1QSbAA6aH_90mAt2NdI?-{|j3GMd|<2 m(%*FXUmpH{9e5l)l!p@@sr1Rofv?WONQ*0om5aQ6|NjAAu0`Ph diff --git a/solution/2600-2699/2603.Collect Coins in a Tree/images/graph-4.png b/solution/2600-2699/2603.Collect Coins in a Tree/images/graph-4.png index c9964a2f1d3a3d333f58a7a91e40bc5d656e0884..984a095e1176b80c300ce8a49455ef87079b289e 100644 GIT binary patch literal 17553 zcmd74XFS&7`#z4WL{Z8pTM;4IGc#nbWUsPk_LfmfMng6?*?Vud5X#=`#!ZyHvI+n5 z?(_LS_&xf4AN^k62i2YXJ+Ak4o!5CD8ドルjESZ`4%eNQkJ3u&}U56y#+zu&{98GY%0U zKKw+g*-{(+x#%RX>w<-k=_=+a_tastuo0$oecm@!ezimi>5DbWBj+94sl*qbhoy%Q zlYMx`s{Tq|hK-6zGc)ADvx07E^3J5I@4Gd%GCpv-P+g;vihoN?mA4llzIuRKEM7I( zn6{i;oH|(b>ec))?Srlyn^<(&h(isfglzts+@?!_e@myufg=kg*@r*`983t0@jv;1 zg^P!UC7}jq{7*j6v%-NvIPm=c(+~e!Mvi&9{{}rTS_JBS+YD` zU%fn(9p!bhUfuJKil;kEInjz4mX7}J(cYMGPk)-Ua^~Y0rOr=xdjigOQoE2v^&7&P zhNJ(LxT`!WdcQUXhgXG?{{^rY+hwZjdS^2@c#6da>~K zVUx$E5s%Fx2Q9J)h zJWHzYV6|B2>tqp+!F~u8iHf7G)+>H=O9wMP#kxpeul_1A%idcbSyXB3*Ka!1G~Y97 zh{GqqT(hly6S;cnBDEta5sOMviTTZnsD&RN6Z^zZ-o3&c(4aCzogCd?ZrK;TxmmlI zQhxIIk@Thi}ZmB|Nr}|HBlsnC}{9cf%bDp*R^7{*jIDjP<6wdie>MUjwre-Cuaf=iM!#L4S!@PDA1J4(GWRJP|{UjxwtO zMipYrsd%>)KUdK8<|ui__zo)cltbue!lafgm>TkrpPKZ>aerZnv>Yok-1jU(9^1H_ z{q<5i#vm`09<3f-clx)xi$)uv{cn!@a=4_ah^e}lhxaawupkhx+uv~r_atprl||dp zUnpoqJV#6mdhg~q+RP_=%vf*Kt#Z1|M+hWr&vzs?ogH_L@Qb*uknihV#-x+KtZInB zQ?;{=`pv7S!BQqT)q7itaush>Pd9PdJ);O{bK|Z@)&acwJp1-a;TtCD|rwc|eZt z*MDx8QHph}Chm9anjY{(Q7z!;SM0t+h`&*@nSI5vThKk!PBza@0{p|E)-Fez~rzeRS7Oi;bPYYM$?uQ?#51Wc#%=|Kf%_LB1 zGxFdXi%Q0}=*IW=O#4aCdy|A%Q76mUscV#>1a!Xr{^LHsY9Jqw;&}fy$Wn?A2*rx9 zDt=m;?sayws2oKrww4@%^gBs#U!R<~9lz0q=ckqp^|s=tllnstba4a24pk0&!5ドルli zk65l$-P#wKe#CR1UF7Dn5*>ar!&-Ruydt^TEqz67;iN<-qxxwdovvq}mutxh`x*ze zdo;N~W0^&dO?xDb;{2mH@dl5zanl?3o|^QjLvC0%4ドルUMo(K3~*nZ5R5c+5DUF`m!% zvmb6+hZZbhe*Ra4c#e79e58n=HAJ3KdMQEg>-wx35*lG%#Ck5VBcuyo)G(I724~1j z)WfsG;`?fqHrg&I`|2a9mrY{_=zvXO=H1n?J^{tKX%94Cqxar}T9?JD3pb~6@uqtQ z_icuAnt$L*Vs8;eNIQx1Rty)T$X3sm9Hb^Itkee5=7?oPPbQmec|cNlWuXO!#6SG`{zfD=cQ7pZ!jB zG|;hhZRu+8+F8PdIeVXVH?od3TmF5^Owr}rV(w1u53M2_P(h-lGPXB;Aq0^3x4tt) zjWfy%)9DahpnjTH|L_9A<=xpika+icoo>_KW>Vo(&!^8T#6NhR9zX&48aEz!Dnutb zcf6k!-lX|Qhv)VO4N6LJ-x@F27|MGqBR%WYXorWyTom{(7QUOZY2}z~9{`+$b1k7&{c5Nx`*n$ikdT-94z+C*_`K7uzq{l2_5B42{8k)ZMP}Mfl#$s>llW?B z%h80>)p$a%|Up|d0M$e zl=z*oT#hMTzo~dkzGCs1x4$cS{gT~JBA>`CW0P%nV;V)@o5FDppIALh_OQ^s#2hc=4+<{&!e}nlv~ky?r|~ zhO0^SLx8Wy%9LXr(7vLtjFBdPw6})WH>T^ypd^jIqZON^z$c>MwA08| z@oT$}xWeIQk{ccU_B=|V#Z8a#9f zQj1xX-0EZI&q0yb@OgW7N;_!Fp9d7z{!Zw6gfbvIAOOu-6nrOHFlMDwunBbN%bKiX~_#he9`<< zLoV1sI8Jza3knn#%IdDt!8=+D9bPE~HsJ{?Iga}dtwAX#wmy2X67zSG?nmEIPGEn9 zt-NeInDGV!T2A>J9Hxbdgz%c%`1r|dcvG04YK<#kqb|x1l6i3bdlxnv_rf^fnu91e zud_cH$NRE7mqvAsx<5piuk{s)vss*9{PzI^v4BIaePrW@A>dHnpW&@O#q zSylt-MVlIe`A=5#v##Nf78%+`(mm`|2){2ztszk(*f3ILh!XEqkbgQft2>?Sc{um_ zyplxQ1ecH~u*3Jy50-t#!soB2`(2(#T?S{XQ&l3?+iaL%G0W{8R=9}#e=I7Czo93i<{0c1(h{{>>2mo>R7co zAumcY|CWu{Gm_7)((|;g1__!`OYP-U=#!FlANwn_|3p^ru ztXZ1GApI&1l6&oBR*L>=4W#353U6N!MGD92;a&oWq5fU>w$sV}deJ6ZcRWvrO6jn> zMuxm;li1ncoxY-|W#q|5IqDcb3rVW0!SWj|M;7R$Oz= zP>k(Wsg$vE8g(A8b7POdCM740(0blin_mL(I*g_R%KEdYG~2PFq)(LTe79VUpeox^ zU!Z5D*ArrwfLh4GctR)UUE$cDIQmXvt$!s|xOyl{`OCjsjSPH|Tkm{Vhd5YA2^5@+ zzPmVbI)4ls2HhgYtwYVukDwJr#kKcMQD9Y>TjmFA*KDu z3$W@PW2CP;ou0MEuMDz8azVG0)!|%ebC|_%Zz1WOw6uIw6}NWZoS~_(w^gvQM6nfQ zY?FlqJc%IaJvdZ3;>knH3lZgA;eZS+~Qb~FTtF420a}Upw_?|O5(TO4ドル%#Db4p9<@xe%-*iwjqymru2bn6jmr!y91|v*bif zRa`xB+`<3o!k<_#td@k+e!2l|#>@M}ZBK@vN?8%ZXsixkR*yFBNlw5Axr>Sqi%jC-nu%O4C++RP|f(yHc1%lgWqU zcplI&lm?vpqpHiEcRl*|W2VC9uL9yBZ}U9!0y5>_|0iM}VW<(s3l2pz5gmj%c62c1 zl>fGlGQfXJu35J7OCfJ>5NbX|A^k-DeZirUBsh1HCEz$CN{!1f-<_jd=x&=)-_*g- zn{mwmmCWQO)rb;5&RMsGh{^c3ftvdsp4%1Gt+4rQ8tN;t3Otm^bggQ%Q^< z@O|b0)o@0Rg0K_u(COr0ChH+rF;`Jsb5#A`D~tX zP3oOd5WaqMjb&0?2kPa&Z@Qio87$W)me`JQQsbI#A1$V$#C38tZvW>?o6!PmuJLtL zbv8FCKQPMb(;}!pm|YS$)-;l-@Ub0ebO^rWxYg%~;~8KwN|-71)D9)OzSdS}*_XnL z-?9SCv}zMT`&&#@Y^6hznYiROTA;hmC?-*pshT>o-;548PyY99!q2vFRQPT*gR~W~ zjLb}fmp$E7sW}1W*=KKWHXfujN}%0Q_PqFvzh`_lD^HzZ)BhVzEGzvI&M8O+LzH20 z@U-Lpf8+>tE|!c&xkZni@hu(;;(wRJqprwl4zCkbO%+eZmy~f^8UC@~ z26V5V5)!*n{};I{KBl7;^7Ml;Ep0x5itm$R!>VSeNPZ3kwK{e^pfD{MyCsBu$D+}HI`ESo@I zF+-&PfB~OAlA|vM19jE_o$YtQqzz#P^1cj7ドルCjwOs9!xuzx58nWZd6tZ$#%mUusl4 z82WJgZ?{oc6MObTMYKIx1S)JzOiFHr6N19zd)dRh{Gzh1V;rN8A|4JXxq!dha?}@a z@e;7+o&as~A=?{gc{-^sS2>da*A1Est0jUN&D%yGFC?N zQU1apZ2b3htt=%fAM6cu)58etKAXvk-1Thpj>ydaoX+|2j&d0V8p5NWa;qYeMr0B> zS#139zo$ZxB=gy(;WopCJKyBBieAr$RP*0cFEhzSR#42q?i`}rYJkTbIF3vjBr=|5|fwf#oBpVY5%#a%>{ho5{hXMZXgVZY)1=9{q}+VXZ`2f1ドルJKT zyg+EmD5ilA4$_Aa`RuR35uf!P{(JsoSiN62IMaIp{nsR1Z`@g% zs{M#Bsbw=&Q@Y*?8-VuT6_ujI_9=fklI;n*E`7zZfa9C1K#M_Fl(oLTGDIJy=h(3Q zYQ1ZHvhoW&I#$rHW&*kjiZQ5xFfTU18_NA^)xSLA#U~_^xZfSe-D>pIv1Sh6Wq(Z< zMz{`Dvh)a^B#`{%z?5lN^DubtnJ#jZh7wLftM z^#BulffCnQ)xH{ObpZc2r@xaV?AE!z%xgW^PYLYdC8e-yP9x5ドル`;&L=5=sh*{Dtc% zJ-qAi4W~hkQ}dMTkn+Bnu-l3jH7@sUpxafB=et9ynEM6ZgoIy4F$la0#v*k4@u!kg z{gFp7#nJL`s~wKElL^bz0s1f@n8wOeea+kdzEXLEf`rgd8K%(t(;{Ky0*p__DJych z(yWaL?vV?%yDBO_i3c9_>KsOMqv+30@qXJb(M^5dByfGP&Icb(!99jRfSIp&p;l+}d#NwTPE-)sTNtXl>7n@Qu#>fHPm8fd)Vz-I&cx`mF&}j@Esz zm=`b!U1ドル}S&>uD81=I<1`=jp}f~{tc7^6dgkv)ngto61b5y@kdahmn|ku?_zziesk zi6r#}h4wV**K5>w zs?q-S#ado~MwCEp>;|c+2huZD{)HeM6OkY1S<)(t_g}&qqro6!v{%fdp~v*e)dl;x z7*4}U&{5Hl%3?vi#V(!OT^{-k=ezH9T%zDK*xv-!)Ne!#3MVb~Wp3LaA8uz^^dy`U zVSy&Ze?@dF&>FNSLlwWJ{xpm4(F|E~QM6eQXqcSe$jr-YH{NeIRr4MnWZHpw;D;7J zzrFblOV8I9P9XqWw`t+$XAXUS%~CVjp;{M9j6NEGN3^)vog$XlF4L|4)B&G?auHsV?g2tQFN{=vj0^QrTI zRuX~nONLNz*8?C%O^=6d)?%fBpVa6_k14Z$zLz?*E zZ1DNoq3a7~@fzS2g=<6xw5rlwm3f*q_=gc6t?qs}{or>9UFz9Zqy54p9YT4Xyjaw7w@nd9XW42GF?49b)kq%P2eDOkl?I z%X<0yq?fba>BEy`aCwGIN%h{>dvC9^w;%(0vigyZ_3Qj9_@b)Uua6k>%?b=A$%V2F z;=)5eIGFZGZ5(fa86^|JAE_SW2308W8jdQ|%eeJ?80MS9QetY}@3i5avQS(@z5()H z3%z66n?xpdnZ#k(IfuETa~#KL7X-oy{{)a)Rc}REhzWXJ(DectAw(vIO?yrDHz25Y zhox42gfv|xrmce9Tg;8B!*bdZ-5ez3qY^U)wJ(mu7oc96xUY@R+4x*%(=t(GA|xV= zn6CFgT~dNz>jsH|Y;~h_D;J>uxRtUlDg|B;kmBQfwr4LMZ)m{=FP+>95}D z%Z#HdAIa}ufT@@p&JF-|K+IV*;B+t6@U2eA?oQuBm!Mf8HmR($TscyQ%{x}>ucm5U zP#?OX%vX-kRPu+Q?*8cQW+-gNfjQFp2lwN+&D(2c+5ynnW3&mKsv(Yki6>pxvZIMB z*XCqZqQ%@+KCRYYq$r+1oPh+rAGq?_Zl+;EM*%7TeNIxYHl&*udpjV(@;El`efD#m z^Zjy>mvwh-V#q=9k_NU>x)TB!e@B^m4Ano6q%ig!Fz{Kgbk}~u(N{Ein~h+d|K2TO z*YBDa?qLT>y@MV?xm}@tT}iIg6trG!9UAwZ=nruBBM{iS!bPA&e)@>3dIaL0J-Qn} z=U3FAIe%eZUWb46)QfQI>AK3*dh%vbPSB|63Q2Rr6=AntnECvc*BZBa^fe(bYk^*6 zC#}w#tG5LewmxCN88WxyN;3ihh05k5q#%)#rLDQvqN<%pubp#mjy@gok8t4bd;r_t zTYMf?E4A3j)qRxXB6G6~fEJ431U!)2`0y^>s3@m*wfsuLfi5yZnxNNZT)>O5et%7urgOf%#>4T@3{vuCfSs@U_BMIdL;C-ELGv730{GNdeU zWFcntPOZuRwEM?L7DGBsSd;atI`{R?i#Px{zJxz1d-h`u@6m;ujaSL!|>zo%eRUi#c@5zP-8-N-|>Zyo{mI%eRa{1sb-(jRat8cUHQfCLj;st->q8ovV={RXPo_=g)Vbu|`#6J^iW z%}J`0>h=KH|HN(nNb5O^jgsTz5F9k}+tc>BM{<*y;tz2oty)lp;wjwqlsolh#t^t0 znTV?un@#6Pzn&zap}#QyMOBO41Y=6ドル{DDr5j!-742j=_P@-eLmvCmLbT%egHv9-+o za;JGMwDNk=Vv|GgB~s4bgewmCeE5n`9M`yWTA1LV@56=qV@7tamv{y@kS7j4_vri& z8CdXBvc&U{dASiUMQvOZLlcss&q0`dAq6KaEirxxkFe&zco5PBW!#TKkAo0TCK2?5 z!{d^yyD6}wODBS!TL_wk)ipUT?Pnl266Q}<+m+ij9v-@8#+uy6%xhzgabd6joqsoo z8*vrZL&u|cj{w>QSFJ02yb}*qZ_<9tjame0wswku*(%9azvnu>9ドルERUKMw2`!)k`u z8G|~%ZMc@x6801!hn=YyyT4~!NSHfu(ZLT`(0N@rLN?XaQd0bQi3yzwZKwC`P~_%Z zetx@X>?R{dpzR!Q;seFWm!g)_u&#e8?5>#4enq&LkY5AL<9=j(cx`j5ov3^i$i7s+ zeIKUY)x5LQE3#?u$Ab&WG?pe!Kurq?J63Z>mrLx!c!QVAS5y+W`K!AIH6@PqpyKh9 zM8sv_SOA~d6N_{*(i18J$*Fi~whx?|A@3e{>Qz2OX?1kB53i!b!n* z0WqG*qJt{N-?=ahwyi_yR2k;4c#!f~)Ru(MQUuev1w5Jgl5D3pMa&kX2d03es~8m6 zG{#XqWrntdg;(4Xheqbg$r1GS29{vq|DxX|J-18N*_f*B;pr1Kr)blyvWuT+^r;qt zMyinOQuGAUuilXLakVNCChNfrh4~X9?NS7ドル>%V`xxOh1~d3*2>j5KepI~HrAwN{;`Yl#Gw5MrfvS@>F_Lv zw%2g=ooV};xJR!r^OPuRHUwtOMv82d z`1u1{VnB}p@%Gy^yb%d0j^RrwUS0oTVk-@+y(S8Ix{tE9VvY!(KNqi2O%bK~eA<&n zGFIIu&v6I@!7T1^|Er%4Ep17eFHR0NRfCzb)9atH5FdceQ(J0YB zVU0C_AVe0>o^hOSo-X>D0EiS?JAsXaRQP<4syqudaie-)b~qngplt~&35r8v^dlt6 zXbfshnsGjYAnrp9wt;&rxKJ6gB!lry*)MjvDlp?=lsZ2Hyw8lXQP(s2#pFGb9BBAdrhgZ&qF>G!*)MMUr3?*jTw{B&1y(p=pWn1VbnhsL#y@USNZ zu33sUkMEG$YQ0lB)xSN!WDo7Q-z)jWRUJbW)|x7p;aI^!x6LW#@fv6Irw4^G%<=fz zt_$DEP}RlYAgqRS#7Y`FqMca_YmzjC=~kR0@eMk&M;F#3=iAJiImJ;x$ocQKeX!f*Pl}pv}t@M>~sR z0S)lfd{hsfm2~I>1XH0WB)V?_j+gy(grk^Ii>t!7AXqh&e-c3a9HHO8x?&SC%I!Qx z=3^nl4bAAyrOdu!QEXbroIVY=wWk{u47Gy1LgWH!1j@YFu%4ggDjc^0Dr-4K&`rmN z0cbirOc4=>kx%X|53$&-X5l8{UlWPKV$#;f1NAeGhq@jFx)iZTa7aQf|I6b|07y4u zI?h3ONVun4Hjb9ulnq2ghhQ)c@<@b<6hqmvn)3t0s{=|rz-zbizr>Fx8Z}PNxD9V^ z1MqOskW`ar{*!eoc(QjwwCLm3LKt_q$;U{$aWpb>O3={|Kp`yC|L z{`#!Hwy6WOU4@^JsPrcYwYxEvr^lFF$-xG8gXSL!-2}~--w@fZkRTiEAj|BN_yEQJwy=8}h7yiZE>1F^7%RPX-xY=dStfjs=D z3Z0jO(G0RN8Hy7_B{7V{nj9k+gHpAxJON;cc}E0dkARp`fXgakdj8V~dJD%m2)=z9zXZ9dwl7K+D{kLEM5 z(mw;vZjV+1q@8hVJrpnG)s2RHt=tdAM%~cq1niIYKj}$n zh3uRNPQRgX+|cnYOg<5kcw>_11dq#VmHA}v?sa0Rr6duLUaca72>}vqO^s`-D90u~ z$ou8xZRCONzzJsPEV!T2Ee`3vqp?$i|I`>D}L_QmVmBo zGNG~}fn@U#MuI?@0<=*uulesxfctsle#_0k#}$e??omu@n*~bbdjrvd7ovsl0zwb7 z*i1y|Y^-+|HovMjbO3y9tC{ZW4St5e!Jo#_F@`Si%?L6JFj|z`r!vW17Qt801Aw1% zVsLAYdDS>(NQJ1&^*A`#)+`i;6S_kOrXYC9n*EF^J4UABLQt~{}K_&ZFK z$Hi%$*tcUyx9&-_ZlI!O6rfU3rLUY($VrLU;PzL2!fr>9M44Ssk?Kwl}1sIHr`wm|5wq zkcU4np{V%ujE90rF;I&hV^BGXLKZSU;4Qh2ys`!G5YNrHE0#+DLVl;d7!sWG145$r zs$F0V5sn~x2L9Ir<=cvl&xuhawcp6w_mtl~4p5st^8vlts}mmp?uta^*h5hket}$d zZ5MDuOZ3YvBGv=%YGmBUxGE&2OrWAc?q%;?i-%&@Pf6y~LE~|F`Za~$UQhlY|3jZ% zMkg8>%c0-?hJiICw%m7Jk*iV0JY+7Y4?y}Oa2nb-4R~V{a`hN&9Z1p?wdhcfEjXU% zq6O(xmy3Qt0C)RtyiW)0mS+vY75OnV1i^7S4e91OLi-CcNE zTVe@{&YNwJ!6(krsT2r{AB&e`q3PFJx)50ドル|=-#kq5_6E$lJyTw%je~w*A3E} zeud$@;;G7%4Zp$rC~hQ2eg4ChMZjN=7M=pZ4ERx+gEa=pLr@(zw11G8;J4*#x}n?e z)wmkAa4MAt?e+s&U&kNprvuJUEe^m1H#z+)5?oTR4u0pRP z={_tV^2f?PUxSAvQM)3_5aSZK)t2;r12nfZ?v`2ドルzDGSzi9+&b*mi5Z)@GeHaElX%cft?gIU1h){BClC!tN`UAuqwBn5YqdL zy>W(59kOa)Z)5zNBC+^9j1R!pV4A0${~2+`o5X!spi{@lt8I53HHO^XJmxuV3bB(u z85Aco#Q0f!&a@5*=6)4_9RQPrp`&UP%`TE;p)~j~pZsV@^`UbMAyIQVBxO|TC!4-x z5xHQQz$c+Y^1r(LN-$nG_vJ}wV;#Lk4WS3nBYg%AiIds;5liYdPNqH^fMVs$WtJ|D zv~d+OE`M$(vr>wqy?AHAk0v!AeAgf5e=1^0GURAIRiIImFc$bda{`jL?|hW?)*?FhOl6cJ?DM0n0<5mov{jc^}t zXluHHz2F%DD_?NS7SV|)#oce-L_8-Y4@!xyBqVRy1Ut;$NpqplAMoao9G_Jv+oRCp zZuhqMlbhrVw8GAhf!%O=p)KJ8wj+iIph&v@IC*62DANKO8C9wT zY@~=PH{nq@#47r}%gU2)e#`vNYOIXUB47TQp3%m*1R{9}FTcm6rXxQzG~q-FI?|d8 zpdmAVyQ6vfPEe3BOk`zs!lNi!`^6z!+`=1#gF9SeL%Ro0B?IJ=SHP2>dEmL=AO(tC zi~p@j7LV)cOHv0-E*ZyXVYdP{Zz}7Putc!$P&|e1Z1+V**1sT%m#<04a5yjk{}jf! z05Q!8re`rS)1!CgX0`r|Ttdssoa}nsd-*w2cFX!}qKiMNElg#&rMH9oDiZV2ZBr+iZN`m=AMBTDTnn) zo3GZa)?Z7Tu-}1Zo=t78afL|lv(}D%?h)OoYg&{Kt*bxNMD^e6UP09jpuz4>S>2~$ zRPB=P@Gu;qZ&f=4HffJ%7;uvD*Z=BeBB03COg7TB646g&Gznyu4F8TV{sc->f3=ZA z+0iW}hD|1K|J*p>G-het3Vjy&rZZq>u*guv$B6fga0cOQvTdlNUukoF*w0!UeYl_5 z(J7xUDcKhV+Dsk0e?JRg6Mw}Kfe4I01Jw=)s7f4QzsQ%T#vyl2f=ZL(l8_J1SVZ(d(-DalY=(>)LvR&o~$jNcgKH4rr zjVOgfd2q)0V5Zj3vC!of2^^w#q|jzSfXt7nc4{9Z=S2~b1yuf={?zw`vi}SAspgO| zbf=zZg70kXI{&G1CDF6en+EYMKEFC+xN7S&M1pNj079equ(T93(U09$bu+!XV%R+t zUM8CqUBtOoaiBI8+hPJFqzAe#YhEMst-%CW5=rJL<5vunsu-t1kxcd>~&60n9hHq7tPoQu+B5bcI=;zZoKr5~${1 zMKWwS!&La{g8E2`*Z9-w2|_M+NN!1jXzecF@lmK4*wWy* z0v{^|Xp`T2+V9xmx$s_2s*HRKbfr~~0O~PB%nIo-V%D8I3kc)*9~4F`^Ha&S9LKa% z^06b%Ze%mE;-+qp{(BE=NbLd*Z{FjV$L>FZBp@8`Y{yt$+07KWdi)}g`4;(4AKE=Y zIv9T@OV8ir<=obya=c!!3=2ho(lpukex>&;*4T~$z+Cb|WP z>5|iDf!G&tjE*UrdHnx+0=a&VzzqSS91lHw?rV2*3Gf2G%l-&i2hE1^@FKu|4RRmrujpd!evv*^xT58 zNkQ&;Nz99GBEpk*+twSVdW*-9r!<;us<^rnxl+w-;x7dx*tccdy-p_|`6s8)riae6 zfA7pS2-2R9Or&h^oq5_Wm?Nbtm(s%tQffJl@|+1lDJ?C(4t7)v@UmGqmDbETD*Mnd z;bhBtCvjh#%j$U5dqg~ztPqGGWjwp#HQ4s>>Q8;!Qy`L=v3PIZ>b2P$lX$-+54cdo z+HhSkg2HLi1*A1HA$&{f-`7+{o1t~jpm)WfnsDAIqZo{jV>@%fl6%xYX+J*NViep> zo8x+C?JHT+R&8LPAwF*QhRrgMV^2v~!~f_P#YfP3d~OviLUI1|N5D{p@9%{)Nh@ml zFQ^oUM_qY`ic{u;R^GT#HU}sAN$gVecUEgv66v8l)xKOijfMo z2&Nid`C&A{9vF6{k&f%FXe3n)^(~A=!CqBadl$zta{%7li~V=0+M1;N#M~E`uTLL= z^lsPap&UNQp;|2|38c5zwU$&fckGa;5VwwZ{g)MLdwp#E!N_4io_$)Cmf;79WGM0& zbmrkdN?urm6$LR zbg4;xztzHO14rpiKFhE9pQA57x@ep&5xb#*g&WFx^_|?61heH~kEoM65Vs6taDEL) zAA(_Qu1wM2R(3#Q)Udy=y_zl8XtFvIyLql4anAjRrI?;4Fy?NM%r@Bz4G|L9K05TI z)zj{Y)1y`PC_x2!R+*0`#1_Lr8qQMZhX;}=fQwW}45xP2hr(Wy=2#LPMLBbslAjswB5xJ)a$bX)^;`FZsht{Z?n-{Sgs zXN+R^hwV$yirp7`@L*S2!)5wfS>BYg!1Oam<$ppl*6ea-z*y??`r!*ncu0*|i@gg1 z%N&3Y!0_}h@EqmZ7r*Sj56!kgd?vi6_5R+Q(SJx#z1V%EQRaK}Lggyxu*~Clu}KJo z2oXpW*|QqtD`UmRYNI7hQ;H`NR)W{5v@cJSOp|D+_0!-g7Y}z9$G2o9? zg&h$7ドルgrV!z_zqWZ0%G=YrG^T>bYg&lP!+GDS2$^O19cu7qZNTEBv3^eJK;T4}A=olF&M~OmnQY;I| z?Ta7?nn(9|BG`{Wk?Vn+j}fwzVT%@167PEKdhGEW>xT4U0H06}yyCcOZ}nRfq$}U@ zDA(9hXmJ!}^9##XY0c2UYNxrajvh6R+y0ee=5%s4#=MUs)-Amo@d7IGzjvyjL(NaT z^q*y^JsN#8EBIm|%nyxGab{?o6!)}vXO^HrQWZsy6Q42#K~z$F8{98JO4T>!{UugM z=OK_=$^s1gf5OWk`CvTT<)nylor2t@dhyyf&!3)2-w+j(9tfa-nh>{!glEVe+sB%M zNSZvEf~HejHRix?82^Od`O>yzhL8u5b_F;BWon_3d30I=mWU4NIyAf-a5(JrmxTW*?-SV$ZmWKJ%nP{#Dnp2$`5D=gui!0X!eeo5x@Pnlrn75vT@mYi z1iZ~BMjDyz^6`Ss>0+;7>gp2Mz-J+91(u5K$Y(l!7nGxj@JT%D4Svi@jNZW7Lf?q; z1}^|EJLdNS@QEf>Qsd-St$fas5q^%?V}*APzeRU(;1$F^=GmOA>>8=kmO}!mjGgue zIeJ-Lf;8uE*$z?llcw^}1z!4K8a7;eqemV_=BhyMyVNVA|h> zTQ@rKf;MXAFOMny#F3}WURmZFGcc#)!cTlGCK7dXS7Vz43(|!kXv1cWn&mm8H1uGXY_n}=aeA~?ZjtjJ!m zGeyKBlJBL?85WSt2Xo*Ex{H7+*nj#Rh3T%Qs4lj%kDFmv4f89@TX2d z(gXLwT=#$fWe)KEHx?MH{#X1mhyT%l|Br|I-!gJoh5!3h|GyeJE*=a9^9wZOlg=-& Y-}L`!Fx~16Kf+RwRgo!@G70+s0CI6Ne*gdg literal 26891 zcmeEu^;=bI*R^anNQfYUfCy}mMo9$$X_1m{1*8O#ZfPk643L!W4(SwBLJ8^a?hq-Z zcOUhB>|#~fqK9i*%%O^AO5|IC>)gt9VsRnMG3!Jkq1xH#}P z5?{IzBYRg|{h9to0$!Dd+UYlM1|E%Ulfe4{p~L~o43C3N zG*$eGr2=>uN`ph0R9M0o2w9})2_szDF49Xf1n4)O9u)racC)E;uXXuR+9h%nzjq+q zbyUS^rjS(rLwKrg&}Mjg%KP+WhznQj42t;q88k*2?L$b6e~0|<|d3_xc6zvt^0^cx z>z@yZ6{F!Fum0yBF{ICMFz_Md%eacqF9l40fAa4~w_d=6;tEVt{`suWG<@+(ob_ax zw@eda`TO!e?2w@Q=i6WKFr>b`Y1rt$Py0-T!o{|!hz*eVXHdSE#8}W~_Xz$O!*hOk z)THGtf&dsUd>zgFTp73X_2qvDWrK?${W$XUGX8&tbtZ*4p7O@O!<-}*v|i9oagms@ zaS+F!k)XTH`{3W%f24b^yk(lF!}8BKFt@S%C2UR0kad9GTotBs{HR-*rIU% zZ^Hk#!~b`r|L+b%toi>vXnp>4`p05tu>;8y-|J8IA3m(M&#)@`f>W^&^>Flp(7M5` zr~O5q`y=O+iJyyML4>9`hbxBpfOlQ5ra#ebm6b}=>to$^8~c9J>9JYe+Kor`AK@D< zih?T)LTmY@`MTBit{pF%#giEzZieChoT5A96VI^q=jg}7sd`VVE1O@DkDa6SFi7(La}e8QQ-84N{Ii+-VU}Wo<P#*X=|ayuWE4_U6j1 zwoJu@Rgv1CU#T8;B?=c<3>5}FU=Q~Zy9x=$PTBN4Oz$#^*YvwB^BFY1;gpv&SMYM|=Dt?1y$m2Ae-O#0VL9LOPVuGz@s@Fyge0gF2^I4+1^|Oz>PX;)urcv&TF=qMqV|e%s8_+J1KH``u$e-Ju zFLh|q+wq^@a~tPNy}E22xqWT9Cr$dER{q*+pR?yiP2;Rg`?8cO&l26?N}KBuK$j?- zNeSJcHt>Ln-tS?Um;o88J(;Qo8f=ZocgW(PLZplf9t=&!c@lgU`>k zznOC3HpxOVX14n3dj?H^EqTsc@9cWj+}q4}JTf-*!2BP*j=P;gKZfB%{19O)?ya($ z>%BS0OWYy=2PS@uhv_^PZs2G5#5w>SS`iP0GRbih>-q!J+Lg?>e8a{U7WN!X!sovF ziDkla@F=|h14C=UTh2ZWljpFT2@(96ドル$K-D#L+nSYs%XuoLQ;D_^klbLp4KPT9ドル(Z zZN^VlC{V;Lq&|`t1e#2{60Jgn_unVDZ&t@#$y7hdR3z&ZSh}jlaqc|o;2uogMySmV z6S{4F4l#%vo2ty;qvorm;X zVhV{OoVc^~+&9Xdzfrq1#kSKeUp=^kZh*)6GfE4=&aYjyp2hYi~en;}vIp5pU=1M!pG0HTORUOL`(W zWUg+@DK9PCZ&aS|%{W^B=(@B1{OkqW21yi-pP0x+F_!s0>yjuZTo2f_{mt4Ru~1ドルu z8}`4^dJo^DvYNj-ldF+u>i(n7Wx7(8%PizMJ}+x=SpD}shZ-aVecSwW>Q%cKYoSZW zN*2|-bFm*H2UYZM*_1H1MK0X=OMvY}Hkd5z(38*R2wh0;nD;V-_dSr!Gicqrx=_ zhC`%gvcm6-N|O$$INGf3GX4I(*woUsEU)Gf1f2Y*1G$^oIeep^`Gzt5zG}?)V>X}aR?Oi1 z-G%d~RJ*eBV6iLd$Dip>zh_^)6@yTsn?1&w6>s#C+F3hDoq@tpN!Wf~hJ2POJbQT{ zFS^`ntfFb(1LJ_6_h6yZ+VZZU5B=~3mQmuBzybg6O5ZoUb~?!y!#}^#+Q>(9IL*9s z^YX>V5%zOh?JxHHH8G^;WJuh?4A;?PRDozHmGezI=cn-kk1?yt^0mU+&cdqM;BJP@ z`!TZ(^AT^gGV=nz_?>(CM*?5?V%HTpT#x+`v$a6fiF=T5>itJ8hej8klHhI2EBE`Q zk}BSwLBoRmSbrx?Q(W(PG#bR5NTJQLd^7KHdz5ppEc1v%moT}boCggm2sv)M`&`v~ z7nOUd8K>Um^#7P}nWAnpuFK}8@%nAJHe8&xlON50l&zAcyDxnGj!y&g*_=~OALV8ドル z?k59zT9xqeiTzGidMiRt3 z%#w_!j$!j9?JC=u2U#d=CA>cn+l;7kNlfH$WzMJn$?~p*+`P3<`* zljYn%Ad81;O1gaQW=$RpiBsMAo}QiT7ドルOtZW>O0Db`ZQg$+<7q+;og1ie~`dwbgi) z-C&t{-|K>72y8C(7q-2XUmsh1sJqNYr}UNSeZX6?rw_(8e6C8p;tld?pvUZ;YA~mi z?L#1{t_x(_PAQwa{7c}VYQ3bLL(w36P%^YUU5Iakj`$qhk*g7u*LYBFe)kh-n)dcH z=SA8^vm!p>XY_eG)<2xxpwj$xt)91knu&!dvc`mdgm92{duie>Up|*jT`F!P{{*K& z9Tg|4+@y!r)y>vbGdTQ29q0VS>XGX`_IB~7TmA92e4a*L)DBfBZ)^j_9FM0RjmOp( zj(pX`?Umd2zusC3`>Jxmr$GYaq){Zooh)>mT8PJhKa0=mx%K7T#2@}A-Jdg+lJt93 zdH1KtB2&f*ro4^{>b4pP2GeE3U%!1ドルM%;24CQ{MDYi)qSclAJW@^{`Y$CTH0abNEo zt(RKubnx>}G_$wSuVfnk^i}l34)D2p6bx(Sn}vm)fHy~ScFj1C^GSz_06~dsF6LV^ zk{>ThU!75vG$wA5M()G-z#ZN2w;xPFe81#dq$OYIoN|-RW=?)hxu7@{kEZ>IER#IRDa(MRD zSIiOsNpXs4vLo)Yg1*hJUahm!f=B7&8uFo&D!Ge!&P{_4ZK&JT8E}GYnY5EAx{IIL z4WaG4i%n4x9?}4Eo)$bPFM$O4*eKBG=+0_(+BmCkm_4icB^)0Q#^=f{LkS&ePOOxj zaLSi7%bxw5RkqtynN?P7ドルEoQiE6z-y5;Lede#<9vhs=!ry`_orrw0lt49?&;et|b_ z)Q+L-`x(7G{FBd&)yIk_y++F|mKyATjXNkUsmJ_?H}+}61i?#W)(5$YNwFgT)a~}l z>-8`(Hnmo;9)!t}uCd*n2@_w>`%ureA1jvfzB%S8E-Cqgs^-fN(J>N}o_yuB4~91? zr#5?C&3fnW=2#FdxO4~k+H)EZx0oSIKRIznCvKbKHMJ05L6cmt&Cu9scZ%eMlg}hh zWIg{AMQ^%+vAju4wOhkw~d3Pxt@lx8|Sb6+c{TyG%Ybj)#f^1r%hRcDY8)G(IT7Tz3inI4Ddh)XGsuY;rh zx6u(G)d?{Y`_a526&}F&4!&~`UTsfUZTwVUw)128J?DfIR=@7}wovWS_DdSKYB&>5XDib!-#qZ} zN0)sFe!DXCVJcQ%N%X`~?Ma>@mK=$Nec}LK17MboKQSeV!tM`3XoTtGS@py*{6N;& z8z+5CSn$WYG#=+&YT9vM^xUlp_I4_L-)R8yF3tXq0V(_)kGu|=>!@>|8YsK3=49#4 zGJ9gJm|b^8J6^#&!e(4ydvf&S)2EH{A^pvCxhz?^$uf@v`*53}R2GrL<+nm0s|>OO z%FER%1^DMtBCw0UtJVa{Or-?k-BxopR}H?u=k_rxbnId~$=j{5zZ))@c6@2K3kr@A zJ>jeNEp$Fdkq#M)q|W+2=hDTWph(V;H~>Q8)Y!i}kp84U`yK0f%{?kPK_6UU?kf@) zX=G9+X&woSO+lA7e$R!tkkRisD68?%F9?NROOv=lX2$tVGJ)mzaP7nXa#~1@oWHn2 z;*Ud;R!zZ`aab`j{9Q7n|341_>o53@~#vx8Kk>{@3o~go|@j=0M-MJ9N z#O1zk`Rgm^52q7xqNhOQRT7wmOFo?Y`li79^iOAu$`COLE(vj)3UR;V=|r)y^wJu} z8~eHop6#26TK8|?=Ya1De94>U&yZXs6Ckabuic|Z=FeRx%!XYyiTU=1YRQAzZEtnq zDixXghb94W1!j_516QbGs*Wt+DJ=w zRsx&MRhE~&Bn(z%J@-0)h#T6h3cY4!Ps7)!1HiJ`a;04l1r=YSke;d!^T})RGf-6~ z`dqz+nL;s2tG-XW)7|*K$+sT8yP%&TM<%rr-dj}wo{msfg*ta!*m;zxblU8Zvr}6COJq&W(ip^Fy=Rgy>#|=e)+T zXUu6teIDA>4b-^&*up^%1tf-UZVqPOk~&*APfgeer{Z` z=a-P3X6}YMy%uoa1RGD}y@NOWlSO=1qg5ygHmQPCb-6+R1zMkX*Q9H1PRVU%jAH&X zy|XAmrg|v)#^oMVSgt(fSO1_d92Pm@x|A?j@Q{Bfx{zA^_LDfPilB5GL0K9s#!l59 zuE=PwgN5jDesNQ@&vlaNRk~MOl!Bh98n@77ドル**D2R<*b%wvq&`7af`%z7g67at$ti zq;FZescDjX=(8{407dDPbhBl#SJ>Jp>5_{hUUgrjy1!ScSg}FO62s z$SzNByddWod_Q;9SY$cFUersm%?Qtc$E;Q0)`|9pJo@5xsbk zE=rZe=hL6VcBnJg6f<^taj+orjj2-z6kf;{c{rigdrearu|#uzzw0j*qyfm1hi1n1 z72Y3iOt`bW`#h|Nakg!Y$g*y4a39LZTGjdAY4aO=rA5T(Efrj>H%zT`$2ドルQxo_5oY z*o829vNC|8wQ7D{qNn2nrV!Ocbu&H(ld+Ei%9-Cjw5gnMZq*^?ZN1_n{A;{V-EloF zM1<$>oj!%^KP}s0jw088mO@C$(-gohvfXk`pzbnLk{+rpJmnJ0LR&Yoq<=4m9m?j@ zNkzL2X6^>pH-28MzM+8uAf?s{Km2!w_VLfd=3WDV0|f_uE$ocF$F2LKV`%j)`G8N5 z$ftw74M7f&@G--@#LK>F3-rYVK2rXXkG>GcP^07s3U{X~$L-r=NoQ7er61zX6JU9e zZa-!gekk3Ssjv}1u5atzz4wyZPpk&*$mRqH&R!ytLuPb|8i3@amH8jeCxE$~w_BOx z8b%NRJ7)Ci#Z9l@wok9ZpwhLyQ@uw{g2~)XtD>M9^XjCG=^lJZb60axJfu_Hq7z15)l)93< zZ~Qd=QDrj@oc5@Sw7dY1&%G9#7H`fe+X2xocAdVKi52cJYvjAqIB z+uL$L%cGn1N1OhgVde`|SbBEUwx6*!W99!II^^8@pjB<0aoyy+u(?g`%|lgcu`xq0 zk{VIZ)9i2_Hazz~L%?7~9wZ1lp&!yXUC<#nyfxn)y!^$XKWFLTy`rF=GtZK0K@}>_`wA z3dm%=OXw#yjz+5PheZZHo`)-0nMvHZzZF4LJGvB_yhlVW*gslfWx@7+r{Vj^sQH)63WNtGWlhE!@U2;0$&9-*|n+ zObda+_(MrdVlb&K(4|}a+(^8D0|^g%=FBx8=Z(=3*iTD8973J}uh0MeENbwR+ul>H z-zyMOcm;SXp7hXTl^WsKlT<+l-fpdss%hrc^&`n`km=euiim~bsr3j2@#j4yk!j6~ z+wFMoFRE?Dh$V@5<~ubpiz!-i0oypky)ud5(@1b8e|ehhcc4nhjk0`or)IK7#Y1lF2Ba{7cWEVz{qZ zj?g(k^$D%*7y{qPhZM&ypXYvRh`4P{f7yKRGF)Ux6K=2~OJDTtr;!VF1t64Btw)}b z={elwxF!Mc2KHe}3ドルMphn{O2MAqb4>yKi8V;xhPt{_*M5noXvnl__qR*8BKfpa3@> zu1Pq2A#PWg<|x0kvxguxqnd0ドルou~hn&yg_gm)>xhWRHXG3ZrKHqlM^4`4R#6vhnl| z|5Njl`mFS2jR7lUPGwz{0*K<8{&|!vj!xpxpc^5s5soqi{onawr58fjo>g6|AOby$ zyKR>$ZJGI9_|QKc)azbt?u4 z|D}l#*Nt+Ep$eBN&!NL#KWv~1mHnQ^dlfCGBsL-uc`N22?&tq_0m{^}6geDNaIlhq z;`W4ドルp%@Y|_0xSeAgrZ+YS7TBz#POfEW*Q5e)&`v?U6*2z+wkw0=0;sc9+Mx< zzT(td&WG4 z*ZpV0h8q*LE-tc>w;SGI@k!pjXE2bfQE{*s2b$Bu{c>6^+~4;hEbMHWJ=>6vx^9<+ z2jDmw5tlfucyWAm>54#;idAg#I@#0uyFGv~ww#uXwSSRm>CWJbBzPUJ?DwlFHFMER zieUs%26ドルQ1L*#Gq-3nwq11PY$=QfYDQ^B#QKGzhGDMc`g8ドルv_NQ} zmz0%eMP((ruAtO1?-zf4LseVE z)10JLs7onG+#-u2!6P969WLqxy}+5dq%g0MiafV@SU+{RzEf#J@Vi)7opX&A1+*ZP^o5zprtZp%BB3vU$S z_{xJWF@NP{NfUzLu+A`=RH6As*ixf;_#Pqw3Y}xbo4(f z-n6Dj-G}5YIIl@k<3bbs7%x<=b8c={8%hjz4dh_k*e*#?zxzojgo$}edbwo%)mwf= zmJn`}k^yK76~GG(BU0A?+DQMk&7luTPV2)x7j93VL1+>B^_W6Ts2++0p9BvCE!$Lx z*qkxe&3ドル(YUg)E&8J`hgzK2X^`5zM>X!3kQ~-@bc&kz!R4tsG~d>U`6bPuIV~_ z(67sv4xw@GSCJk8lJ%b_d!p=3Bd*Qm>y*YDU&FzoMQ-ExUf|$I%Ml)z*ksj@oFBJ* zZ-Jzcnz(|4YQ@+B=~&y{0SYCVymk z_S}Us1Z~i`uNULGr4!&Xggi$}3>E4n$RJ4j-`Vx)?!f7?fZ*d?_YvZ;CM2bs?&$*P zFj+CJ3vApVLRe_oU-|FS#af6UbScP{NCh(LM*WMNl>AQDW|63PJ?o06E&R@nN z3pfM@HbFVm0N?->JlaNx#=Z_D(R75rMiO96pFbkQm?+)!6SKakyssj>Q{&c6h6c0) zx7TCrXXsjiTGrc+B+)6FXVX|~KtZQqdGSm4vZQcm481?yhaVOaku z3>U3vVvQ+p7BBB`oZ@Y-n5uAbz&GpH1O-zKsuBc8-FW| z(Sabn9x8dE_+O#kWdY!D`9gd27+{12#UcDtMHv~F&2d+S#a{m#;VWVoQV2sVmeqaB zSxH{@jLCa1w}8*BK#T?_DeO-Gr6km9-u^x9R{$LKV3nQmuOvn$RsG4svu=RtmO2|^ zSkZFgVi~=R{y;#kis)tDr_^GE$~Y>6E$$DZ2LjP=3Ds%ao z>mx8td?qc#RKjk%f~QV>3j9u}X#lErsWY(B`fI#k3b4~Ue|RmMwBs9%dwz~6BCm-B zHL8!VBSl5KYKskc4f0hpj>_Tqh3@j+Z&x?k?0gwS6yPv&;%k|E!mGJpfX6 z=QU~j&zR@+-_?4AAkI2H+B%#FY*2UB^Oamla;nP;2MQA?Zw<%+x)as(iv`#e`|yw6 zu{k~++gprP6s$a@3#@|^zo{S-xnn|d`PZcT2X@vs;+P@4WgSfhzjdUx0RVgJn!IXy zs8@)|wR^8^JKw_S|FJ9-bjL4fLmp;#2h=+5twQ|*$rpShCgEk8S>XXR!fwM59Df|n zOy0T?e^c>{53JVrlfstykI&!>rjD8<^f|fcoivkiizb+fl2ijs@i5sxql>#&mMw zC5Lv==Y3EGsBYUPvkurtI8S;0Dmd_Co5Bu|H6m`gg~E4H-)1;iM5@a{2ua#e$$bO~ zMlALcL2(rzz-fPdOpJRMTnEHtt=D(2P5D9|9fgd(JgJV@PsX0+74Yy}65vfll0WR6 z;D@dL^1JtN($sKGo{Qyb%GNq>SOUJKq)7SAp{AkLb$jl0dFnNz1hk(xh5=5fjIHdG z!DR8Xaool)Ude@CGRj=ze3Fl_bBL5($l$iW9)mvr9Sg-sB9jojQT&aD<5ya4M;8-^NXa9*vu zi#hR`(bYyC9JIux-!NWX?$QkT=o*i6Bf(-a0xE19JLA<3k{@2aap$u!2u*wve9ib= zZQ>G)375(Kn+BrlUjeeMzJ$F{b2=ZcBsUeRB!MA7AMUN0Q42YjrM(qw%T$Pq3ZOi; zX+acEJ+im|me2W}0bl5pAHY%S4U_9$Ld+V`JJVmOY#e(CM~V<8du^`b1q@1ro3mot zZbb0&$?3>Qb&)&UrLCE)j~WNG9&K!gv54XUsDUD-B|wjjOS&#-*~PBa6ドル+n7R)w3g-E36kIV+pkcFdZ z!6TLsSHB1a6$O-ZtPo`u(ve;SGmSZVzABr=4?GY34=SyxpSrQV%?y=0m|J71ドルqXnw zVv}4Z>DM6b9tjdk1}=hf>YHsSI6aq>UsCf#Ch2=0&(|ebsd4Ars2FY_3sH5Jag8!2 zmLb6!u=x$FncfKrnK}MbK?P-2^8}`4v;vtXqMSun$>Mc3_%meDzf|{=%JM_7Ge|$X z)NEX$j27?2l>ht&GZ0t*_sB>^%2mVzq{XOoLEkWM!5o!ymuJ3&2pI<#mwetp=m`yz z!HD}rJn4#;B6PSlN@oxaV#q7_H{Lapn-$x)A>fE8KJkFuBA(f3Mi)wktc(E>{}Z;d z)w*Ak4&G0EM^^{(^hTCB^lIK4weQ{AfhS}!lB(xyL!z)v9EVcHrJMDqEBI!fhf%FG zS(JA0IRw3JcwczLaQ+1$)nc1e7bL;=$g83e+M#M0hcdx_k106Hej+8R^!~#~ z+ictECFO$KM8<;m^gcc-w+ihbf_3p~apjstpfdjk-mw{wpex79h{5hyali;yb}dt` zh^b)9nd^g9=ICH4sqc#9CkKbc@7w~?xiz`=m}QqIpyd*c+eGZ(-?>eQA@+q=q0209 zz9agK@RY}Ab{zyWg@#}O#_+K9DAOJGxS%l1)B2DIfMW>PY8Tu@Qy*L-@GZF zQhO+%7v8OTPb$br;8yPKSVe5#*oGjDL%l3~0H9*M0Q|!0B~L{~1x#AG*@N9XSOR=E zwITM}@bhbwG+{y+P{HTJyd~5H2ps9Nh#%u&3y`ms(Py_7s}5bR5$V505BCB}C-pc?oiEI$oDc!Pq4$a|dAym>VKz1ドル{a}C9IH;G>5o93WUJpi@91KtfgsO(~+W6 zPqd|4Wrzs4ドルZP6|f+6+!u+?-H6zYEu?&OQAusgNR>Jswk3l*b`!=O+nZWq*PyGq5K-*Jp)COOHNlL3Ruzqnf6If z@7OD-YLdKbv^R?`XDB~|l)V9kzWs$ahy*yy+5^yzZVRf&k&I~lr}#GpORx0L-@U#h zg@+?>FZWEGVs}G4L;6=u+Es@Jf4o6})X8eIJH&wruyxM!Gw1qgS*Z733g1(Bb2USG zd9tq7y>WJf<+#3=#{srlqhi?hmw2@wa6~(kmg+*kq-jJ1Eu@++|LF6k`@5##{*>9j|Z$t5a zsx~mje5}}ess1fj{013Op>wYA#mtao<84=5g-k#tol3e-ntkjs1fa+khv>;}ID6(G zR3erN0d{o6fiP*}!ga6TfNFFvRVMh4;^!Pq6*Vx{-lUvhM&-m38OC2po91ドルNCR+NK z9eYu51cu5Eg-vyd+Nr3Lz=hRZF>gop0FJm!+tSKOxAuS##K1NZk8dn#P=_WxNS^ab zaH|8XpYma}!6@p{JAAoTb)y;pUWT=))Mz7Eus~{8x3h{M9aHPDy?edgZ37CyiW5ai zxvHrA)$H{>*lU^+@>p?<$lr3chg1(cu6sa|qq@;dl`er(w?m~r0j@pm*zkf@4-2es zYBGfbt^JjLTEPI%oEEilrbp)(y$&G`={ncQb5t{IvU1U&QI~!%#@XoR{sjJiP~dDk z>+K6dJKuTrA_vc2xcxaOph$yx?mfG)STYO5tE(Oy^Pw4{f+bL}R-L!A8wF@(O>}4L zxqR782$H;T_He(d zoAN(?HU?$oI%voa<(fr<1pg1-i6d^_lgdX|n_N@6t*l1$_w*Kjl@f9{nSn3~&7;*8XioI$?Il z_laO7k!8jWwq<#otuzn1$cx+zh;3ujt%0=_h{j05w7q$w4e5c+2styel9l&y84(th z+=XKe3i;M|7ZHQdZ$QZfHdFPRXtAM-tZGjk4oWR86L|C<)!rjdg3ejwj?@(o*qlxbrhcr_s=;60eo6upvufmf(n%;p$?et z2@(-s)gNmZ>1R2ドル!PUyT+41{4x&+zwTe~ro+BWyV2I~0OQmq0eTr;cCc3x|1Lnd_^ zZjEzLoa3V-nAMm(XPpT`04qc`E1v3UU6IRGhp~OXAFEFnDu%)?Wkm!s3&ktoxBS5) z1mU5PfwW;5+`JP%a_(!ndmirM^$}WOhzS6ATz@}D%@ElwDO;G|9xH2!MLk{$V z#IHrTJzZ7TG!78vEkKNIqtxr1V;gb#$}cu2d^-T`HF-o3BY`-OnJrA`W}YZsmDf8U zRL#OCA*i{hoXYfAO?^0O(~y7MRx(dH#kclBx2)gCIt|$pkVh;`lfz#?f!=j;8pCV$ zpw4Zt_dT@&U8oQmk%6ze@akwuv1UX*c;MVjrZo&VE?VgM`y8Zq$F*Xh?U-q)k%iz^ z>k1p0nLd}#{lpYw0b=b}&lTq#rIKrya=O3X6ドルOI|UXNYRwZ9zI$A#m=0ERIJbN=3V zdGU~^1IB@E;8rl)b_g|&j=!R&Kc=#$BuXqpkCl+Va#vxG^1_|1#${(sXO5K~u zew~`RLkzE`OJ*#W1=?SC16w1D{c2;vX1vCjxQ$RvDpD`^ZM@wlmbv2-@gc;2`|?A} zcRvq+Mc*kb$+-Rydy1!C1_wwsup*CFI58Kbb0S6BDP3Eizwfoym*O^BZERWV_E368 zKKF1X9Y`kqE}r1iXP8=aKj1-|x|$Rn@Gk#4t^=QVoY?iy#vtgOv^}P%pNeQEEGAh# zNtQnJutC%LEBPZ2?!lZK>vlZm_-V9g&%NSQvmzsi0Nc|&%8rsJhkFxp5x68O;;#Q(4}!2U|qZ>_>h1KKJ#!Q*8KOK0-R!+(x#$>&b#oD80P zm5D!P29nR6d3Ixct9vG4Rdr8YId)nBlWJ%8mU3;T|NG7@!;DSv}aMK?w_ zW>eKEE7n{-K)#Jx;#)e*_04C*24^1vX7uLAw>qL&)p85z)LARQqQ+4!h~rZQ_-K}i z=I66u>u2EBGd{VN8XQ@>Q4vQFtuFPExAXS3S&bfQbcwtec4GbMA9t-|S-jQ~bMR(6 zGZW-Wri|V|9CdtIjl(p+h0SkedPCXGvGmar#0O0%=!P}Zi0?lRyQa&-H-Db=5*FSx zn04cx3TCUCklbgcA|YV=?Tm1)z{Z4g-B_H)g9~%PrYw~TA%L`WO@TBh{xF~HccBE5 z!JQ%Eu`~0J#kUfaV5)b!2Iis{(< ztq@D!b5El$;pzCjDwFXhO3n)?!O>{Z&k)DW8ebBH7`Lc~r1TC6>L?dnj(kVUXQ`bt zwk?k953DP$JV*NmFrwCLy&12Ns2=&EGwLEo%#H2WajdAry51jJOb%h`yuT1HSx^92 z8*jWbVoE6Q;fsOu+&UgjVwSP|0(vCk?3=QB>!XHQ&eCFZdCn@Y@Z_O)kJ9@}fOBzE zpj^&Z%ntmLrIfT;NEf01V5Wx+^->(82G5A0kNe_9rZfSj+otgp5{{TJ9hqyxc>Vc0 zeIh5jYFflk!H*c^dE9#;drKkVddrOJz>P?GY(Ft3I2%0Tw;Da!YG$Ckbo!N5Bi&H} zV~3W4<7`}(y85ds^;`g4>+d+IpGZ%H1b>#j4k8(+^PrB|NZ`e5sWiTSFb0s!-Em1L zl0RazY5$e}O!xienM~Q=%UnT={GLAR5?lmHyh<%vw+kq5mmOA#Ac z2@erYhY|uNMzu7GktBRyXD-6h+>ek?rhgqT`hLGNR}3*aBKq!u>}+-%iILlyRqCuQ z34t6%WWhL_%7>soVd4(eUrf3J$ zl{o@*OM&dHwFsp3`u*iW*%L!BiFcMWa!sM(XfxQV1;>W*G=W;u1)R$zm)IgO0y5e! z!gTB(zE@|(LyTydoDTzN`JQwqM-+tZ68ドルm6ドル&?Vj!Dvoa;%Zw1l$kF9KT^AKS7>)(J85qz9U!12TNjD!9fgm*4&1)-zLTYDK)xTt=^nba2Gj942VJn%aLw~xZD?*D z=5ドルEg%_BMj0Xc``00%cNL!{WZx6}#;vg*WgUVH~8ZS!o!TR?P-AZ~cD`*me46i1zh zQq6?IR&e4J{ub)P6&(%kO)z}j&#KKYQwWgPw{K<43O(XTLykKD$zuMif z!975z4?t+soyjBQALp8iYIWm5?44NIDo#1eFDweHzfQy{Cf*UqwKm?6w&BTDpi`5e z2uOkgkRD3_Z%tmkvr+C{Vn`H?;@bJ^acO-hl6=2Bu8B#dnlCtpY!chswpatPVom7% z)Q*w0^2H{|hXyId>nuC$IKcFP%;doY0RrE)T79+RCIw#fbwWmw za6%M>gS4C%!T1tzGTEurTH4;TWfX*CpX|U3oQH^kW@>NKrMOv*JYk$lil1fZ7=VbG zmad%?%8bHV&R_n;+`YW-mu@3vhPf$Ri5kZwgdK4(5@$XS4IB2%1o-A(F`*z$$PAYz zFXK#5YUZdmXXtlSZZS46UfTc6O)Z_Qm>|gK{l`P?XE`V$!$NG^8r`>=pn$U^q~dcl zG6W1ドル>+M+r4y0+oQ0YY~73num_`5MU1))VF8KTq;jD2P@L_L>=9s3j%T;(H5(?QAT zAqqV!%!V()Ob{I0or7>wc)m!mNj4MfA#CHt{4h>nLcCjev3ibbbh%ZOF!p@CRwvrIz zzcaZ1>5?n;5F`tybpCif=Mlye#Y^L7XTtC%uXbe)R@yvb?gUO))g7|G@I!EuAw-Xm zPPfL4;Y;epLOQUH;8H0;7$+(D8EoAhy@XA!Yk=f@3Dd|C^YjKr#P# z&9Df?Oqj^J{q_(Gr#G3NnmCKpRm0P3TTo?HS>Q_f_kVaa6%=4qF@ke95rLWpjqbb4 zGhrXgp7b=_3!zDPPT9=fZMBF%jUYBijc7C2__jUY17yn=JT)EvQm*CSrshpu|KkO?H4~=eg)2e0BUn&O3Zvtz`F+zaja~l`2IFLGpe~3}${j!BPU6={vTs%Kxox5F(5hc3r4Le;@ zRhe_VjcAsAm=zyN9v8fI;d89isdD5sa8u zSXY0KQ(9S1@+0)zyiHKN41G^gS{5eUh(EEVH#~Xy1?X1;Fc*C=a~VgOzWZoMMlWdk zouYO=Ogz$h^RiBOdJvh%2U zR@Do$`1gR4j8J;E6bs=t<5k5pg}ninhefepa}ezv426k1jlel?6qjrq27hmd+c>=J zXo~h&XaU=7Y5=3j-)4{@;`y{dY)?x+c$DPHCm+&@Eim4XDDY31Ams67)6jJ~fGhid z=G)ij<1nnaTzZp5g3fd+*jl-PgxYoW zrjKLxn)R8PFmBO^#0yzZ&PfUDIt^$HW+~AsvEHp*2h`b-aD7=$gZUN-0VDtm$FtpP zgUH10O@TyACE{`0J6>)YaKU$?%$JR<-od!`=p9^8k5=0jpz~rd{%f4-=teeh8&h6* zLOPqp{u#DYgUtKKXEY=avk;{B)^dV(1!)~CKkN<)^`lju%dtoy zcsI#6Y~Uw0w>2{hx60_5;BI?rADY@>m8DQ6?H>2*SW!ucpLoXYNx~iba?qgi1SuBS7h!`JE%GfIB-5xWDgnsrtwkFz|hdClB%~!FVE$ z1>&&Uy34XF_sIFLE1V1EFOM_VoF&iHoukIQHdgsz;$QVHjA|>W40jnV#!P^Ck3miV zaJcZ0#S&>RMq0tZ@j!C~?P`5jcn7r2XFh!THw=?uA}-@St6c>LvCs z1efFCWWsNUq&`ClCiF%}buCQHd5O#?F&1;#&EAc!R$(SUItOFTmv<3q1a|_hndp5e z>J2Q9Fkd z2i$=3Kax|aK(=3^Q4EkWn!zLHpiHE`aVjk~xeYREj#bsni_9a3_{mvsL8K#|nM6JI zK~ACuvyrDW2%a&2v_5%xE=^%*{UcV=B?O*E>}hJ%3Nosm1kK*RB*x6s= zjJCLF?(&O1MWHvTyy9O9mUbX(dNgv5Syfd%dX8>tyvR8}6Y zKmrac5916M=-^s0TFm#PV%P#!S7kLkio@XO$eEHJUc&#RN)Z*GS@?0gt^1^V%Nvaw zJ#Q`({aH;(c;U|M0w=>Ky6ZydrbhwQ!6k@%VhxmenY`u{^o(`BD`v@4&k18UBD<-} zD^yk@#3n%}dF+IC{?7faDpkq8Q^kn*`V}}U_ZoYK^dq|Nx+(z3esoX!7~P~_e@|)z zapF=7ItE&*0uA^A(!y6gCDIC{4ST`t^Pm#sz!YYNjHtbHvJ2_O%ec#bR63uuWoK13 zLRW@xP3H>h54?ClkbFi>xbE}sq{qo|FLPo^3A50tszl|mL@>%nX@kO^Kr3memTd|B zR&xQN#%Xk2k3UIZFaT35Rat!at&SZP82qmq|``)jdsE@&?n$PPW&q^e;UUZ)@VdsP%9vP6cUA`?J>Wzw`gc+N@ zu&DpV7UCKyshQaij%v24=(y}XsJA?&4lSA^e}h8ドルN6Pf6`;X^j(2-C4GrZW~ zi|;K)4JYPIBNlB_Tw;zG%EE*3H82mX@SJ7KsCk=K{0uL!Za+C0EJjWG-~=6Jvi~*V zLLT$-@o1U(U2)P<0^eq=tbqvfnokd{ya(szrf?!-bm|wvygy+bxdw5b9u6u}y~yli z!D=@p4f`Jc0k_uGsk`4T0p(TxH70O_-&z+?{5PWn>B93blml(EynfG|`<0pcadbi% zyXSV44l=(eoBF-PZ7UVaKaxbk5jO4eyKd?Z;#tqJ6%2Dpi0#Jybs}02=Am_S*-OEo z@J%?ODdZ(Q?-l8UEdb5ドルNz`Uy4TM>5fLS3-oOZovss@;b3*{ZL|hYS6^k{|-CEozKo?zf9x|PURIeCS|D;T~qX7+FWd2~g(y+cSsAL)= zXRl!^kbBt`%v(`z0Wgm&LdensPn3lQyp=i5YlIERkAmsb4Ed3VoTG4q2;1vVYG`EZ z#3E|05sAPM48qAKz_mzTCBd6yh7T*=me_Uc3#Q_RxV|{2kX4d51?2`t}O(-DKBU*L5RBHNF{wGlS1< z_X!xORi@>V!A-=kXGVH6vOsgybKM)j!o@p;Is79azz^f$Tz5wYANr9tTQX2sS1(-d z6D=NR2;FuRoqNr@4tMff8S)$oq$S%1=nT z`W6O}&nLlKC#iJr55C|^Ep$zz9tox6bToaG;AHtiD4-(a;6OThZK+wr^Ke*0OD_^U zazv71#a(jqJcbSaByo9sO<;js+viohxgkiu@xrlb(?pk98cb|n#i_{1dw#vogwx2j zVt?31YfC!?*t0Q3wxgVUFfO_ZdDyhf8$IvKg6|Lut6ドルN5x z%1>Fw*n*LmfwTgqp>=Ey6}Vy=f9wmoSyJ1X^F6jwDk#R%0O!DcSf!Q3Dw66~u+k;f@O6-=IZJ$waT!Qbx!{Ekmmh=wW>(PLJdGk;B$aUsnp_^h%qCQJz`v8a z5kD!%&<)adep(f%9qp76-lqg_$yjmy7)wfsg}l#w&)er$uvo>uy9S}1>O(2e(q(b$ zUFkM7W?V_9;uL8Ql4!9~WSxIYEi?+%5fuog0gTCNSEcAk`I=kU3G?bdr`^OOsr$l0 zW@Xq%TL5jb_XMtbO5GPbVm737$!G|Sepfny$ck%s&uakoI5>xWD*>04Agz!VV6_dn z*6>CHjy@J%16O{soTjH#bBW$}Bp!WLZIUu>EUQZ+njZhsI1d zBKvc;DCG9(q2n|L4YnV%Hiy(Zf7+Hpnw7-7IV0OslUH1H%I#+P4y2cNlaptXl#e+u zq$rUT!OdJi6Bf73I^%D7;bYa#%+cYcZ)=iT7p9#yRL@IZP%+{~q|~&cclEV*9d(YL zKgC+^mo`#Nz3?jOd2crPUWJJBx;FVc(r8xC%I!(`g(AlSIsq#Q7E)P*pR>&z*7~Or zXS%u75q{dEF8CD-rOb>4wiJJMd>M_U@U-?vbg-a8Hngs=3fsgx19R~~?am9efZHyZ zVQp43{(w)L;F0=rWoM-Ymvqk^(9lu7#x!fmm*5o{sf^$nFV$sBa8~mOdnoSzm}IfRN-kG*XO4ドルulMWudP_qRvmEmAxD@rE4CeplP)eQ*|CVgo2Mg_ zsC!&>iQ#h3reEhbo~Spdb~b@dhidE(?SA#jx1RC54T`BTP9aN_ zquz*1%?QwM6sS)964c)kC1QGdfdvAk3%&+KRvMyQbYx3vdBG11+SXAJz6$QC+gCn$ zrCD37YhgW(orDDfebZy^94rn>c$LH-;qD4RAG8TLt~YexQ-~~Oe#i7Aeka3$jI38{6{@?xp9xz5#m`gQq4A zC^&dg5*lKM>_^b{6d@*zE^S7A}gEHJ{VALhIgvC`qN*=qTvB+^@4Fi=MJ6T zmid-BlLH!B3_Dc6p5Uh!!y7#Rhwk`vz<$enng8dtod(g$hkmz|hn*#~4`m_k5sdg9 z)s2#6e|s19Jht!M!x-wqw@6Sgn_@3o^r-?~sj#2?38AYwc3 zvu&u$GbAXg58ty?d_R6=WXA?lHFGz5g=Ybu=2%o(k5cO2v-PnB-#B0NF-KI z$+?m-i+4-5JcZ9Pdudu+)G86~c%+ccEn<|;b0#m|wdsqf1x;h8%7%qe^5yb89dso# z#`1mwv85Naj;F=HFo@2(s17%VCc9b2Vcu8-!zI&DFn;quYE&)-frLk62#XN!ooz_^3>Fcz+c)4oNU zR~b{tG@Xc-REIzC!Fo96oA>{geT37^aMOco+0rAXl2T3ghk|<(a)ng0wlu{4dmatu zhS$C}O~}oG4WnmZ)y7v8J4KVfZtZytoujm@T+EXyTN*r-B^Gc~CJ#&XC?kH>{ofY( z?RKp%zI_4yB9Hp00waX!C!o(w&stQJRMloh$ZBu;2Gsh8o0CBg&EILe&M;xIq2e^< zQj=1qL32~+GfKhSMN&uAq6qlW+q|w;Ij1fyu7EPCX|rzul0TAxcQ52y5SBJFeH=QX zBefK14s-g7Egl&yR)9#y9cJA;%-Lk?gMX$Z*T212@D%rU^FqT9ドルg>R;8ZGU4pLqW> z0D=5KDomK36f8q9J`(=Ia3gOpANnS;F9l10|xm?)Lv^?w=C|gJBVsOio3)(#Y4EvuJ$asuMWf>l@e!j043TqX-{=} z-XmC~w1IfUfT`otKb z)wZP~ovHY%YY_0*&qc`A&lmW^0xi`X%e@*fOA-DR*)m(j<4exghtkwipe|r!xp&}s z?TBsFySeV6qLG@4lRBOQ(Tw?P%PScO{rPUkAE$*4lYzTOSM+yKI`7Z%mgz(1vuYuv zvkw4kG=CZ~!=`+oESZt|BAiP0`heQd^0)o!l^GJ=j}6MKi@OW*nt6!>Ouu37^Gv5C zy4QZG-*Sk@9xX!pqe&saqK>77U@l!Kd-e9A_^ zo31v2J;Hm)Ir6AJ_F`X^r2jb~mNk@{kcB~fR(7}+SG(OsJiqg(sd!F&{$CNU?9Vl{ zhdzaSV=`h^gQCPD?pM!A{XQy;z?uKyM41QBTPQ)F{nly`OJtFmIb%SF;caIOo!QiV zs(1lNk}6w&s{iP}lZYeG@w8XQ$UEk*eM3cY1vOSGRHu~tK!zh!%B`|}$bl!lg%=dM z#p3gop@NMr<_x!dlef;dfu49z(a7g$yfqdgdx9p6n)c?jg6&=33GwdylwUMOqWU;rJAbTv+YN5r*Che51(-Lik4cjZKHfkbk53n!#HO!U@q0L_x{N!1AtkHyGk48 z@6+NPFBfD#%3e>Y&18hcM;V1>p3K*Vbss6llbZ7B>(ZBtB;$>en}KBXaG)0&DLrdg zWgetvtJ08a)Y8pt>?+YLn#%{oykAW(DPNz4uhcLduLdGqe42Op$jR#A6^!=Qr1W#G%Tsv77>Dpy&VI!dg zMeZ)mXrt(U{n1&L867=b;{HPz!D6jsW}#hq)lroNO~jTh-nd2!5A^*A@d9m4km9!? z`;zS@#K>-?EZm@|drJiS`>DqOW{S^Of`)G+5^hph@4u#R-z(R8jn+RnT8GTx3or=3 zCsI^lh9lt1TZjJUSlr35GO!fI(Mbb&4;PQ*M}ErbmnGR8j;bH{P8bgLN|(3{YH24Q z4(Dv;-HD*Q#EzpIB;?gUn;bl*u#k!Bg^DZ1+n1el3iistHg2jXXQP#9^hYdJOB*3fwyD|&Q=tN1rkyQxj9Suvt64hv*NnP;xQiDn%o9|XLu(a}u%Ju2SO zzWhx>AB@m|e$Fixnl5u@F*xH+W@7TKjb*Vn?hcHl73Fv+sk0|fg$Eh@ItIHC(~y9w z-L&8Vhx6&}K_t~ckds+!p0P;LkAz_~SFhDM0ドル$bQ8HkG=oETd_0Bq^6w0rd{(^?*J z^)xay?rGTiGh^kB!}u_X@Jp`dH8F(=f^ACbZYk|cjTj4a(!LD|aUsGhvk6<)&^u_+ zg-{Fh1C&|&PZ%^8%BV{IJBA7>2jlFF@}{gYXcEvaPp;|j$fP~=yKHI3Y_;uv-eZJOoV=gG2m85_hn*`bFn*v|B)B z53AVk(8hp2PpIUARr}|AHyf2Df+!q*D#|$>{ngCAi81Q4V^#aaTQ+`m^JIM-_OJ#s zldvWZs3C||oO8nD^n#FLi7z_l$EjHaeJsoJL;jI6#A=6UY;7}AqO%Yn{&Q%exxQog zV~Y6vRl*zDs8l$xrxs1eEB3~R`cFQgb##18+CGHnW6t|7`twKX^?Vfh6tBaVm5#Zf zb+K0PMa_z6&=8p)K>2ZJ4~DFV(;4o4%tTdfaO0BBO6vH&1?3?Hy!;*1n1)PN;}s%* zbCs=;EI6t6!1YW6R7jaHU7{zPyQ@sRV+n+Nd4w3$i;>=a1a967dS+Pvc7sz(U=cJw zJ%zhnTLmw1ドルVrc1>YW*nZ{VurRMpvip8#&!%)?Fv0QwGWC(2Mp&dRq;*#`jyu%6VT zo#?4TCiPr2i>N(%&0!0?unWlj>Om-LwcJObQ&$k1(cY)z1nW{P&{!8s*|=H@=T(Yb zb>7^WXvWG4;^$<11(es8g(TxX5lM1?3;C;Fpo~-pArmkfZV)R#`St3Rg5J*x@K~KZzm!SUkJ`El)BdnuFpf@azp`rgqe+T#Z##Zn!Ol9qRRP*r zU481A|2bmq1*%h}5voOZOcLv)Sb`YqX3uf)oGygjqACFmQ+*xbV1o_!v?8h;f#RV+b#{r znS9j;A8ZgwAGL&;xuAw^kmmgOP<${seyre$y;C1Owz^zthk^#Mv9kkG$ESe=+Uu2AL;0Q@1~HAd^?OkQ#-CBO^9sT}@P>TS24@ z>$de9<R|jJ2m9|tg-+mbNt`&O z|7VgxoC-M9(IC^*#6N=619ドルNk?s+;HWbz0%e;54UKm6a4{_h_CZ`1mJwM)mZZ}c>N W9=L;3+6JZ@ZLr5W+tgxwDgOtg2ZPlB From 526b902da88bc2d024191866a01dfc36cd110394 Mon Sep 17 00:00:00 2001 From: yanglbme Date: 2023年3月29日 10:36:05 +0800 Subject: [PATCH 02/14] feat: add solutions to lc problem: No.1643 No.1643.Kth Smallest Instructions --- .../1641.Count Sorted Vowel Strings/README.md | 4 +- .../1643.Kth Smallest Instructions/README.md | 136 +++++++++++++++++- .../README_EN.md | 122 +++++++++++++++- .../Solution.cpp | 33 +++++ .../Solution.go | 31 ++++ .../Solution.java | 31 ++++ .../Solution.py | 17 +++ 7 files changed, 370 insertions(+), 4 deletions(-) create mode 100644 solution/1600-1699/1643.Kth Smallest Instructions/Solution.cpp create mode 100644 solution/1600-1699/1643.Kth Smallest Instructions/Solution.go create mode 100644 solution/1600-1699/1643.Kth Smallest Instructions/Solution.java create mode 100644 solution/1600-1699/1643.Kth Smallest Instructions/Solution.py diff --git a/solution/1600-1699/1641.Count Sorted Vowel Strings/README.md b/solution/1600-1699/1641.Count Sorted Vowel Strings/README.md index 296f80c60a969..e6fe83dc37be8 100644 --- a/solution/1600-1699/1641.Count Sorted Vowel Strings/README.md +++ b/solution/1600-1699/1641.Count Sorted Vowel Strings/README.md @@ -64,9 +64,9 @@ **方法二:动态规划 + 前缀和** -定义 $f[i][j]$ 表示当前已经选了 $i$ 个元音字母,且最后一个元音字母是 $j$ 的方案数。初始时 $f[0][j]=1$。答案是 $\sum_{j = 0}^4 f[n - 1][j]$。 +定义 $f[i][j]$ 表示当前已经选了 $i$ 个元音字母,且最后一个元音字母是 $j$ 的方案数。初始时 $f[1][j]=1$。答案是 $\sum_{j = 0}^4 f[n][j]$。 -我们可以发现,$f[i][j]$ 只与 $f[i - 1][j]$ 有关,因此我们可以使用滚动数组优化空间复杂度。 +我们可以发现 $f[i][j]$ 只与 $f[i - 1][j]$ 有关,因此可以将二维数组压缩为一维数组,从而优化空间复杂度。 时间复杂度 $O(n \times C),ドル空间复杂度 $O(C)$。其中 $n$ 为题目给定的整数,而 $C$ 是元音字母的数量,本题中 $C = 5$。 diff --git a/solution/1600-1699/1643.Kth Smallest Instructions/README.md b/solution/1600-1699/1643.Kth Smallest Instructions/README.md index ae522ba25d303..e7f8a737df724 100644 --- a/solution/1600-1699/1643.Kth Smallest Instructions/README.md +++ b/solution/1600-1699/1643.Kth Smallest Instructions/README.md @@ -69,6 +69,20 @@ +**方法一:组合计数** + +根据题目描述我们可以知道,最终的路径是由 $destination[0]$ 个 `'V'` 和 $destination[1]$ 个 `'H'` 组成的,且按字典序排列后的第 $k$ 条最小指令。 + +我们首先考虑字典序的最高位,即最左边的字符。如果高位字符是 `'V'`,那么所有以 `'H'` 开头的路径的字典序都比它小,而以 `'H'` 开头的路径总数为 $x = C_{v+h-1}^{h-1}$。 + +如果 $k \lt x,ドル那么高位字符一定是 `'V'`,我们将 $k$ 减去 $x,ドル并将 $v$ 减 1ドル,ドル然后继续考虑下一位字符;否则,高位字符一定是 `'H'`,我们将 $h$ 减 1ドル,ドル然后继续考虑下一位字符。 + +注意,如果 $h = 0,ドル那么高位字符一定是 `'V'`,因为剩下的字符都是 `'V'`。 + +问题可以转换为求解 $C_{n}^{k},ドル我们可以通过公式 $C_{n}^{k} = C_{n-1}^{k-1} + C_{n-1}^{k}$ 递推求解。 + +时间复杂度 $O((h + v) \times h),ドル空间复杂度 $O((h + v) \times h)$。其中 $h$ 和 $v$ 分别为 $destination[1]$ 和 $destination[0]$。 + ### **Python3** @@ -76,7 +90,23 @@ ```python - +class Solution: + def kthSmallestPath(self, destination: List[int], k: int) -> str: + v, h = destination + ans = [] + for _ in range(h + v): + if h == 0: + ans.append("V") + else: + x = comb(h + v - 1, h - 1) + if k> x: + ans.append("V") + v -= 1 + k -= x + else: + ans.append("H") + h -= 1 + return "".join(ans) ``` ### **Java** @@ -84,7 +114,111 @@ ```java +class Solution { + public String kthSmallestPath(int[] destination, int k) { + int v = destination[0], h = destination[1]; + int n = v + h; + int[][] c = new int[n + 1][h + 1]; + c[0][0] = 1; + for (int i = 1; i <= n; ++i) { + c[i][0] = 1; + for (int j = 1; j <= h; ++j) { + c[i][j] = c[i - 1][j] + c[i - 1][j - 1]; + } + } + StringBuilder ans = new StringBuilder(); + for (int i = n; i> 0; --i) { + if (h == 0) { + ans.append('V'); + } else { + int x = c[v + h - 1][h - 1]; + if (k> x) { + ans.append('V'); + k -= x; + --v; + } else { + ans.append('H'); + --h; + } + } + } + return ans.toString(); + } +} +``` + +### **C++** + +```cpp +class Solution { +public: + string kthSmallestPath(vector& destination, int k) { + int v = destination[0], h = destination[1]; + int n = v + h; + int c[n + 1][h + 1]; + memset(c, 0, sizeof(c)); + c[0][0] = 1; + for (int i = 1; i <= n; ++i) { + c[i][0] = 1; + for (int j = 1; j <= h; ++j) { + c[i][j] = c[i - 1][j] + c[i - 1][j - 1]; + } + } + string ans; + for (int i = 0; i < n; ++i) { + if (h == 0) { + ans.push_back('V'); + } else { + int x = c[v + h - 1][h - 1]; + if (k> x) { + ans.push_back('V'); + --v; + k -= x; + } else { + ans.push_back('H'); + --h; + } + } + } + return ans; + } +}; +``` +### **Go** + +```go +func kthSmallestPath(destination []int, k int) string { + v, h := destination[0], destination[1] + n := v + h + c := make([][]int, n+1) + for i := range c { + c[i] = make([]int, h+1) + c[i][0] = 1 + } + for i := 1; i <= n; i++ { + for j := 1; j <= h; j++ { + c[i][j] = c[i-1][j] + c[i-1][j-1] + } + } + ans := []byte{} + for i := 0; i < n; i++ { + if h == 0 { + ans = append(ans, 'V') + } else { + x := c[v+h-1][h-1] + if k> x { + ans = append(ans, 'V') + k -= x + v-- + } else { + ans = append(ans, 'H') + h-- + } + } + } + return string(ans) +} ``` ### **...** diff --git a/solution/1600-1699/1643.Kth Smallest Instructions/README_EN.md b/solution/1600-1699/1643.Kth Smallest Instructions/README_EN.md index ea12523d8f6a8..9dabb2a2861d8 100644 --- a/solution/1600-1699/1643.Kth Smallest Instructions/README_EN.md +++ b/solution/1600-1699/1643.Kth Smallest Instructions/README_EN.md @@ -65,13 +65,133 @@ ### **Python3** ```python - +class Solution: + def kthSmallestPath(self, destination: List[int], k: int) -> str: + v, h = destination + ans = [] + for _ in range(h + v): + if h == 0: + ans.append("V") + else: + x = comb(h + v - 1, h - 1) + if k> x: + ans.append("V") + v -= 1 + k -= x + else: + ans.append("H") + h -= 1 + return "".join(ans) ``` ### **Java** ```java +class Solution { + public String kthSmallestPath(int[] destination, int k) { + int v = destination[0], h = destination[1]; + int n = v + h; + int[][] c = new int[n + 1][h + 1]; + c[0][0] = 1; + for (int i = 1; i <= n; ++i) { + c[i][0] = 1; + for (int j = 1; j <= h; ++j) { + c[i][j] = c[i - 1][j] + c[i - 1][j - 1]; + } + } + StringBuilder ans = new StringBuilder(); + for (int i = n; i> 0; --i) { + if (h == 0) { + ans.append('V'); + } else { + int x = c[v + h - 1][h - 1]; + if (k> x) { + ans.append('V'); + k -= x; + --v; + } else { + ans.append('H'); + --h; + } + } + } + return ans.toString(); + } +} +``` + +### **C++** + +```cpp +class Solution { +public: + string kthSmallestPath(vector& destination, int k) { + int v = destination[0], h = destination[1]; + int n = v + h; + int c[n + 1][h + 1]; + memset(c, 0, sizeof(c)); + c[0][0] = 1; + for (int i = 1; i <= n; ++i) { + c[i][0] = 1; + for (int j = 1; j <= h; ++j) { + c[i][j] = c[i - 1][j] + c[i - 1][j - 1]; + } + } + string ans; + for (int i = 0; i < n; ++i) { + if (h == 0) { + ans.push_back('V'); + } else { + int x = c[v + h - 1][h - 1]; + if (k> x) { + ans.push_back('V'); + --v; + k -= x; + } else { + ans.push_back('H'); + --h; + } + } + } + return ans; + } +}; +``` +### **Go** + +```go +func kthSmallestPath(destination []int, k int) string { + v, h := destination[0], destination[1] + n := v + h + c := make([][]int, n+1) + for i := range c { + c[i] = make([]int, h+1) + c[i][0] = 1 + } + for i := 1; i <= n; i++ { + for j := 1; j <= h; j++ { + c[i][j] = c[i-1][j] + c[i-1][j-1] + } + } + ans := []byte{} + for i := 0; i < n; i++ { + if h == 0 { + ans = append(ans, 'V') + } else { + x := c[v+h-1][h-1] + if k> x { + ans = append(ans, 'V') + k -= x + v-- + } else { + ans = append(ans, 'H') + h-- + } + } + } + return string(ans) +} ``` ### **...** diff --git a/solution/1600-1699/1643.Kth Smallest Instructions/Solution.cpp b/solution/1600-1699/1643.Kth Smallest Instructions/Solution.cpp new file mode 100644 index 0000000000000..1d32372d1ad7d --- /dev/null +++ b/solution/1600-1699/1643.Kth Smallest Instructions/Solution.cpp @@ -0,0 +1,33 @@ +class Solution { +public: + string kthSmallestPath(vector& destination, int k) { + int v = destination[0], h = destination[1]; + int n = v + h; + int c[n + 1][h + 1]; + memset(c, 0, sizeof(c)); + c[0][0] = 1; + for (int i = 1; i <= n; ++i) { + c[i][0] = 1; + for (int j = 1; j <= h; ++j) { + c[i][j] = c[i - 1][j] + c[i - 1][j - 1]; + } + } + string ans; + for (int i = 0; i < n; ++i) { + if (h == 0) { + ans.push_back('V'); + } else { + int x = c[v + h - 1][h - 1]; + if (k> x) { + ans.push_back('V'); + --v; + k -= x; + } else { + ans.push_back('H'); + --h; + } + } + } + return ans; + } +}; \ No newline at end of file diff --git a/solution/1600-1699/1643.Kth Smallest Instructions/Solution.go b/solution/1600-1699/1643.Kth Smallest Instructions/Solution.go new file mode 100644 index 0000000000000..6c93e50eaa7b6 --- /dev/null +++ b/solution/1600-1699/1643.Kth Smallest Instructions/Solution.go @@ -0,0 +1,31 @@ +func kthSmallestPath(destination []int, k int) string { + v, h := destination[0], destination[1] + n := v + h + c := make([][]int, n+1) + for i := range c { + c[i] = make([]int, h+1) + c[i][0] = 1 + } + for i := 1; i <= n; i++ { + for j := 1; j <= h; j++ { + c[i][j] = c[i-1][j] + c[i-1][j-1] + } + } + ans := []byte{} + for i := 0; i < n; i++ { + if h == 0 { + ans = append(ans, 'V') + } else { + x := c[v+h-1][h-1] + if k> x { + ans = append(ans, 'V') + k -= x + v-- + } else { + ans = append(ans, 'H') + h-- + } + } + } + return string(ans) +} \ No newline at end of file diff --git a/solution/1600-1699/1643.Kth Smallest Instructions/Solution.java b/solution/1600-1699/1643.Kth Smallest Instructions/Solution.java new file mode 100644 index 0000000000000..788e6da0d6f98 --- /dev/null +++ b/solution/1600-1699/1643.Kth Smallest Instructions/Solution.java @@ -0,0 +1,31 @@ +class Solution { + public String kthSmallestPath(int[] destination, int k) { + int v = destination[0], h = destination[1]; + int n = v + h; + int[][] c = new int[n + 1][h + 1]; + c[0][0] = 1; + for (int i = 1; i <= n; ++i) { + c[i][0] = 1; + for (int j = 1; j <= h; ++j) { + c[i][j] = c[i - 1][j] + c[i - 1][j - 1]; + } + } + StringBuilder ans = new StringBuilder(); + for (int i = n; i> 0; --i) { + if (h == 0) { + ans.append('V'); + } else { + int x = c[v + h - 1][h - 1]; + if (k> x) { + ans.append('V'); + k -= x; + --v; + } else { + ans.append('H'); + --h; + } + } + } + return ans.toString(); + } +} \ No newline at end of file diff --git a/solution/1600-1699/1643.Kth Smallest Instructions/Solution.py b/solution/1600-1699/1643.Kth Smallest Instructions/Solution.py new file mode 100644 index 0000000000000..e8e83bb5d1667 --- /dev/null +++ b/solution/1600-1699/1643.Kth Smallest Instructions/Solution.py @@ -0,0 +1,17 @@ +class Solution: + def kthSmallestPath(self, destination: List[int], k: int) -> str: + v, h = destination + ans = [] + for _ in range(h + v): + if h == 0: + ans.append("V") + else: + x = comb(h + v - 1, h - 1) + if k> x: + ans.append("V") + v -= 1 + k -= x + else: + ans.append("H") + h -= 1 + return "".join(ans) From e43dd029c959b6bacaf86edc5aebe626e949d404 Mon Sep 17 00:00:00 2001 From: yanglbme Date: 2023年3月29日 14:17:32 +0800 Subject: [PATCH 03/14] feat: add solutions to lc problem: No.1637 No.1637.Widest Vertical Area Between Two Points Containing No Points --- .../README.md | 4 ++-- .../README.md | 15 ++++++++++++++- .../README_EN.md | 13 +++++++++++++ .../Solution.ts | 8 ++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.ts diff --git a/solution/1600-1699/1636.Sort Array by Increasing Frequency/README.md b/solution/1600-1699/1636.Sort Array by Increasing Frequency/README.md index 06bf020d6230e..2f051bec18134 100644 --- a/solution/1600-1699/1636.Sort Array by Increasing Frequency/README.md +++ b/solution/1600-1699/1636.Sort Array by Increasing Frequency/README.md @@ -46,11 +46,11 @@ **方法一:数组或哈希表计数** -用数组或者哈希表统计 `nums` 中每个数字出现的次数,由于题目中数字的范围是 `[-100, 100]`,我们可以直接创建一个大小为 201ドル$ 的数组来统计。 +用数组或者哈希表统计 `nums` 中每个数字出现的次数,由于题目中数字的范围是 $[-100, 100],ドル我们可以直接创建一个大小为 201ドル$ 的数组来统计。 然后对 `nums` 按照数字出现次数升序排序,如果出现次数相同,则按照数字降序排序。 -时间复杂度为 $O(n\log n),ドル空间复杂度 $O(n)$。其中 $n$ 为 `nums` 的长度。 +时间复杂度为 $O(n \times \log n),ドル空间复杂度 $O(n)$。其中 $n$ 为数组 `nums` 的长度。 diff --git a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/README.md b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/README.md index 96ddf211795ba..44b3aee8010ea 100644 --- a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/README.md +++ b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/README.md @@ -46,7 +46,7 @@ **方法一:排序** -对 `points` 按照 $x$ 升序排列,获取相邻点之间 $x$ 的差值的最大值。 +我们可以对 `points` 按照 $x$ 升序排列,获取相邻点之间 $x$ 的差值的最大值。 时间复杂度 $O(n \times \log n),ドル空间复杂度 $O(\log n)$。其中 $n$ 为 `points` 的长度。 @@ -115,6 +115,19 @@ func max(a, b int) int { } ``` +### **TypeScript** + +```ts +function maxWidthOfVerticalArea(points: number[][]): number { + points.sort((a, b) => a[0] - b[0]); + let ans = 0; + for (let i = 1; i < points.length; ++i) { + ans = Math.max(ans, points[i][0] - points[i - 1][0]); + } + return ans; +} +``` + ### **JavaScript** ```js diff --git a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/README_EN.md b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/README_EN.md index 959af48a8080b..8c4ce85fb299d 100644 --- a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/README_EN.md +++ b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/README_EN.md @@ -99,6 +99,19 @@ func max(a, b int) int { } ``` +### **TypeScript** + +```ts +function maxWidthOfVerticalArea(points: number[][]): number { + points.sort((a, b) => a[0] - b[0]); + let ans = 0; + for (let i = 1; i < points.length; ++i) { + ans = Math.max(ans, points[i][0] - points[i - 1][0]); + } + return ans; +} +``` + ### **JavaScript** ```js diff --git a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.ts b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.ts new file mode 100644 index 0000000000000..73c5f6e96f80d --- /dev/null +++ b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.ts @@ -0,0 +1,8 @@ +function maxWidthOfVerticalArea(points: number[][]): number { + points.sort((a, b) => a[0] - b[0]); + let ans = 0; + for (let i = 1; i < points.length; ++i) { + ans = Math.max(ans, points[i][0] - points[i - 1][0]); + } + return ans; +} From 24d191c90233fa93068239d63471f0152866f65e Mon Sep 17 00:00:00 2001 From: yanglbme Date: 2023年3月29日 17:12:20 +0800 Subject: [PATCH 04/14] feat: add solutions to lc problem: No.1655 No.1655.Distribute Repeating Integers --- .../README.md | 240 +++++++++++++++++- .../README_EN.md | 224 +++++++++++++++- .../Solution.cpp | 47 ++++ .../Solution.go | 43 ++++ .../Solution.java | 45 ++++ .../Solution.py | 29 +++ .../Solution.ts | 45 ++++ 7 files changed, 671 insertions(+), 2 deletions(-) create mode 100644 solution/1600-1699/1655.Distribute Repeating Integers/Solution.cpp create mode 100644 solution/1600-1699/1655.Distribute Repeating Integers/Solution.go create mode 100644 solution/1600-1699/1655.Distribute Repeating Integers/Solution.java create mode 100644 solution/1600-1699/1655.Distribute Repeating Integers/Solution.py create mode 100644 solution/1600-1699/1655.Distribute Repeating Integers/Solution.ts diff --git a/solution/1600-1699/1655.Distribute Repeating Integers/README.md b/solution/1600-1699/1655.Distribute Repeating Integers/README.md index a1ec742d648fe..2ed8c6b4775c9 100644 --- a/solution/1600-1699/1655.Distribute Repeating Integers/README.md +++ b/solution/1600-1699/1655.Distribute Repeating Integers/README.md @@ -60,6 +60,22 @@ +**方法一:状态压缩动态规划 + 子集枚举** + +我们先统计数组 $nums$ 中每个数字出现的次数,记录在哈希表 $cnt$ 中,然后将哈希表中的值存入数组 $arr$ 中,我们记数组 $arr$ 的长度为 $n$。 + +注意到数组 $quantity$ 的长度不超过 10ドル,ドル因此,我们可以用一个二进制数表示 $quantity$ 中的一个子集,即数字 $j$ 表示 $quantity$ 中的一个子集,其中 $j$ 的二进制表示中的第 $i$ 位为 1ドル$ 表示 $quantity$ 中的第 $i$ 个数字被选中,为 0ドル$ 表示第 $i$ 个数字未被选中。 + +我们可以预处理出数组 $s,ドル其中 $s[j]$ 表示 $quantity$ 中子集 $j$ 中所有数字的和。 + +接下来,我们定义 $f[i][j]$ 表示数组 $arr[0,..i-1]$ 中的数字能否成功分配给 $quantity$ 中的子集 $j,ドル其中 $i$ 的取值范围为 $[0,..n-1],ドル而 $j$ 的取值范围为 $[0,2^m-1],ドル其中 $m$ 为 $quantity$ 的长度。 + +考虑 $f[i][j],ドル如果子集 $j$ 中存在一个子集 $k,ドル使得 $s[k] \leq arr[i],ドル并且 $f[i-1][j \oplus k]$ 为真,那么 $f[i][j]$ 为真,否则 $f[i][j]$ 为假。 + +答案为 $f[n-1][2^m-1]$。 + +时间复杂度 $O(n \times 3^m),ドル空间复杂度 $O(n \times 2^m)$。其中 $n$ 是数组 $nums$ 中不同整数的个数;而 $m$ 是数组 $quantity$ 的长度。 + ### **Python3** @@ -67,7 +83,35 @@ ```python - +class Solution: + def canDistribute(self, nums: List[int], quantity: List[int]) -> bool: + m = len(quantity) + s = [0] * (1 << m) + for i in range(1, 1 << m): + for j in range(m): + if i>> j & 1: + s[i] = s[i ^ (1 << j)] + quantity[j] + break + cnt = Counter(nums) + arr = list(cnt.values()) + n = len(arr) + f = [[False] * (1 << m) for _ in range(n)] + for i in range(n): + f[i][0] = True + for i, x in enumerate(arr): + for j in range(1, 1 << m): + if i and f[i - 1][j]: + f[i][j] = True + continue + k = j + while k: + ok1 = j == k if i == 0 else f[i - 1][j ^ k] + ok2 = s[k] <= x + if ok1 and ok2: + f[i][j] = True + break + k = (k - 1) & j + return f[-1][-1] ``` ### **Java** @@ -75,7 +119,201 @@ ```java +class Solution { + public boolean canDistribute(int[] nums, int[] quantity) { + int m = quantity.length; + int[] s = new int[1 << m]; + for (int i = 1; i < 1 << m; ++i) { + for (int j = 0; j < m; ++j) { + if ((i>> j & 1) != 0) { + s[i] = s[i ^ (1 << j)] + quantity[j]; + break; + } + } + } + Map cnt = new HashMap(50); + for (int x : nums) { + cnt.merge(x, 1, Integer::sum); + } + int n = cnt.size(); + int[] arr = new int[n]; + int i = 0; + for (int x : cnt.values()) { + arr[i++] = x; + } + boolean[][] f = new boolean[n][1 << m]; + for (i = 0; i < n; ++i) { + f[i][0] = true; + } + for (i = 0; i < n; ++i) { + for (int j = 1; j < 1 << m; ++j) { + if (i> 0 && f[i - 1][j]) { + f[i][j] = true; + continue; + } + for (int k = j; k> 0; k = (k - 1) & j) { + boolean ok1 = i == 0 ? j == k : f[i - 1][j ^ k]; + boolean ok2 = s[k] <= arr[i]; + if (ok1 && ok2) { + f[i][j] = true; + break; + } + } + } + } + return f[n - 1][(1 << m) - 1]; + } +} +``` + +### **C++** + +```cpp +class Solution { +public: + bool canDistribute(vector& nums, vector& quantity) { + int m = quantity.size(); + int s[1 << m]; + memset(s, 0, sizeof(s)); + for (int i = 1; i < 1 << m; ++i) { + for (int j = 0; j < m; ++j) { + if (i>> j & 1) { + s[i] = s[i ^ (1 << j)] + quantity[j]; + break; + } + } + } + unordered_map cnt; + for (int& x : nums) { + ++cnt[x]; + } + int n = cnt.size(); + vector arr; + for (auto& [_, x] : cnt) { + arr.push_back(x); + } + bool f[n][1 << m]; + memset(f, 0, sizeof(f)); + for (int i = 0; i < n; ++i) { + f[i][0] = true; + } + for (int i = 0; i < n; ++i) { + for (int j = 1; j < 1 << m; ++j) { + if (i && f[i - 1][j]) { + f[i][j] = true; + continue; + } + for (int k = j; k; k = (k - 1) & j) { + bool ok1 = i == 0 ? j == k : f[i - 1][j ^ k]; + bool ok2 = s[k] <= arr[i]; + if (ok1 && ok2) { + f[i][j] = true; + break; + } + } + } + } + return f[n - 1][(1 << m) - 1]; + } +}; +``` + +### **Go** + +```go +func canDistribute(nums []int, quantity []int) bool { + m := len(quantity) + s := make([]int, 1<>j&1 == 1 { + s[i] = s[i^(1< 0 && f[i-1][j] { + f[i][j] = true + continue + } + for k := j; k> 0; k = (k - 1) & j { + ok1 := (i == 0 && j == k) || (i> 0 && f[i-1][j-k]) + ok2 := s[k] <= arr[i] + if ok1 && ok2 { + f[i][j] = true + break + } + } + } + } + return f[n-1][(1<> j) & 1) { + s[i] = s[i ^ (1 << j)] + quantity[j]; + break; + } + } + } + const cnt: Map = new Map(); + for (const x of nums) { + cnt.set(x, (cnt.get(x) || 0) + 1); + } + const n = cnt.size; + const arr: number[] = []; + for (const [_, v] of cnt) { + arr.push(v); + } + const f: boolean[][] = new Array(n) + .fill(false) + .map(() => new Array(1 << m).fill(false)); + for (let i = 0; i < n; ++i) { + f[i][0] = true; + } + for (let i = 0; i < n; ++i) { + for (let j = 0; j < 1 << m; ++j) { + if (i> 0 && f[i - 1][j]) { + f[i][j] = true; + continue; + } + for (let k = j; k> 0; k = (k - 1) & j) { + const ok1: boolean = + (i == 0 && j == k) || (i> 0 && f[i - 1][j ^ k]); + const ok2: boolean = s[k] <= arr[i]; + if (ok1 && ok2) { + f[i][j] = true; + break; + } + } + } + } + return f[n - 1][(1 << m) - 1]; +} ``` ### **...** diff --git a/solution/1600-1699/1655.Distribute Repeating Integers/README_EN.md b/solution/1600-1699/1655.Distribute Repeating Integers/README_EN.md index 1c33b758c41c6..591a8f098eac8 100644 --- a/solution/1600-1699/1655.Distribute Repeating Integers/README_EN.md +++ b/solution/1600-1699/1655.Distribute Repeating Integers/README_EN.md @@ -59,13 +59,235 @@ ### **Python3** ```python - +class Solution: + def canDistribute(self, nums: List[int], quantity: List[int]) -> bool: + m = len(quantity) + s = [0] * (1 << m) + for i in range(1, 1 << m): + for j in range(m): + if i>> j & 1: + s[i] = s[i ^ (1 << j)] + quantity[j] + break + cnt = Counter(nums) + arr = list(cnt.values()) + n = len(arr) + f = [[False] * (1 << m) for _ in range(n)] + for i in range(n): + f[i][0] = True + for i, x in enumerate(arr): + for j in range(1, 1 << m): + if i and f[i - 1][j]: + f[i][j] = True + continue + k = j + while k: + ok1 = j == k if i == 0 else f[i - 1][j ^ k] + ok2 = s[k] <= x + if ok1 and ok2: + f[i][j] = True + break + k = (k - 1) & j + return f[-1][-1] ``` ### **Java** ```java +class Solution { + public boolean canDistribute(int[] nums, int[] quantity) { + int m = quantity.length; + int[] s = new int[1 << m]; + for (int i = 1; i < 1 << m; ++i) { + for (int j = 0; j < m; ++j) { + if ((i>> j & 1) != 0) { + s[i] = s[i ^ (1 << j)] + quantity[j]; + break; + } + } + } + Map cnt = new HashMap(50); + for (int x : nums) { + cnt.merge(x, 1, Integer::sum); + } + int n = cnt.size(); + int[] arr = new int[n]; + int i = 0; + for (int x : cnt.values()) { + arr[i++] = x; + } + boolean[][] f = new boolean[n][1 << m]; + for (i = 0; i < n; ++i) { + f[i][0] = true; + } + for (i = 0; i < n; ++i) { + for (int j = 1; j < 1 << m; ++j) { + if (i> 0 && f[i - 1][j]) { + f[i][j] = true; + continue; + } + for (int k = j; k> 0; k = (k - 1) & j) { + boolean ok1 = i == 0 ? j == k : f[i - 1][j ^ k]; + boolean ok2 = s[k] <= arr[i]; + if (ok1 && ok2) { + f[i][j] = true; + break; + } + } + } + } + return f[n - 1][(1 << m) - 1]; + } +} +``` + +### **C++** + +```cpp +class Solution { +public: + bool canDistribute(vector& nums, vector& quantity) { + int m = quantity.size(); + int s[1 << m]; + memset(s, 0, sizeof(s)); + for (int i = 1; i < 1 << m; ++i) { + for (int j = 0; j < m; ++j) { + if (i>> j & 1) { + s[i] = s[i ^ (1 << j)] + quantity[j]; + break; + } + } + } + unordered_map cnt; + for (int& x : nums) { + ++cnt[x]; + } + int n = cnt.size(); + vector arr; + for (auto& [_, x] : cnt) { + arr.push_back(x); + } + bool f[n][1 << m]; + memset(f, 0, sizeof(f)); + for (int i = 0; i < n; ++i) { + f[i][0] = true; + } + for (int i = 0; i < n; ++i) { + for (int j = 1; j < 1 << m; ++j) { + if (i && f[i - 1][j]) { + f[i][j] = true; + continue; + } + for (int k = j; k; k = (k - 1) & j) { + bool ok1 = i == 0 ? j == k : f[i - 1][j ^ k]; + bool ok2 = s[k] <= arr[i]; + if (ok1 && ok2) { + f[i][j] = true; + break; + } + } + } + } + return f[n - 1][(1 << m) - 1]; + } +}; +``` + +### **Go** + +```go +func canDistribute(nums []int, quantity []int) bool { + m := len(quantity) + s := make([]int, 1<>j&1 == 1 { + s[i] = s[i^(1< 0 && f[i-1][j] { + f[i][j] = true + continue + } + for k := j; k> 0; k = (k - 1) & j { + ok1 := (i == 0 && j == k) || (i> 0 && f[i-1][j-k]) + ok2 := s[k] <= arr[i] + if ok1 && ok2 { + f[i][j] = true + break + } + } + } + } + return f[n-1][(1<> j) & 1) { + s[i] = s[i ^ (1 << j)] + quantity[j]; + break; + } + } + } + const cnt: Map = new Map(); + for (const x of nums) { + cnt.set(x, (cnt.get(x) || 0) + 1); + } + const n = cnt.size; + const arr: number[] = []; + for (const [_, v] of cnt) { + arr.push(v); + } + const f: boolean[][] = new Array(n) + .fill(false) + .map(() => new Array(1 << m).fill(false)); + for (let i = 0; i < n; ++i) { + f[i][0] = true; + } + for (let i = 0; i < n; ++i) { + for (let j = 0; j < 1 << m; ++j) { + if (i> 0 && f[i - 1][j]) { + f[i][j] = true; + continue; + } + for (let k = j; k> 0; k = (k - 1) & j) { + const ok1: boolean = + (i == 0 && j == k) || (i> 0 && f[i - 1][j ^ k]); + const ok2: boolean = s[k] <= arr[i]; + if (ok1 && ok2) { + f[i][j] = true; + break; + } + } + } + } + return f[n - 1][(1 << m) - 1]; +} ``` ### **...** diff --git a/solution/1600-1699/1655.Distribute Repeating Integers/Solution.cpp b/solution/1600-1699/1655.Distribute Repeating Integers/Solution.cpp new file mode 100644 index 0000000000000..488b64cb59558 --- /dev/null +++ b/solution/1600-1699/1655.Distribute Repeating Integers/Solution.cpp @@ -0,0 +1,47 @@ +class Solution { +public: + bool canDistribute(vector& nums, vector& quantity) { + int m = quantity.size(); + int s[1 << m]; + memset(s, 0, sizeof(s)); + for (int i = 1; i < 1 << m; ++i) { + for (int j = 0; j < m; ++j) { + if (i>> j & 1) { + s[i] = s[i ^ (1 << j)] + quantity[j]; + break; + } + } + } + unordered_map cnt; + for (int& x : nums) { + ++cnt[x]; + } + int n = cnt.size(); + vector arr; + for (auto& [_, x] : cnt) { + arr.push_back(x); + } + bool f[n][1 << m]; + memset(f, 0, sizeof(f)); + for (int i = 0; i < n; ++i) { + f[i][0] = true; + } + for (int i = 0; i < n; ++i) { + for (int j = 1; j < 1 << m; ++j) { + if (i && f[i - 1][j]) { + f[i][j] = true; + continue; + } + for (int k = j; k; k = (k - 1) & j) { + bool ok1 = i == 0 ? j == k : f[i - 1][j ^ k]; + bool ok2 = s[k] <= arr[i]; + if (ok1 && ok2) { + f[i][j] = true; + break; + } + } + } + } + return f[n - 1][(1 << m) - 1]; + } +}; \ No newline at end of file diff --git a/solution/1600-1699/1655.Distribute Repeating Integers/Solution.go b/solution/1600-1699/1655.Distribute Repeating Integers/Solution.go new file mode 100644 index 0000000000000..02ac9ca3a5c70 --- /dev/null +++ b/solution/1600-1699/1655.Distribute Repeating Integers/Solution.go @@ -0,0 +1,43 @@ +func canDistribute(nums []int, quantity []int) bool { + m := len(quantity) + s := make([]int, 1<>j&1 == 1 { + s[i] = s[i^(1< 0 && f[i-1][j] { + f[i][j] = true + continue + } + for k := j; k> 0; k = (k - 1) & j { + ok1 := (i == 0 && j == k) || (i> 0 && f[i-1][j-k]) + ok2 := s[k] <= arr[i] + if ok1 && ok2 { + f[i][j] = true + break + } + } + } + } + return f[n-1][(1<> j & 1) != 0) { + s[i] = s[i ^ (1 << j)] + quantity[j]; + break; + } + } + } + Map cnt = new HashMap(50); + for (int x : nums) { + cnt.merge(x, 1, Integer::sum); + } + int n = cnt.size(); + int[] arr = new int[n]; + int i = 0; + for (int x : cnt.values()) { + arr[i++] = x; + } + boolean[][] f = new boolean[n][1 << m]; + for (i = 0; i < n; ++i) { + f[i][0] = true; + } + for (i = 0; i < n; ++i) { + for (int j = 1; j < 1 << m; ++j) { + if (i> 0 && f[i - 1][j]) { + f[i][j] = true; + continue; + } + for (int k = j; k> 0; k = (k - 1) & j) { + boolean ok1 = i == 0 ? j == k : f[i - 1][j ^ k]; + boolean ok2 = s[k] <= arr[i]; + if (ok1 && ok2) { + f[i][j] = true; + break; + } + } + } + } + return f[n - 1][(1 << m) - 1]; + } +} \ No newline at end of file diff --git a/solution/1600-1699/1655.Distribute Repeating Integers/Solution.py b/solution/1600-1699/1655.Distribute Repeating Integers/Solution.py new file mode 100644 index 0000000000000..dcca7cb8a4ba3 --- /dev/null +++ b/solution/1600-1699/1655.Distribute Repeating Integers/Solution.py @@ -0,0 +1,29 @@ +class Solution: + def canDistribute(self, nums: List[int], quantity: List[int]) -> bool: + m = len(quantity) + s = [0] * (1 << m) + for i in range(1, 1 << m): + for j in range(m): + if i>> j & 1: + s[i] = s[i ^ (1 << j)] + quantity[j] + break + cnt = Counter(nums) + arr = list(cnt.values()) + n = len(arr) + f = [[False] * (1 << m) for _ in range(n)] + for i in range(n): + f[i][0] = True + for i, x in enumerate(arr): + for j in range(1, 1 << m): + if i and f[i - 1][j]: + f[i][j] = True + continue + k = j + while k: + ok1 = j == k if i == 0 else f[i - 1][j ^ k] + ok2 = s[k] <= x + if ok1 and ok2: + f[i][j] = True + break + k = (k - 1) & j + return f[-1][-1] diff --git a/solution/1600-1699/1655.Distribute Repeating Integers/Solution.ts b/solution/1600-1699/1655.Distribute Repeating Integers/Solution.ts new file mode 100644 index 0000000000000..696eb17ce11b1 --- /dev/null +++ b/solution/1600-1699/1655.Distribute Repeating Integers/Solution.ts @@ -0,0 +1,45 @@ +function canDistribute(nums: number[], quantity: number[]): boolean { + const m = quantity.length; + const s: number[] = new Array(1 << m).fill(0); + for (let i = 1; i < 1 << m; ++i) { + for (let j = 0; j < m; ++j) { + if ((i>> j) & 1) { + s[i] = s[i ^ (1 << j)] + quantity[j]; + break; + } + } + } + const cnt: Map = new Map(); + for (const x of nums) { + cnt.set(x, (cnt.get(x) || 0) + 1); + } + const n = cnt.size; + const arr: number[] = []; + for (const [_, v] of cnt) { + arr.push(v); + } + const f: boolean[][] = new Array(n) + .fill(false) + .map(() => new Array(1 << m).fill(false)); + for (let i = 0; i < n; ++i) { + f[i][0] = true; + } + for (let i = 0; i < n; ++i) { + for (let j = 0; j < 1 << m; ++j) { + if (i> 0 && f[i - 1][j]) { + f[i][j] = true; + continue; + } + for (let k = j; k> 0; k = (k - 1) & j) { + const ok1: boolean = + (i == 0 && j == k) || (i> 0 && f[i - 1][j ^ k]); + const ok2: boolean = s[k] <= arr[i]; + if (ok1 && ok2) { + f[i][j] = true; + break; + } + } + } + } + return f[n - 1][(1 << m) - 1]; +} From f51d868c8c28f7b36f02f4732874d27cde735bce Mon Sep 17 00:00:00 2001 From: Qiu <99040799+qiu-it@users.noreply.github.com> Date: 2023年3月29日 13:36:08 +0200 Subject: [PATCH 05/14] feat: add php solution to lc problem: No.0769 (#957) --- solution/0700-0799/0796.Rotate String/README.md | 15 +++++++++++++++ .../0700-0799/0796.Rotate String/README_EN.md | 15 +++++++++++++++ .../0700-0799/0796.Rotate String/Solution.php | 10 ++++++++++ 3 files changed, 40 insertions(+) create mode 100644 solution/0700-0799/0796.Rotate String/Solution.php diff --git a/solution/0700-0799/0796.Rotate String/README.md b/solution/0700-0799/0796.Rotate String/README.md index 761c162454a9e..d1b78e1c15e09 100644 --- a/solution/0700-0799/0796.Rotate String/README.md +++ b/solution/0700-0799/0796.Rotate String/README.md @@ -104,6 +104,21 @@ impl Solution { } ``` +### **PHP** + +```php +class Solution { + /** + * @param String $s + * @param String $goal + * @return Boolean + */ + function rotateString($s, $goal) { + return strlen($goal) === strlen($s) && strpos(($s.$s), $goal) !== false; + } +} +``` + ### **...** ``` diff --git a/solution/0700-0799/0796.Rotate String/README_EN.md b/solution/0700-0799/0796.Rotate String/README_EN.md index ef096a77868e8..16eecd0bf5cdd 100644 --- a/solution/0700-0799/0796.Rotate String/README_EN.md +++ b/solution/0700-0799/0796.Rotate String/README_EN.md @@ -87,6 +87,21 @@ impl Solution { } ``` +### **PHP** + +```php +class Solution { + /** + * @param String $s + * @param String $goal + * @return Boolean + */ + function rotateString($s, $goal) { + return strlen($goal) === strlen($s) && strpos(($s.$s), $goal) !== false; + } +} +``` + ### **...** ``` diff --git a/solution/0700-0799/0796.Rotate String/Solution.php b/solution/0700-0799/0796.Rotate String/Solution.php new file mode 100644 index 0000000000000..1f50fda45d7fb --- /dev/null +++ b/solution/0700-0799/0796.Rotate String/Solution.php @@ -0,0 +1,10 @@ +class Solution { + /** + * @param String $s + * @param String $goal + * @return Boolean + */ + function rotateString($s, $goal) { + return strlen($goal) === strlen($s) && strpos(($s.$s), $goal) !== false; + } +} \ No newline at end of file From 707af6873c300b27e897947b5fa9808a94ca2e72 Mon Sep 17 00:00:00 2001 From: yanglbme Date: 2023年3月29日 19:36:13 +0800 Subject: [PATCH 06/14] feat: add solutions to lc problem: No.2427 No.2427.Number of Common Factors --- .../2427.Number of Common Factors/README.md | 153 +++++++++++++++--- .../README_EN.md | 143 ++++++++++++++-- .../Solution.cpp | 8 +- .../2427.Number of Common Factors/Solution.go | 20 ++- .../Solution.java | 14 +- .../2427.Number of Common Factors/Solution.py | 9 +- .../2427.Number of Common Factors/Solution.ts | 15 +- 7 files changed, 311 insertions(+), 51 deletions(-) diff --git a/solution/2400-2499/2427.Number of Common Factors/README.md b/solution/2400-2499/2427.Number of Common Factors/README.md index 83d8c5eb6be89..83f1c94d50e41 100644 --- a/solution/2400-2499/2427.Number of Common Factors/README.md +++ b/solution/2400-2499/2427.Number of Common Factors/README.md @@ -39,9 +39,15 @@ **方法一:枚举** -直接枚举 $[1, 1000]$ 中的每个数,判断其是否是 $a$ 和 $b$ 的公因子,如果是,则答案加一。 +我们可以先算出 $a$ 和 $b$ 的最大公约数 $g,ドル然后枚举 $[1,..g]$ 中的每个数,判断其是否是 $g$ 的因子,如果是,则答案加一。 -时间复杂度 $O(n)$。本题中 $n = 1000$。 +时间复杂度 $O(\min(a, b)),ドル空间复杂度 $O(1)$。 + +**方法二:枚举优化** + +与方法一类似,我们可以先算出 $a$ 和 $b$ 的最大公约数 $g,ドル然后枚举最大公约数 $g$ 的所有因子,累加答案。 + +时间复杂度 $O(\sqrt{\min(a, b)}),ドル空间复杂度 $O(1)$。 @@ -52,7 +58,21 @@ ```python class Solution: def commonFactors(self, a: int, b: int) -> int: - return sum(a % i == 0 and b % i == 0 for i in range(1, 1001)) + g = gcd(a, b) + return sum(g % x == 0 for x in range(1, g + 1)) +``` + +```python +class Solution: + def commonFactors(self, a: int, b: int) -> int: + g = gcd(a, b) + ans, x = 0, 1 + while x * x <= g: + if g % x == 0: + ans += 1 + ans += x * x < g + x += 1 + return ans ``` ### **Java** @@ -62,14 +82,41 @@ class Solution: ```java class Solution { public int commonFactors(int a, int b) { - int ans = 0, n = Math.min(a, b); - for (int i = 1; i <= n; ++i) { - if (a % i == 0 && b % i == 0) { + int g = gcd(a, b); + int ans = 0; + for (int x = 1; x <= g; ++x) { + if (g % x == 0) { ++ans; } } return ans; } + + private int gcd(int a, int b) { + return b == 0 ? a : gcd(b, a % b); + } +} +``` + +```java +class Solution { + public int commonFactors(int a, int b) { + int g = gcd(a, b); + int ans = 0; + for (int x = 1; x * x <= g; ++x) { + if (g % x == 0) { + ++ans; + if (x * x < g) { + ++ans; + } + } + } + return ans; + } + + private int gcd(int a, int b) { + return b == 0 ? a : gcd(b, a % b); + } } ``` @@ -79,11 +126,26 @@ class Solution { class Solution { public: int commonFactors(int a, int b) { + int g = gcd(a, b); int ans = 0; - int n = min(a, b); - for (int i = 1; i <= n; ++i) { - if (a % i == 0 && b % i == 0) { - ++ans; + for (int x = 1; x <= g; ++x) { + ans += g % x == 0; + } + return ans; + } +}; +``` + +```cpp +class Solution { +public: + int commonFactors(int a, int b) { + int g = gcd(a, b); + int ans = 0; + for (int x = 1; x * x <= g; ++x) { + if (g % x == 0) { + ans++; + ans += x * x < g; } } return ans; @@ -94,14 +156,43 @@ public: ### **Go** ```go -func commonFactors(a int, b int) int { - ans := 0 - for i := 1; i <= a && i <= b; i++ { - if a%i == 0 && b%i == 0 { +func commonFactors(a int, b int) (ans int) { + g := gcd(a, b) + for x := 1; x <= g; x++ { + if g%x == 0 { ans++ } } - return ans + return +} + +func gcd(a int, b int) int { + if b == 0 { + return a + } + return gcd(b, a%b) +} +``` + +```go +func commonFactors(a int, b int) (ans int) { + g := gcd(a, b) + for x := 1; x*x <= g; x++ { + if g%x == 0 { + ans++ + if x*x < g { + ans++ + } + } + } + return +} + +func gcd(a int, b int) int { + if b == 0 { + return a + } + return gcd(b, a%b) } ``` @@ -109,13 +200,39 @@ func commonFactors(a int, b int) int { ```ts function commonFactors(a: number, b: number): number { - const n = Math.min(a, b); + const g = gcd(a, b); let ans = 0; - for (let i = 1; i <= n; i++) { - if (a % i == 0 && b % i == 0) ans += 1; + for (let x = 1; x <= g; ++x) { + if (g % x === 0) { + ++ans; + } + } + return ans; +} + +function gcd(a: number, b: number): number { + return b === 0 ? a : gcd(b, a % b); +} +``` + +```ts +function commonFactors(a: number, b: number): number { + const g = gcd(a, b); + let ans = 0; + for (let x = 1; x * x <= g; ++x) { + if (g % x === 0) { + ++ans; + if (x * x < g) { + ++ans; + } + } } return ans; } + +function gcd(a: number, b: number): number { + return b === 0 ? a : gcd(b, a % b); +} ``` ### **...** diff --git a/solution/2400-2499/2427.Number of Common Factors/README_EN.md b/solution/2400-2499/2427.Number of Common Factors/README_EN.md index ac18e843a075b..d13cd344705f4 100644 --- a/solution/2400-2499/2427.Number of Common Factors/README_EN.md +++ b/solution/2400-2499/2427.Number of Common Factors/README_EN.md @@ -41,7 +41,21 @@ ```python class Solution: def commonFactors(self, a: int, b: int) -> int: - return sum(a % i == 0 and b % i == 0 for i in range(1, 1001)) + g = gcd(a, b) + return sum(g % x == 0 for x in range(1, g + 1)) +``` + +```python +class Solution: + def commonFactors(self, a: int, b: int) -> int: + g = gcd(a, b) + ans, x = 0, 1 + while x * x <= g: + if g % x == 0: + ans += 1 + ans += x * x < g + x += 1 + return ans ``` ### **Java** @@ -49,14 +63,41 @@ class Solution: ```java class Solution { public int commonFactors(int a, int b) { - int ans = 0, n = Math.min(a, b); - for (int i = 1; i <= n; ++i) { - if (a % i == 0 && b % i == 0) { + int g = gcd(a, b); + int ans = 0; + for (int x = 1; x <= g; ++x) { + if (g % x == 0) { + ++ans; + } + } + return ans; + } + + private int gcd(int a, int b) { + return b == 0 ? a : gcd(b, a % b); + } +} +``` + +```java +class Solution { + public int commonFactors(int a, int b) { + int g = gcd(a, b); + int ans = 0; + for (int x = 1; x * x <= g; ++x) { + if (g % x == 0) { ++ans; + if (x * x < g) { + ++ans; + } } } return ans; } + + private int gcd(int a, int b) { + return b == 0 ? a : gcd(b, a % b); + } } ``` @@ -66,11 +107,26 @@ class Solution { class Solution { public: int commonFactors(int a, int b) { + int g = gcd(a, b); int ans = 0; - int n = min(a, b); - for (int i = 1; i <= n; ++i) { - if (a % i == 0 && b % i == 0) { - ++ans; + for (int x = 1; x <= g; ++x) { + ans += g % x == 0; + } + return ans; + } +}; +``` + +```cpp +class Solution { +public: + int commonFactors(int a, int b) { + int g = gcd(a, b); + int ans = 0; + for (int x = 1; x * x <= g; ++x) { + if (g % x == 0) { + ans++; + ans += x * x < g; } } return ans; @@ -81,14 +137,43 @@ public: ### **Go** ```go -func commonFactors(a int, b int) int { - ans := 0 - for i := 1; i <= a && i <= b; i++ { - if a%i == 0 && b%i == 0 { +func commonFactors(a int, b int) (ans int) { + g := gcd(a, b) + for x := 1; x <= g; x++ { + if g%x == 0 { + ans++ + } + } + return +} + +func gcd(a int, b int) int { + if b == 0 { + return a + } + return gcd(b, a%b) +} +``` + +```go +func commonFactors(a int, b int) (ans int) { + g := gcd(a, b) + for x := 1; x*x <= g; x++ { + if g%x == 0 { ans++ + if x*x < g { + ans++ + } } } - return ans + return +} + +func gcd(a int, b int) int { + if b == 0 { + return a + } + return gcd(b, a%b) } ``` @@ -96,13 +181,39 @@ func commonFactors(a int, b int) int { ```ts function commonFactors(a: number, b: number): number { - const n = Math.min(a, b); + const g = gcd(a, b); let ans = 0; - for (let i = 1; i <= n; i++) { - if (a % i == 0 && b % i == 0) ans += 1; + for (let x = 1; x <= g; ++x) { + if (g % x === 0) { + ++ans; + } } return ans; } + +function gcd(a: number, b: number): number { + return b === 0 ? a : gcd(b, a % b); +} +``` + +```ts +function commonFactors(a: number, b: number): number { + const g = gcd(a, b); + let ans = 0; + for (let x = 1; x * x <= g; ++x) { + if (g % x === 0) { + ++ans; + if (x * x < g) { + ++ans; + } + } + } + return ans; +} + +function gcd(a: number, b: number): number { + return b === 0 ? a : gcd(b, a % b); +} ``` ### **...** diff --git a/solution/2400-2499/2427.Number of Common Factors/Solution.cpp b/solution/2400-2499/2427.Number of Common Factors/Solution.cpp index 3e4761aafcf76..1412b94633184 100644 --- a/solution/2400-2499/2427.Number of Common Factors/Solution.cpp +++ b/solution/2400-2499/2427.Number of Common Factors/Solution.cpp @@ -1,12 +1,10 @@ class Solution { public: int commonFactors(int a, int b) { + int g = gcd(a, b); int ans = 0; - int n = min(a, b); - for (int i = 1; i <= n; ++i) { - if (a % i == 0 && b % i == 0) { - ++ans; - } + for (int x = 1; x <= g; ++x) { + ans += g % x == 0; } return ans; } diff --git a/solution/2400-2499/2427.Number of Common Factors/Solution.go b/solution/2400-2499/2427.Number of Common Factors/Solution.go index 09712fa18f7a1..0803454c57b71 100644 --- a/solution/2400-2499/2427.Number of Common Factors/Solution.go +++ b/solution/2400-2499/2427.Number of Common Factors/Solution.go @@ -1,9 +1,19 @@ -func commonFactors(a int, b int) int { - ans := 0 - for i := 1; i <= a && i <= b; i++ { - if a%i == 0 && b%i == 0 { +func commonFactors(a int, b int) (ans int) { + g := gcd(a, b) + for x := 1; x*x <= g; x++ { + if g%x == 0 { ans++ + if x*x < g { + ans++ + } } } - return ans + return +} + +func gcd(a int, b int) int { + if b == 0 { + return a + } + return gcd(b, a%b) } \ No newline at end of file diff --git a/solution/2400-2499/2427.Number of Common Factors/Solution.java b/solution/2400-2499/2427.Number of Common Factors/Solution.java index bbba8c5889f0b..c0adcfd041c37 100644 --- a/solution/2400-2499/2427.Number of Common Factors/Solution.java +++ b/solution/2400-2499/2427.Number of Common Factors/Solution.java @@ -1,11 +1,19 @@ class Solution { public int commonFactors(int a, int b) { - int ans = 0, n = Math.min(a, b); - for (int i = 1; i <= n; ++i) { - if (a % i == 0 && b % i == 0) { + int g = gcd(a, b); + int ans = 0; + for (int x = 1; x * x <= g; ++x) { + if (g % x == 0) { ++ans; + if (x * x < g) { + ++ans; + } } } return ans; } + + private int gcd(int a, int b) { + return b == 0 ? a : gcd(b, a % b); + } } \ No newline at end of file diff --git a/solution/2400-2499/2427.Number of Common Factors/Solution.py b/solution/2400-2499/2427.Number of Common Factors/Solution.py index 9d2d08d5d64e1..9398ffcff6b6c 100644 --- a/solution/2400-2499/2427.Number of Common Factors/Solution.py +++ b/solution/2400-2499/2427.Number of Common Factors/Solution.py @@ -1,3 +1,10 @@ class Solution: def commonFactors(self, a: int, b: int) -> int: - return sum(a % i == 0 and b % i == 0 for i in range(1, 1001)) + g = gcd(a, b) + ans, x = 0, 1 + while x * x <= g: + if g % x == 0: + ans += 1 + ans += x * x < g + x += 1 + return ans diff --git a/solution/2400-2499/2427.Number of Common Factors/Solution.ts b/solution/2400-2499/2427.Number of Common Factors/Solution.ts index 036ff269e342e..ba416e12ad436 100644 --- a/solution/2400-2499/2427.Number of Common Factors/Solution.ts +++ b/solution/2400-2499/2427.Number of Common Factors/Solution.ts @@ -1,8 +1,17 @@ function commonFactors(a: number, b: number): number { - const n = Math.min(a, b); + const g = gcd(a, b); let ans = 0; - for (let i = 1; i <= n; i++) { - if (a % i == 0 && b % i == 0) ans += 1; + for (let x = 1; x * x <= g; ++x) { + if (g % x === 0) { + ++ans; + if (x * x < g) { + ++ans; + } + } } return ans; } + +function gcd(a: number, b: number): number { + return b === 0 ? a : gcd(b, a % b); +} From 7e91d180dc8fa67062b702ecc4048e58bab9bf41 Mon Sep 17 00:00:00 2001 From: yanglbme Date: 2023年3月29日 20:06:38 +0800 Subject: [PATCH 07/14] feat: update solutions to lc problem: No.2428 No.2428.Maximum Sum of an Hourglass --- .../README.md | 70 ++++++++----------- .../README_EN.md | 66 +++++++---------- .../Solution.cpp | 8 +-- .../Solution.go | 13 ++-- .../Solution.java | 8 +-- .../Solution.py | 12 ++-- .../Solution.ts | 25 +++---- 7 files changed, 80 insertions(+), 122 deletions(-) diff --git a/solution/2400-2499/2428.Maximum Sum of an Hourglass/README.md b/solution/2400-2499/2428.Maximum Sum of an Hourglass/README.md index be5d55c6f1e38..ff78e7ea8d39f 100644 --- a/solution/2400-2499/2428.Maximum Sum of an Hourglass/README.md +++ b/solution/2400-2499/2428.Maximum Sum of an Hourglass/README.md @@ -47,9 +47,9 @@ **方法一:枚举** -从左上角开始,枚举每个可能的沙漏的中间坐标 $(i, j),ドル计算沙漏的元素和,取最大值即可。 +我们观察题目发现,每个沙漏就是一个 3ドル \times 3$ 的矩阵挖去中间行的首尾两个元素。因此,我们可以从左上角开始,枚举每个沙漏的中间坐标 $(i, j),ドル然后计算沙漏的元素和,取其中的最大值即可。 -时间复杂度 $O(m\times n)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。 +时间复杂度 $O(m \times n),ドル空间复杂度 $O(1)$。其中 $m$ 和 $n$ 分别是矩阵的行数和列数。 @@ -64,14 +64,10 @@ class Solution: ans = 0 for i in range(1, m - 1): for j in range(1, n - 1): - t = 0 - for x in [i - 1, i, i + 1]: - for y in [j - 1, j, j + 1]: - t += grid[x][y] - - t -= grid[i][j - 1] - t -= grid[i][j + 1] - ans = max(ans, t) + s = -grid[i][j - 1] - grid[i][j + 1] + s += sum(grid[x][y] for x in range(i - 1, i + 2) + for y in range(j - 1, j + 2)) + ans = max(ans, s) return ans ``` @@ -86,15 +82,13 @@ class Solution { int ans = 0; for (int i = 1; i < m - 1; ++i) { for (int j = 1; j < n - 1; ++j) { - int t = 0; + int s = -grid[i][j - 1] - grid[i][j + 1]; for (int x = i - 1; x <= i + 1; ++x) { for (int y = j - 1; y <= j + 1; ++y) { - t += grid[x][y]; + s += grid[x][y]; } } - t -= grid[i][j - 1]; - t -= grid[i][j + 1]; - ans = Math.max(ans, t); + ans = Math.max(ans, s); } } return ans; @@ -112,15 +106,13 @@ public: int ans = 0; for (int i = 1; i < m - 1; ++i) { for (int j = 1; j < n - 1; ++j) { - int t = 0; + int s = -grid[i][j - 1] - grid[i][j + 1]; for (int x = i - 1; x <= i + 1; ++x) { for (int y = j - 1; y <= j + 1; ++y) { - t += grid[x][y]; + s += grid[x][y]; } } - t -= grid[i][j - 1]; - t -= grid[i][j + 1]; - ans = max(ans, t); + ans = max(ans, s); } } return ans; @@ -131,23 +123,20 @@ public: ### **Go** ```go -func maxSum(grid [][]int) int { +func maxSum(grid [][]int) (ans int) { m, n := len(grid), len(grid[0]) - ans := 0 for i := 1; i < m-1; i++ { for j := 1; j < n-1; j++ { - t := 0 + s := -grid[i][j-1] - grid[i][j+1] for x := i - 1; x <= i+1; x++ { for y := j - 1; y <= j+1; y++ { - t += grid[x][y] + s += grid[x][y] } } - t -= grid[i][j-1] - t -= grid[i][j+1] - ans = max(ans, t) + ans = max(ans, s) } } - return ans + return } func max(a, b int) int { @@ -162,21 +151,18 @@ func max(a, b int) int { ```ts function maxSum(grid: number[][]): number { - const m = grid.length, - n = grid[0].length; - let threeSum = Array.from({ length: m }, () => new Array(n - 2).fill(0)); - for (let i = 0; i < m; i++) { - for (let j = 1; j < n - 1; j++) { - threeSum[i][j - 1] = grid[i][j - 1] + grid[i][j] + grid[i][j + 1]; - } - } + const m = grid.length; + const n = grid[0].length; let ans = 0; - for (let i = 1; i < m - 1; i++) { - for (let j = 1; j < n - 1; j++) { - ans = Math.max( - ans, - threeSum[i - 1][j - 1] + grid[i][j] + threeSum[i + 1][j - 1], - ); + for (let i = 1; i < m - 1; ++i) { + for (let j = 1; j < n - 1; ++j) { + let s = -grid[i][j - 1] - grid[i][j + 1]; + for (let x = i - 1; x <= i + 1; ++x) { + for (let y = j - 1; y <= j + 1; ++y) { + s += grid[x][y]; + } + } + ans = Math.max(ans, s); } } return ans; diff --git a/solution/2400-2499/2428.Maximum Sum of an Hourglass/README_EN.md b/solution/2400-2499/2428.Maximum Sum of an Hourglass/README_EN.md index 24ec81deb9a2f..ce236f24e73ac 100644 --- a/solution/2400-2499/2428.Maximum Sum of an Hourglass/README_EN.md +++ b/solution/2400-2499/2428.Maximum Sum of an Hourglass/README_EN.md @@ -52,14 +52,10 @@ class Solution: ans = 0 for i in range(1, m - 1): for j in range(1, n - 1): - t = 0 - for x in [i - 1, i, i + 1]: - for y in [j - 1, j, j + 1]: - t += grid[x][y] - - t -= grid[i][j - 1] - t -= grid[i][j + 1] - ans = max(ans, t) + s = -grid[i][j - 1] - grid[i][j + 1] + s += sum(grid[x][y] for x in range(i - 1, i + 2) + for y in range(j - 1, j + 2)) + ans = max(ans, s) return ans ``` @@ -72,15 +68,13 @@ class Solution { int ans = 0; for (int i = 1; i < m - 1; ++i) { for (int j = 1; j < n - 1; ++j) { - int t = 0; + int s = -grid[i][j - 1] - grid[i][j + 1]; for (int x = i - 1; x <= i + 1; ++x) { for (int y = j - 1; y <= j + 1; ++y) { - t += grid[x][y]; + s += grid[x][y]; } } - t -= grid[i][j - 1]; - t -= grid[i][j + 1]; - ans = Math.max(ans, t); + ans = Math.max(ans, s); } } return ans; @@ -98,15 +92,13 @@ public: int ans = 0; for (int i = 1; i < m - 1; ++i) { for (int j = 1; j < n - 1; ++j) { - int t = 0; + int s = -grid[i][j - 1] - grid[i][j + 1]; for (int x = i - 1; x <= i + 1; ++x) { for (int y = j - 1; y <= j + 1; ++y) { - t += grid[x][y]; + s += grid[x][y]; } } - t -= grid[i][j - 1]; - t -= grid[i][j + 1]; - ans = max(ans, t); + ans = max(ans, s); } } return ans; @@ -117,23 +109,20 @@ public: ### **Go** ```go -func maxSum(grid [][]int) int { +func maxSum(grid [][]int) (ans int) { m, n := len(grid), len(grid[0]) - ans := 0 for i := 1; i < m-1; i++ { for j := 1; j < n-1; j++ { - t := 0 + s := -grid[i][j-1] - grid[i][j+1] for x := i - 1; x <= i+1; x++ { for y := j - 1; y <= j+1; y++ { - t += grid[x][y] + s += grid[x][y] } } - t -= grid[i][j-1] - t -= grid[i][j+1] - ans = max(ans, t) + ans = max(ans, s) } } - return ans + return } func max(a, b int) int { @@ -148,21 +137,18 @@ func max(a, b int) int { ```ts function maxSum(grid: number[][]): number { - const m = grid.length, - n = grid[0].length; - let threeSum = Array.from({ length: m }, () => new Array(n - 2).fill(0)); - for (let i = 0; i < m; i++) { - for (let j = 1; j < n - 1; j++) { - threeSum[i][j - 1] = grid[i][j - 1] + grid[i][j] + grid[i][j + 1]; - } - } + const m = grid.length; + const n = grid[0].length; let ans = 0; - for (let i = 1; i < m - 1; i++) { - for (let j = 1; j < n - 1; j++) { - ans = Math.max( - ans, - threeSum[i - 1][j - 1] + grid[i][j] + threeSum[i + 1][j - 1], - ); + for (let i = 1; i < m - 1; ++i) { + for (let j = 1; j < n - 1; ++j) { + let s = -grid[i][j - 1] - grid[i][j + 1]; + for (let x = i - 1; x <= i + 1; ++x) { + for (let y = j - 1; y <= j + 1; ++y) { + s += grid[x][y]; + } + } + ans = Math.max(ans, s); } } return ans; diff --git a/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.cpp b/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.cpp index e95c2bacc68d8..d90b72b03dfeb 100644 --- a/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.cpp +++ b/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.cpp @@ -5,15 +5,13 @@ class Solution { int ans = 0; for (int i = 1; i < m - 1; ++i) { for (int j = 1; j < n - 1; ++j) { - int t = 0; + int s = -grid[i][j - 1] - grid[i][j + 1]; for (int x = i - 1; x <= i + 1; ++x) { for (int y = j - 1; y <= j + 1; ++y) { - t += grid[x][y]; + s += grid[x][y]; } } - t -= grid[i][j - 1]; - t -= grid[i][j + 1]; - ans = max(ans, t); + ans = max(ans, s); } } return ans; diff --git a/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.go b/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.go index 468aef814a996..82473cec22af5 100644 --- a/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.go +++ b/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.go @@ -1,20 +1,17 @@ -func maxSum(grid [][]int) int { +func maxSum(grid [][]int) (ans int) { m, n := len(grid), len(grid[0]) - ans := 0 for i := 1; i < m-1; i++ { for j := 1; j < n-1; j++ { - t := 0 + s := -grid[i][j-1] - grid[i][j+1] for x := i - 1; x <= i+1; x++ { for y := j - 1; y <= j+1; y++ { - t += grid[x][y] + s += grid[x][y] } } - t -= grid[i][j-1] - t -= grid[i][j+1] - ans = max(ans, t) + ans = max(ans, s) } } - return ans + return } func max(a, b int) int { diff --git a/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.java b/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.java index bf9deabc2a57c..b6731a1ab4e5a 100644 --- a/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.java +++ b/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.java @@ -4,15 +4,13 @@ public int maxSum(int[][] grid) { int ans = 0; for (int i = 1; i < m - 1; ++i) { for (int j = 1; j < n - 1; ++j) { - int t = 0; + int s = -grid[i][j - 1] - grid[i][j + 1]; for (int x = i - 1; x <= i + 1; ++x) { for (int y = j - 1; y <= j + 1; ++y) { - t += grid[x][y]; + s += grid[x][y]; } } - t -= grid[i][j - 1]; - t -= grid[i][j + 1]; - ans = Math.max(ans, t); + ans = Math.max(ans, s); } } return ans; diff --git a/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.py b/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.py index bb5741c6e96ee..44c4dff88935a 100644 --- a/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.py +++ b/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.py @@ -4,12 +4,8 @@ def maxSum(self, grid: List[List[int]]) -> int: ans = 0 for i in range(1, m - 1): for j in range(1, n - 1): - t = 0 - for x in [i - 1, i, i + 1]: - for y in [j - 1, j, j + 1]: - t += grid[x][y] - - t -= grid[i][j - 1] - t -= grid[i][j + 1] - ans = max(ans, t) + s = -grid[i][j - 1] - grid[i][j + 1] + s += sum(grid[x][y] for x in range(i - 1, i + 2) + for y in range(j - 1, j + 2)) + ans = max(ans, s) return ans diff --git a/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.ts b/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.ts index 70ae1f2a479b1..7a110112e02ee 100644 --- a/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.ts +++ b/solution/2400-2499/2428.Maximum Sum of an Hourglass/Solution.ts @@ -1,19 +1,16 @@ function maxSum(grid: number[][]): number { - const m = grid.length, - n = grid[0].length; - let threeSum = Array.from({ length: m }, () => new Array(n - 2).fill(0)); - for (let i = 0; i < m; i++) { - for (let j = 1; j < n - 1; j++) { - threeSum[i][j - 1] = grid[i][j - 1] + grid[i][j] + grid[i][j + 1]; - } - } + const m = grid.length; + const n = grid[0].length; let ans = 0; - for (let i = 1; i < m - 1; i++) { - for (let j = 1; j < n - 1; j++) { - ans = Math.max( - ans, - threeSum[i - 1][j - 1] + grid[i][j] + threeSum[i + 1][j - 1], - ); + for (let i = 1; i < m - 1; ++i) { + for (let j = 1; j < n - 1; ++j) { + let s = -grid[i][j - 1] - grid[i][j + 1]; + for (let x = i - 1; x <= i + 1; ++x) { + for (let y = j - 1; y <= j + 1; ++y) { + s += grid[x][y]; + } + } + ans = Math.max(ans, s); } } return ans; From 02129900b89f180f21ce70b22614ef0a8dcd54f3 Mon Sep 17 00:00:00 2001 From: thinkasany <480968828@qq.com> Date: 2023年3月29日 23:27:19 +0800 Subject: [PATCH 08/14] feat: update solutions to lc problem: No.12 --- .../0000-0099/0012.Integer to Roman/README.md | 33 +++++++++++++++++++ .../0012.Integer to Roman/README_EN.md | 33 +++++++++++++++++++ .../0012.Integer to Roman/Solution.ts | 28 ++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 solution/0000-0099/0012.Integer to Roman/Solution.ts diff --git a/solution/0000-0099/0012.Integer to Roman/README.md b/solution/0000-0099/0012.Integer to Roman/README.md index 6992fe68686ad..45314d9b5e21e 100644 --- a/solution/0000-0099/0012.Integer to Roman/README.md +++ b/solution/0000-0099/0012.Integer to Roman/README.md @@ -173,6 +173,39 @@ func intToRoman(num int) string { } ``` +### **TypeScript** + +```ts +function intToRoman(num: number): string { + const nums: number[] = [ + 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1, + ]; + const romans: string[] = [ + 'M', + 'CM', + 'D', + 'CD', + 'C', + 'XC', + 'L', + 'XL', + 'X', + 'IX', + 'V', + 'IV', + 'I', + ]; + let ans: string = ''; + for (let i = 0; i < nums.length; ++i) { + while (num>= nums[i]) { + num -= nums[i]; + ans += romans[i]; + } + } + return ans; +} +``` + ### **...** ``` diff --git a/solution/0000-0099/0012.Integer to Roman/README_EN.md b/solution/0000-0099/0012.Integer to Roman/README_EN.md index 8c07911367afd..4483cfb6378e7 100644 --- a/solution/0000-0099/0012.Integer to Roman/README_EN.md +++ b/solution/0000-0099/0012.Integer to Roman/README_EN.md @@ -152,6 +152,39 @@ func intToRoman(num int) string { } ``` +### **TypeScript** + +```ts +function intToRoman(num: number): string { + const nums: number[] = [ + 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1, + ]; + const romans: string[] = [ + 'M', + 'CM', + 'D', + 'CD', + 'C', + 'XC', + 'L', + 'XL', + 'X', + 'IX', + 'V', + 'IV', + 'I', + ]; + let ans: string = ''; + for (let i = 0; i < nums.length; ++i) { + while (num>= nums[i]) { + num -= nums[i]; + ans += romans[i]; + } + } + return ans; +} +``` + ### **...** ``` diff --git a/solution/0000-0099/0012.Integer to Roman/Solution.ts b/solution/0000-0099/0012.Integer to Roman/Solution.ts new file mode 100644 index 0000000000000..761ed3cf8dd5e --- /dev/null +++ b/solution/0000-0099/0012.Integer to Roman/Solution.ts @@ -0,0 +1,28 @@ +function intToRoman(num: number): string { + const nums: number[] = [ + 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1, + ]; + const romans: string[] = [ + 'M', + 'CM', + 'D', + 'CD', + 'C', + 'XC', + 'L', + 'XL', + 'X', + 'IX', + 'V', + 'IV', + 'I', + ]; + let ans: string = ''; + for (let i = 0; i < nums.length; ++i) { + while (num>= nums[i]) { + num -= nums[i]; + ans += romans[i]; + } + } + return ans; +} From 42503199f3f0a766060d9b15bb2a4823cf73789a Mon Sep 17 00:00:00 2001 From: yanglbme Date: 2023年3月30日 08:58:39 +0800 Subject: [PATCH 09/14] feat: add solutions to lc problem: No.1637 No.1637.Widest Vertical Area Between Two Points Containing No Points --- .../README.md | 242 +++++++++++++++++- .../README_EN.md | 216 ++++++++++++++++ .../Solution.cpp | 27 +- .../Solution.go | 41 ++- .../Solution.java | 33 ++- .../Solution.js | 29 ++- .../Solution.py | 20 +- .../Solution.ts | 27 +- 8 files changed, 613 insertions(+), 22 deletions(-) diff --git a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/README.md b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/README.md index 44b3aee8010ea..d263247184935 100644 --- a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/README.md +++ b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/README.md @@ -46,9 +46,31 @@ **方法一:排序** -我们可以对 `points` 按照 $x$ 升序排列,获取相邻点之间 $x$ 的差值的最大值。 +我们可以对数组 $points$ 按照 $x$ 升序排列,获取相邻点之间 $x$ 的差值的最大值。 -时间复杂度 $O(n \times \log n),ドル空间复杂度 $O(\log n)$。其中 $n$ 为 `points` 的长度。 +时间复杂度 $O(n \times \log n),ドル空间复杂度 $O(\log n)$。其中 $n$ 为数组 $points$ 的长度。 + +**方法二:桶排序** + +方法一中排序的时间复杂度为 $O(n \times \log n),ドル其实我们可以利用桶排序的思想,将时间复杂度降低到 $O(n)$。 + +我们将数组 $points$ 的横坐标放入数组 $nums$ 中。 + +假设数组 $nums$ 有 $n$ 个元素,所有元素从小到大依次是 $nums_0$ 到 $nums_{n - 1},ドル最大间距是 $maxGap$。考虑数组中的最大元素和最小元素之差: + +$$ +nums_{n - 1} - nums_0 = \sum_{i = 1}^{n - 1} (nums_i - nums_{i - 1}) \le{maxGap} \times (n - 1) +$$ + +因此 $maxGap \ge \dfrac{nums_{n - 1} - nums_0}{n - 1},ドル即最大间距至少为 $\dfrac{nums_{n - 1} - nums_0}{n - 1}$。 + +可以利用桶排序的思想,设定桶的大小(即每个桶最多包含的不同元素个数)为 $\dfrac{nums_{n - 1} - nums_0}{n - 1},ドル将元素按照元素值均匀分布到各个桶内,则同一个桶内的任意两个元素之差小于 ${maxGap},ドル差为 ${maxGap}$ 的两个元素一定在两个不同的桶内。对于每个桶,维护桶内的最小值和最大值,初始时每个桶内的最小值和最大值分别是正无穷和负无穷,表示桶内没有元素。 + +遍历数组 ${nums}$ 中的所有元素。对于每个元素,根据该元素与最小元素之差以及桶的大小计算该元素应该分到的桶的编号,可以确保编号小的桶内的元素都小于编号大的桶内的元素,使用元素值更新元素所在的桶内的最小值和最大值。 + +遍历数组结束之后,每个非空的桶内的最小值和最大值都可以确定。按照桶的编号从小到大的顺序依次遍历每个桶,当前的桶的最小值和上一个非空的桶的最大值是排序后的相邻元素,计算两个相邻元素之差,并更新最大间距。遍历桶结束之后即可得到最大间距。 + +时间复杂度 $O(n),ドル空间复杂度 $O(n)$。其中 $n$ 为数组 $points$ 的长度。 @@ -63,6 +85,29 @@ class Solution: return max(b[0] - a[0] for a, b in pairwise(points)) ``` +```python +class Solution: + def maxWidthOfVerticalArea(self, points: List[List[int]]) -> int: + nums = [x for x, _ in points] + n = len(nums) + mi, mx = min(nums), max(nums) + bucket_size = max(1, (mx - mi) // (n - 1)) + bucket_count = (mx - mi) // bucket_size + 1 + buckets = [[inf, -inf] for _ in range(bucket_count)] + for x in nums: + i = (x - mi) // bucket_size + buckets[i][0] = min(buckets[i][0], x) + buckets[i][1] = max(buckets[i][1], x) + ans = 0 + prev = inf + for curmin, curmax in buckets: + if curmin> curmax: + continue + ans = max(ans, curmin - prev) + prev = curmax + return ans +``` + ### **Java** @@ -80,6 +125,46 @@ class Solution { } ``` +```java +class Solution { + public int maxWidthOfVerticalArea(int[][] points) { + int n = points.length; + int[] nums = new int[n]; + for (int i = 0; i < n; ++i) { + nums[i] = points[i][0]; + } + final int inf = 1 << 30; + int mi = inf, mx = -inf; + for (int v : nums) { + mi = Math.min(mi, v); + mx = Math.max(mx, v); + } + int bucketSize = Math.max(1, (mx - mi) / (n - 1)); + int bucketCount = (mx - mi) / bucketSize + 1; + int[][] buckets = new int[bucketCount][2]; + for (var bucket : buckets) { + bucket[0] = inf; + bucket[1] = -inf; + } + for (int v : nums) { + int i = (v - mi) / bucketSize; + buckets[i][0] = Math.min(buckets[i][0], v); + buckets[i][1] = Math.max(buckets[i][1], v); + } + int prev = inf; + int ans = 0; + for (var bucket : buckets) { + if (bucket[0]> bucket[1]) { + continue; + } + ans = Math.max(ans, bucket[0] - prev); + prev = bucket[1]; + } + return ans; + } +} +``` + ### **C++** ```cpp @@ -96,6 +181,41 @@ public: }; ``` +```cpp +class Solution { +public: + int maxWidthOfVerticalArea(vector>& points) { + int n = points.size(); + vector nums; + for (auto& p : points) { + nums.push_back(p[0]); + } + const int inf = 1 << 30; + int mi = inf, mx = -inf; + for (int v : nums) { + mi = min(mi, v); + mx = max(mx, v); + } + int bucketSize = max(1, (mx - mi) / (n - 1)); + int bucketCount = (mx - mi) / bucketSize + 1; + vector> buckets(bucketCount, {inf, -inf}); + for (int v : nums) { + int i = (v - mi) / bucketSize; + buckets[i].first = min(buckets[i].first, v); + buckets[i].second = max(buckets[i].second, v); + } + int ans = 0; + int prev = inf; + for (auto [curmin, curmax] : buckets) { + if (curmin> curmax) continue; + ans = max(ans, curmin - prev); + prev = curmax; + } + return ans; + } +}; +``` + ### **Go** ```go @@ -115,6 +235,56 @@ func max(a, b int) int { } ``` +```go +func maxWidthOfVerticalArea(points [][]int) (ans int) { + n := len(points) + nums := make([]int, 0, n) + for _, p := range points { + nums = append(nums, p[0]) + } + const inf = 1 << 30 + mi, mx := inf, -inf + for _, v := range nums { + mi = min(mi, v) + mx = max(mx, v) + } + bucketSize := max(1, (mx-mi)/(n-1)) + bucketCount := (mx-mi)/bucketSize + 1 + buckets := make([][]int, bucketCount) + for i := range buckets { + buckets[i] = []int{inf, -inf} + } + for _, v := range nums { + i := (v - mi) / bucketSize + buckets[i][0] = min(buckets[i][0], v) + buckets[i][1] = max(buckets[i][1], v) + } + prev := inf + for _, bucket := range buckets { + if bucket[0]> bucket[1] { + continue + } + ans = max(ans, bucket[0]-prev) + prev = bucket[1] + } + return ans +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func max(a, b int) int { + if a> b { + return a + } + return b +} +``` + ### **TypeScript** ```ts @@ -128,6 +298,38 @@ function maxWidthOfVerticalArea(points: number[][]): number { } ``` +```ts +function maxWidthOfVerticalArea(points: number[][]): number { + const nums: number[] = points.map(point => point[0]); + const inf = 1 << 30; + const n = nums.length; + let mi = inf; + let mx = -inf; + for (const x of nums) { + mi = Math.min(mi, x); + mx = Math.max(mx, x); + } + const bucketSize = Math.max(1, Math.floor((mx - mi) / (n - 1))); + const bucketCount = Math.floor((mx - mi) / bucketSize) + 1; + const buckets = new Array(bucketCount).fill(0).map(() => [inf, -inf]); + for (const x of nums) { + const i = Math.floor((x - mi) / bucketSize); + buckets[i][0] = Math.min(buckets[i][0], x); + buckets[i][1] = Math.max(buckets[i][1], x); + } + let prev = inf; + let ans = 0; + for (const [left, right] of buckets) { + if (left> right) { + continue; + } + ans = Math.max(ans, left - prev); + prev = right; + } + return ans; +} +``` + ### **JavaScript** ```js @@ -147,6 +349,42 @@ var maxWidthOfVerticalArea = function (points) { }; ``` +```js +/** + * @param {number[][]} points + * @return {number} + */ +var maxWidthOfVerticalArea = function (points) { + const nums = points.map(point => point[0]); + const inf = 1 << 30; + const n = nums.length; + let mi = inf; + let mx = -inf; + for (const x of nums) { + mi = Math.min(mi, x); + mx = Math.max(mx, x); + } + const bucketSize = Math.max(1, Math.floor((mx - mi) / (n - 1))); + const bucketCount = Math.floor((mx - mi) / bucketSize) + 1; + const buckets = new Array(bucketCount).fill(0).map(() => [inf, -inf]); + for (const x of nums) { + const i = Math.floor((x - mi) / bucketSize); + buckets[i][0] = Math.min(buckets[i][0], x); + buckets[i][1] = Math.max(buckets[i][1], x); + } + let prev = inf; + let ans = 0; + for (const [left, right] of buckets) { + if (left> right) { + continue; + } + ans = Math.max(ans, left - prev); + prev = right; + } + return ans; +}; +``` + ### **...** ``` diff --git a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/README_EN.md b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/README_EN.md index 8c4ce85fb299d..8bd5e0bfc3862 100644 --- a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/README_EN.md +++ b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/README_EN.md @@ -49,6 +49,29 @@ class Solution: return max(b[0] - a[0] for a, b in pairwise(points)) ``` +```python +class Solution: + def maxWidthOfVerticalArea(self, points: List[List[int]]) -> int: + nums = [x for x, _ in points] + n = len(nums) + mi, mx = min(nums), max(nums) + bucket_size = max(1, (mx - mi) // (n - 1)) + bucket_count = (mx - mi) // bucket_size + 1 + buckets = [[inf, -inf] for _ in range(bucket_count)] + for x in nums: + i = (x - mi) // bucket_size + buckets[i][0] = min(buckets[i][0], x) + buckets[i][1] = max(buckets[i][1], x) + ans = 0 + prev = inf + for curmin, curmax in buckets: + if curmin> curmax: + continue + ans = max(ans, curmin - prev) + prev = curmax + return ans +``` + ### **Java** ```java @@ -64,6 +87,46 @@ class Solution { } ``` +```java +class Solution { + public int maxWidthOfVerticalArea(int[][] points) { + int n = points.length; + int[] nums = new int[n]; + for (int i = 0; i < n; ++i) { + nums[i] = points[i][0]; + } + final int inf = 1 << 30; + int mi = inf, mx = -inf; + for (int v : nums) { + mi = Math.min(mi, v); + mx = Math.max(mx, v); + } + int bucketSize = Math.max(1, (mx - mi) / (n - 1)); + int bucketCount = (mx - mi) / bucketSize + 1; + int[][] buckets = new int[bucketCount][2]; + for (var bucket : buckets) { + bucket[0] = inf; + bucket[1] = -inf; + } + for (int v : nums) { + int i = (v - mi) / bucketSize; + buckets[i][0] = Math.min(buckets[i][0], v); + buckets[i][1] = Math.max(buckets[i][1], v); + } + int prev = inf; + int ans = 0; + for (var bucket : buckets) { + if (bucket[0]> bucket[1]) { + continue; + } + ans = Math.max(ans, bucket[0] - prev); + prev = bucket[1]; + } + return ans; + } +} +``` + ### **C++** ```cpp @@ -80,6 +143,41 @@ public: }; ``` +```cpp +class Solution { +public: + int maxWidthOfVerticalArea(vector>& points) { + int n = points.size(); + vector nums; + for (auto& p : points) { + nums.push_back(p[0]); + } + const int inf = 1 << 30; + int mi = inf, mx = -inf; + for (int v : nums) { + mi = min(mi, v); + mx = max(mx, v); + } + int bucketSize = max(1, (mx - mi) / (n - 1)); + int bucketCount = (mx - mi) / bucketSize + 1; + vector> buckets(bucketCount, {inf, -inf}); + for (int v : nums) { + int i = (v - mi) / bucketSize; + buckets[i].first = min(buckets[i].first, v); + buckets[i].second = max(buckets[i].second, v); + } + int ans = 0; + int prev = inf; + for (auto [curmin, curmax] : buckets) { + if (curmin> curmax) continue; + ans = max(ans, curmin - prev); + prev = curmax; + } + return ans; + } +}; +``` + ### **Go** ```go @@ -99,6 +197,56 @@ func max(a, b int) int { } ``` +```go +func maxWidthOfVerticalArea(points [][]int) (ans int) { + n := len(points) + nums := make([]int, 0, n) + for _, p := range points { + nums = append(nums, p[0]) + } + const inf = 1 << 30 + mi, mx := inf, -inf + for _, v := range nums { + mi = min(mi, v) + mx = max(mx, v) + } + bucketSize := max(1, (mx-mi)/(n-1)) + bucketCount := (mx-mi)/bucketSize + 1 + buckets := make([][]int, bucketCount) + for i := range buckets { + buckets[i] = []int{inf, -inf} + } + for _, v := range nums { + i := (v - mi) / bucketSize + buckets[i][0] = min(buckets[i][0], v) + buckets[i][1] = max(buckets[i][1], v) + } + prev := inf + for _, bucket := range buckets { + if bucket[0]> bucket[1] { + continue + } + ans = max(ans, bucket[0]-prev) + prev = bucket[1] + } + return ans +} + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func max(a, b int) int { + if a> b { + return a + } + return b +} +``` + ### **TypeScript** ```ts @@ -112,6 +260,38 @@ function maxWidthOfVerticalArea(points: number[][]): number { } ``` +```ts +function maxWidthOfVerticalArea(points: number[][]): number { + const nums: number[] = points.map(point => point[0]); + const inf = 1 << 30; + const n = nums.length; + let mi = inf; + let mx = -inf; + for (const x of nums) { + mi = Math.min(mi, x); + mx = Math.max(mx, x); + } + const bucketSize = Math.max(1, Math.floor((mx - mi) / (n - 1))); + const bucketCount = Math.floor((mx - mi) / bucketSize) + 1; + const buckets = new Array(bucketCount).fill(0).map(() => [inf, -inf]); + for (const x of nums) { + const i = Math.floor((x - mi) / bucketSize); + buckets[i][0] = Math.min(buckets[i][0], x); + buckets[i][1] = Math.max(buckets[i][1], x); + } + let prev = inf; + let ans = 0; + for (const [left, right] of buckets) { + if (left> right) { + continue; + } + ans = Math.max(ans, left - prev); + prev = right; + } + return ans; +} +``` + ### **JavaScript** ```js @@ -131,6 +311,42 @@ var maxWidthOfVerticalArea = function (points) { }; ``` +```js +/** + * @param {number[][]} points + * @return {number} + */ +var maxWidthOfVerticalArea = function (points) { + const nums = points.map(point => point[0]); + const inf = 1 << 30; + const n = nums.length; + let mi = inf; + let mx = -inf; + for (const x of nums) { + mi = Math.min(mi, x); + mx = Math.max(mx, x); + } + const bucketSize = Math.max(1, Math.floor((mx - mi) / (n - 1))); + const bucketCount = Math.floor((mx - mi) / bucketSize) + 1; + const buckets = new Array(bucketCount).fill(0).map(() => [inf, -inf]); + for (const x of nums) { + const i = Math.floor((x - mi) / bucketSize); + buckets[i][0] = Math.min(buckets[i][0], x); + buckets[i][1] = Math.max(buckets[i][1], x); + } + let prev = inf; + let ans = 0; + for (const [left, right] of buckets) { + if (left> right) { + continue; + } + ans = Math.max(ans, left - prev); + prev = right; + } + return ans; +}; +``` + ### **...** ``` diff --git a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.cpp b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.cpp index 3e0a01ca907c2..f30c039ffe5cc 100644 --- a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.cpp +++ b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.cpp @@ -1,10 +1,31 @@ class Solution { public: int maxWidthOfVerticalArea(vector>& points) { - sort(points.begin(), points.end()); + int n = points.size(); + vector nums; + for (auto& p : points) { + nums.push_back(p[0]); + } + const int inf = 1 << 30; + int mi = inf, mx = -inf; + for (int v : nums) { + mi = min(mi, v); + mx = max(mx, v); + } + int bucketSize = max(1, (mx - mi) / (n - 1)); + int bucketCount = (mx - mi) / bucketSize + 1; + vector> buckets(bucketCount, {inf, -inf}); + for (int v : nums) { + int i = (v - mi) / bucketSize; + buckets[i].first = min(buckets[i].first, v); + buckets[i].second = max(buckets[i].second, v); + } int ans = 0; - for (int i = 0; i < points.size() - 1; ++i) { - ans = max(ans, points[i + 1][0] - points[i][0]); + int prev = inf; + for (auto [curmin, curmax] : buckets) { + if (curmin> curmax) continue; + ans = max(ans, curmin - prev); + prev = curmax; } return ans; } diff --git a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.go b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.go index e67a9c0fad871..d1b0d59c810f5 100644 --- a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.go +++ b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.go @@ -1,9 +1,42 @@ func maxWidthOfVerticalArea(points [][]int) (ans int) { - sort.Slice(points, func(i, j int) bool { return points[i][0] < points[j][0] }) - for i, p := range points[1:] { - ans = max(ans, p[0]-points[i][0]) + n := len(points) + nums := make([]int, 0, n) + for _, p := range points { + nums = append(nums, p[0]) } - return + const inf = 1 << 30 + mi, mx := inf, -inf + for _, v := range nums { + mi = min(mi, v) + mx = max(mx, v) + } + bucketSize := max(1, (mx-mi)/(n-1)) + bucketCount := (mx-mi)/bucketSize + 1 + buckets := make([][]int, bucketCount) + for i := range buckets { + buckets[i] = []int{inf, -inf} + } + for _, v := range nums { + i := (v - mi) / bucketSize + buckets[i][0] = min(buckets[i][0], v) + buckets[i][1] = max(buckets[i][1], v) + } + prev := inf + for _, bucket := range buckets { + if bucket[0]> bucket[1] { + continue + } + ans = max(ans, bucket[0]-prev) + prev = bucket[1] + } + return ans +} + +func min(a, b int) int { + if a < b { + return a + } + return b } func max(a, b int) int { diff --git a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.java b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.java index 84685fb326daa..843c855848d09 100644 --- a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.java +++ b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.java @@ -1,9 +1,36 @@ class Solution { public int maxWidthOfVerticalArea(int[][] points) { - Arrays.sort(points, (a, b) -> a[0] - b[0]); + int n = points.length; + int[] nums = new int[n]; + for (int i = 0; i < n; ++i) { + nums[i] = points[i][0]; + } + final int inf = 1 << 30; + int mi = inf, mx = -inf; + for (int v : nums) { + mi = Math.min(mi, v); + mx = Math.max(mx, v); + } + int bucketSize = Math.max(1, (mx - mi) / (n - 1)); + int bucketCount = (mx - mi) / bucketSize + 1; + int[][] buckets = new int[bucketCount][2]; + for (var bucket : buckets) { + bucket[0] = inf; + bucket[1] = -inf; + } + for (int v : nums) { + int i = (v - mi) / bucketSize; + buckets[i][0] = Math.min(buckets[i][0], v); + buckets[i][1] = Math.max(buckets[i][1], v); + } + int prev = inf; int ans = 0; - for (int i = 0; i < points.length - 1; ++i) { - ans = Math.max(ans, points[i + 1][0] - points[i][0]); + for (var bucket : buckets) { + if (bucket[0]> bucket[1]) { + continue; + } + ans = Math.max(ans, bucket[0] - prev); + prev = bucket[1]; } return ans; } diff --git a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.js b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.js index 0235cf3ea183a..be0cdd917bfe1 100644 --- a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.js +++ b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.js @@ -3,12 +3,31 @@ * @return {number} */ var maxWidthOfVerticalArea = function (points) { - points.sort((a, b) => a[0] - b[0]); + const nums = points.map(point => point[0]); + const inf = 1 << 30; + const n = nums.length; + let mi = inf; + let mx = -inf; + for (const x of nums) { + mi = Math.min(mi, x); + mx = Math.max(mx, x); + } + const bucketSize = Math.max(1, Math.floor((mx - mi) / (n - 1))); + const bucketCount = Math.floor((mx - mi) / bucketSize) + 1; + const buckets = new Array(bucketCount).fill(0).map(() => [inf, -inf]); + for (const x of nums) { + const i = Math.floor((x - mi) / bucketSize); + buckets[i][0] = Math.min(buckets[i][0], x); + buckets[i][1] = Math.max(buckets[i][1], x); + } + let prev = inf; let ans = 0; - let px = points[0][0]; - for (const [x, _] of points) { - ans = Math.max(ans, x - px); - px = x; + for (const [left, right] of buckets) { + if (left> right) { + continue; + } + ans = Math.max(ans, left - prev); + prev = right; } return ans; }; diff --git a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.py b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.py index 59eda36d0dc14..e2c8041f5ad4e 100644 --- a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.py +++ b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.py @@ -1,4 +1,20 @@ class Solution: def maxWidthOfVerticalArea(self, points: List[List[int]]) -> int: - points.sort() - return max(b[0] - a[0] for a, b in pairwise(points)) + nums = [x for x, _ in points] + n = len(nums) + mi, mx = min(nums), max(nums) + bucket_size = max(1, (mx - mi) // (n - 1)) + bucket_count = (mx - mi) // bucket_size + 1 + buckets = [[inf, -inf] for _ in range(bucket_count)] + for x in nums: + i = (x - mi) // bucket_size + buckets[i][0] = min(buckets[i][0], x) + buckets[i][1] = max(buckets[i][1], x) + ans = 0 + prev = inf + for curmin, curmax in buckets: + if curmin> curmax: + continue + ans = max(ans, curmin - prev) + prev = curmax + return ans \ No newline at end of file diff --git a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.ts b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.ts index 73c5f6e96f80d..a924094593e5c 100644 --- a/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.ts +++ b/solution/1600-1699/1637.Widest Vertical Area Between Two Points Containing No Points/Solution.ts @@ -1,8 +1,29 @@ function maxWidthOfVerticalArea(points: number[][]): number { - points.sort((a, b) => a[0] - b[0]); + const nums: number[] = points.map(point => point[0]); + const inf = 1 << 30; + const n = nums.length; + let mi = inf; + let mx = -inf; + for (const x of nums) { + mi = Math.min(mi, x); + mx = Math.max(mx, x); + } + const bucketSize = Math.max(1, Math.floor((mx - mi) / (n - 1))); + const bucketCount = Math.floor((mx - mi) / bucketSize) + 1; + const buckets = new Array(bucketCount).fill(0).map(() => [inf, -inf]); + for (const x of nums) { + const i = Math.floor((x - mi) / bucketSize); + buckets[i][0] = Math.min(buckets[i][0], x); + buckets[i][1] = Math.max(buckets[i][1], x); + } + let prev = inf; let ans = 0; - for (let i = 1; i < points.length; ++i) { - ans = Math.max(ans, points[i][0] - points[i - 1][0]); + for (const [left, right] of buckets) { + if (left> right) { + continue; + } + ans = Math.max(ans, left - prev); + prev = right; } return ans; } From afd72a67aa3e32c1a8f634296bf81d82170fdec1 Mon Sep 17 00:00:00 2001 From: Atom Pi Date: 2023年3月30日 09:41:40 +0800 Subject: [PATCH 10/14] feat: add golang solution to lc problem: No.0087 (#959) No.0087.Scramble String --- .../0000-0099/0087.Scramble String/README.md | 37 +++++++++++++++++++ .../0087.Scramble String/README_EN.md | 37 +++++++++++++++++++ .../0087.Scramble String/Solution.go | 32 ++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 solution/0000-0099/0087.Scramble String/Solution.go diff --git a/solution/0000-0099/0087.Scramble String/README.md b/solution/0000-0099/0087.Scramble String/README.md index 389b65a8def7a..bf449b3986099 100644 --- a/solution/0000-0099/0087.Scramble String/README.md +++ b/solution/0000-0099/0087.Scramble String/README.md @@ -149,6 +149,43 @@ class Solution { } ``` +### **Go** + +```go +func isScramble(s1 string, s2 string) bool { + n := len(s1) + dp := make([][][]bool, n+1) + for i := range dp { + dp[i] = make([][]bool, n) + for j := range dp[i] { + dp[i][j] = make([]bool, n+1) + } + } + for i := 0; i < n; i++ { + for j := 0; j < n; j++ { + dp[i][j][1] = s1[i] == s2[j] + } + } + for l := 2; l < n+1; l++ { + for i1 := 0; i1 < n-l+1; i1++ { + for i2 := 0; i2 < n-l+1; i2++ { + for i := 1; i < l; i++ { + if dp[i1][i2][i] && dp[i1+i][i2+i][l-i] { + dp[i1][i2][l] = true + break + } + if dp[i1][i2+l-i][i] && dp[i1+i][i2][l-i] { + dp[i1][i2][l] = true + break + } + } + } + } + } + return dp[0][0][n] +} +``` + ### **...** ``` diff --git a/solution/0000-0099/0087.Scramble String/README_EN.md b/solution/0000-0099/0087.Scramble String/README_EN.md index e0ea809ea9920..32d6455af70e8 100644 --- a/solution/0000-0099/0087.Scramble String/README_EN.md +++ b/solution/0000-0099/0087.Scramble String/README_EN.md @@ -119,6 +119,43 @@ class Solution { } ``` +### **Go** + +```go +func isScramble(s1 string, s2 string) bool { + n := len(s1) + dp := make([][][]bool, n+1) + for i := range dp { + dp[i] = make([][]bool, n) + for j := range dp[i] { + dp[i][j] = make([]bool, n+1) + } + } + for i := 0; i < n; i++ { + for j := 0; j < n; j++ { + dp[i][j][1] = s1[i] == s2[j] + } + } + for l := 2; l < n+1; l++ { + for i1 := 0; i1 < n-l+1; i1++ { + for i2 := 0; i2 < n-l+1; i2++ { + for i := 1; i < l; i++ { + if dp[i1][i2][i] && dp[i1+i][i2+i][l-i] { + dp[i1][i2][l] = true + break + } + if dp[i1][i2+l-i][i] && dp[i1+i][i2][l-i] { + dp[i1][i2][l] = true + break + } + } + } + } + } + return dp[0][0][n] +} +``` + ### **...** ``` diff --git a/solution/0000-0099/0087.Scramble String/Solution.go b/solution/0000-0099/0087.Scramble String/Solution.go new file mode 100644 index 0000000000000..3dc1ecf4aabe5 --- /dev/null +++ b/solution/0000-0099/0087.Scramble String/Solution.go @@ -0,0 +1,32 @@ +func isScramble(s1 string, s2 string) bool { + n := len(s1) + dp := make([][][]bool, n+1) + for i := range dp { + dp[i] = make([][]bool, n) + for j := range dp[i] { + dp[i][j] = make([]bool, n+1) + } + } + for i := 0; i < n; i++ { + for j := 0; j < n; j++ { + dp[i][j][1] = s1[i] == s2[j] + } + } + for l := 2; l < n+1; l++ { + for i1 := 0; i1 < n-l+1; i1++ { + for i2 := 0; i2 < n-l+1; i2++ { + for i := 1; i < l; i++ { + if dp[i1][i2][i] && dp[i1+i][i2+i][l-i] { + dp[i1][i2][l] = true + break + } + if dp[i1][i2+l-i][i] && dp[i1+i][i2][l-i] { + dp[i1][i2][l] = true + break + } + } + } + } + } + return dp[0][0][n] +} From a615012f6bd207f81130f6c1eb2102e286ef94aa Mon Sep 17 00:00:00 2001 From: yanglbme Date: 2023年3月30日 10:17:36 +0800 Subject: [PATCH 11/14] feat: add solutions to lc problem: No.1854 No.1854.Maximum Population Year --- .../README.md | 2 - .../README_EN.md | 2 - .../1854.Maximum Population Year/README.md | 183 +++++++++++------- .../1854.Maximum Population Year/README_EN.md | 177 ++++++++++------- .../1854.Maximum Population Year/Solution.cpp | 27 +-- .../1854.Maximum Population Year/Solution.go | 21 +- .../Solution.java | 26 +-- .../1854.Maximum Population Year/Solution.js | 27 ++- .../1854.Maximum Population Year/Solution.py | 24 +-- .../1854.Maximum Population Year/Solution.ts | 17 ++ 10 files changed, 295 insertions(+), 211 deletions(-) create mode 100644 solution/1800-1899/1854.Maximum Population Year/Solution.ts diff --git a/solution/1800-1899/1850.Minimum Adjacent Swaps to Reach the Kth Smallest Number/README.md b/solution/1800-1899/1850.Minimum Adjacent Swaps to Reach the Kth Smallest Number/README.md index 26f7a96b7c126..4e1748f6f2f94 100644 --- a/solution/1800-1899/1850.Minimum Adjacent Swaps to Reach the Kth Smallest Number/README.md +++ b/solution/1800-1899/1850.Minimum Adjacent Swaps to Reach the Kth Smallest Number/README.md @@ -12,7 +12,6 @@
  • 例如,num = "5489355142" : -
    • 第 1 个最小妙数是 "5489355214"
    • 第 2 个最小妙数是 "5489355241"
    • @@ -20,7 +19,6 @@
    • 第 4 个最小妙数是 "5489355421"
  • -

返回要得到第 k最小妙数 需要对 num 执行的 相邻位数字交换的最小次数

diff --git a/solution/1800-1899/1850.Minimum Adjacent Swaps to Reach the Kth Smallest Number/README_EN.md b/solution/1800-1899/1850.Minimum Adjacent Swaps to Reach the Kth Smallest Number/README_EN.md index c028dedd18bc8..c2d7e2e84083c 100644 --- a/solution/1800-1899/1850.Minimum Adjacent Swaps to Reach the Kth Smallest Number/README_EN.md +++ b/solution/1800-1899/1850.Minimum Adjacent Swaps to Reach the Kth Smallest Number/README_EN.md @@ -10,7 +10,6 @@
  • For example, when num = "5489355142": -
    • The 1st smallest wonderful integer is "5489355214".
    • The 2nd smallest wonderful integer is "5489355241".
    • @@ -18,7 +17,6 @@
    • The 4th smallest wonderful integer is "5489355421".
  • -

Return the minimum number of adjacent digit swaps that needs to be applied to num to reach the kth smallest wonderful integer.

diff --git a/solution/1800-1899/1854.Maximum Population Year/README.md b/solution/1800-1899/1854.Maximum Population Year/README.md index cb7c556d1cf6d..c488007b50a17 100644 --- a/solution/1800-1899/1854.Maximum Population Year/README.md +++ b/solution/1800-1899/1854.Maximum Population Year/README.md @@ -44,6 +44,12 @@ **方法一:差分数组** +我们注意到,年份的范围是 $[1950,..2050],ドル因此我们可以将这些年份映射到一个长度为 101ドル$ 的数组 $d$ 中,数组的下标表示年份减去 1950ドル$ 的值。 + +接下来遍历 $logs,ドル对于每个人,我们将 $d[birth_i - 1950]$ 加 1ドル,ドル将 $d[death_i - 1950]$ 减 1ドル$。最后遍历数组 $d,ドル求出前缀和的最大值,即为人口最多的年份,再加上 1950ドル$ 即为答案。 + +时间复杂度 $O(n),ドル空间复杂度 $O(C)$。其中 $n$ 为数组 $logs$ 的长度;而 $C$ 为年份的范围大小,即 2050ドル - 1950 + 1 = 101$。 + ### **Python3** @@ -53,18 +59,18 @@ ```python class Solution: def maximumPopulation(self, logs: List[List[int]]) -> int: - delta = [0] * 2055 - for birth, death in logs: - delta[birth] += 1 - delta[death] -= 1 - - mx = res = cur = 0 - for i, v in enumerate(delta): - cur += v - if mx < cur: - mx = cur - res = i - return res + d = [0] * 101 + offset = 1950 + for a, b in logs: + a, b = a - offset, b - offset + d[a] += 1 + d[b] -= 1 + s = mx = j = 0 + for i, x in enumerate(d): + s += x + if mx < s: + mx, j = s, i + return j + offset ``` ### **Java** @@ -74,74 +80,52 @@ class Solution: ```java class Solution { public int maximumPopulation(int[][] logs) { - int[] delta = new int[2055]; - for (int[] log : logs) { - ++delta[log[0]]; - --delta[log[1]]; + int[] d = new int[101]; + final int offset = 1950; + for (var log : logs) { + int a = log[0] - offset; + int b = log[1] - offset; + ++d[a]; + --d[b]; } - int res = 0, mx = 0, cur = 0; - for (int i = 0; i < delta.length; ++i) { - cur += delta[i]; - if (cur> mx) { - mx = cur; - res = i; + int s = 0, mx = 0; + int j = 0; + for (int i = 0; i < d.length; ++i) { + s += d[i]; + if (mx < s) { + mx = s; + j = i; } } - return res; + return j + offset; } } ``` -### **JavaScript** - -```js -/** - * @param {number[][]} logs - * @return {number} - */ -var maximumPopulation = function (logs) { - const offset = 1950; - const len = 2050 - 1950 + 1; - let delta = new Array(len).fill(0); - for (let log of logs) { - delta[log[0] - offset] += 1; - delta[log[1] - offset] -= 1; - } - let max = 0; - let total = 0; - let index = 0; - for (let i = 0; i < len; i++) { - total += delta[i]; - if (total> max) { - max = total; - index = i; - } - } - return index + offset; -}; -``` - ### **C++** ```cpp class Solution { public: int maximumPopulation(vector>& logs) { - vector delta(101, 0); - int offset = 1950; - for (auto log : logs) { - ++delta[log[0] - offset]; - --delta[log[1] - offset]; + int d[101]{}; + const int offset = 1950; + for (auto& log : logs) { + int a = log[0] - offset; + int b = log[1] - offset; + ++d[a]; + --d[b]; } - int res = 0, mx = 0, cur = 0; - for (int i = 0; i < delta.size(); ++i) { - cur += delta[i]; - if (cur> mx) { - mx = cur; - res = i; + int s = 0, mx = 0; + int j = 0; + for (int i = 0; i < 101; ++i) { + s += d[i]; + if (mx < s) { + mx = s; + j = i; } } - return res + offset; + return j + offset; } }; ``` @@ -150,21 +134,72 @@ public: ```go func maximumPopulation(logs [][]int) int { - delta := make([]int, 101) + d := [101]int{} offset := 1950 for _, log := range logs { - delta[log[0]-offset]++ - delta[log[1]-offset]-- + a, b := log[0]-offset, log[1]-offset + d[a]++ + d[b]-- } - res, mx, cur := 0, 0, 0 - for i := 0; i < len(delta); i++ { - cur += delta[i] - if cur> mx { - mx = cur - res = i + var s, mx, j int + for i, x := range d { + s += x + if mx < s { + mx = s + j = i } } - return res + offset + return j + offset +} +``` + +### **JavaScript** + +```js +/** + * @param {number[][]} logs + * @return {number} + */ +var maximumPopulation = function (logs) { + const d = new Array(101).fill(0); + const offset = 1950; + for (let [a, b] of logs) { + a -= offset; + b -= offset; + d[a]++; + d[b]--; + } + let j = 0; + for (let i = 0, s = 0, mx = 0; i < 101; ++i) { + s += d[i]; + if (mx < s) { + mx = s; + j = i; + } + } + return j + offset; +}; +``` + +### **TypeScript** + +```ts +function maximumPopulation(logs: number[][]): number { + const d: number[] = new Array(101).fill(0); + const offset = 1950; + for (const [birth, death] of logs) { + d[birth - offset]++; + d[death - offset]--; + } + let j = 0; + for (let i = 0, s = 0, mx = 0; i < d.length; ++i) { + s += d[i]; + if (mx < s) { + mx = s; + j = i; + } + } + return j + offset; } ``` diff --git a/solution/1800-1899/1854.Maximum Population Year/README_EN.md b/solution/1800-1899/1854.Maximum Population Year/README_EN.md index 169fb046321b4..1bb8aa8f90570 100644 --- a/solution/1800-1899/1854.Maximum Population Year/README_EN.md +++ b/solution/1800-1899/1854.Maximum Population Year/README_EN.md @@ -45,18 +45,18 @@ The earlier year between them is 1960. ```python class Solution: def maximumPopulation(self, logs: List[List[int]]) -> int: - delta = [0] * 2055 - for birth, death in logs: - delta[birth] += 1 - delta[death] -= 1 - - mx = res = cur = 0 - for i, v in enumerate(delta): - cur += v - if mx < cur: - mx = cur - res = i - return res + d = [0] * 101 + offset = 1950 + for a, b in logs: + a, b = a - offset, b - offset + d[a] += 1 + d[b] -= 1 + s = mx = j = 0 + for i, x in enumerate(d): + s += x + if mx < s: + mx, j = s, i + return j + offset ``` ### **Java** @@ -64,74 +64,52 @@ class Solution: ```java class Solution { public int maximumPopulation(int[][] logs) { - int[] delta = new int[2055]; - for (int[] log : logs) { - ++delta[log[0]]; - --delta[log[1]]; + int[] d = new int[101]; + final int offset = 1950; + for (var log : logs) { + int a = log[0] - offset; + int b = log[1] - offset; + ++d[a]; + --d[b]; } - int res = 0, mx = 0, cur = 0; - for (int i = 0; i < delta.length; ++i) { - cur += delta[i]; - if (cur> mx) { - mx = cur; - res = i; + int s = 0, mx = 0; + int j = 0; + for (int i = 0; i < d.length; ++i) { + s += d[i]; + if (mx < s) { + mx = s; + j = i; } } - return res; + return j + offset; } } ``` -### **JavaScript** - -```js -/** - * @param {number[][]} logs - * @return {number} - */ -var maximumPopulation = function (logs) { - const offset = 1950; - const len = 2050 - 1950 + 1; - let delta = new Array(len).fill(0); - for (let log of logs) { - delta[log[0] - offset] += 1; - delta[log[1] - offset] -= 1; - } - let max = 0; - let total = 0; - let index = 0; - for (let i = 0; i < len; i++) { - total += delta[i]; - if (total> max) { - max = total; - index = i; - } - } - return index + offset; -}; -``` - ### **C++** ```cpp class Solution { public: int maximumPopulation(vector>& logs) { - vector delta(101, 0); - int offset = 1950; - for (auto log : logs) { - ++delta[log[0] - offset]; - --delta[log[1] - offset]; + int d[101]{}; + const int offset = 1950; + for (auto& log : logs) { + int a = log[0] - offset; + int b = log[1] - offset; + ++d[a]; + --d[b]; } - int res = 0, mx = 0, cur = 0; - for (int i = 0; i < delta.size(); ++i) { - cur += delta[i]; - if (cur> mx) { - mx = cur; - res = i; + int s = 0, mx = 0; + int j = 0; + for (int i = 0; i < 101; ++i) { + s += d[i]; + if (mx < s) { + mx = s; + j = i; } } - return res + offset; + return j + offset; } }; ``` @@ -140,21 +118,72 @@ public: ```go func maximumPopulation(logs [][]int) int { - delta := make([]int, 101) + d := [101]int{} offset := 1950 for _, log := range logs { - delta[log[0]-offset]++ - delta[log[1]-offset]-- + a, b := log[0]-offset, log[1]-offset + d[a]++ + d[b]-- } - res, mx, cur := 0, 0, 0 - for i := 0; i < len(delta); i++ { - cur += delta[i] - if cur> mx { - mx = cur - res = i + var s, mx, j int + for i, x := range d { + s += x + if mx < s { + mx = s + j = i } } - return res + offset + return j + offset +} +``` + +### **JavaScript** + +```js +/** + * @param {number[][]} logs + * @return {number} + */ +var maximumPopulation = function (logs) { + const d = new Array(101).fill(0); + const offset = 1950; + for (let [a, b] of logs) { + a -= offset; + b -= offset; + d[a]++; + d[b]--; + } + let j = 0; + for (let i = 0, s = 0, mx = 0; i < 101; ++i) { + s += d[i]; + if (mx < s) { + mx = s; + j = i; + } + } + return j + offset; +}; +``` + +### **TypeScript** + +```ts +function maximumPopulation(logs: number[][]): number { + const d: number[] = new Array(101).fill(0); + const offset = 1950; + for (const [birth, death] of logs) { + d[birth - offset]++; + d[death - offset]--; + } + let j = 0; + for (let i = 0, s = 0, mx = 0; i < d.length; ++i) { + s += d[i]; + if (mx < s) { + mx = s; + j = i; + } + } + return j + offset; } ``` diff --git a/solution/1800-1899/1854.Maximum Population Year/Solution.cpp b/solution/1800-1899/1854.Maximum Population Year/Solution.cpp index 1f46a15e2faaa..390960a24b852 100644 --- a/solution/1800-1899/1854.Maximum Population Year/Solution.cpp +++ b/solution/1800-1899/1854.Maximum Population Year/Solution.cpp @@ -1,20 +1,23 @@ class Solution { public: int maximumPopulation(vector>& logs) { - vector delta(101, 0); - int offset = 1950; - for (auto log : logs) { - ++delta[log[0] - offset]; - --delta[log[1] - offset]; + int d[101]{}; + const int offset = 1950; + for (auto& log : logs) { + int a = log[0] - offset; + int b = log[1] - offset; + ++d[a]; + --d[b]; } - int res = 0, mx = 0, cur = 0; - for (int i = 0; i < delta.size(); ++i) { - cur += delta[i]; - if (cur> mx) { - mx = cur; - res = i; + int s = 0, mx = 0; + int j = 0; + for (int i = 0; i < 101; ++i) { + s += d[i]; + if (mx < s) { + mx = s; + j = i; } } - return res + offset; + return j + offset; } }; \ No newline at end of file diff --git a/solution/1800-1899/1854.Maximum Population Year/Solution.go b/solution/1800-1899/1854.Maximum Population Year/Solution.go index 617a795f218d0..ab0c3f7bee4cb 100644 --- a/solution/1800-1899/1854.Maximum Population Year/Solution.go +++ b/solution/1800-1899/1854.Maximum Population Year/Solution.go @@ -1,17 +1,18 @@ func maximumPopulation(logs [][]int) int { - delta := make([]int, 101) + d := [101]int{} offset := 1950 for _, log := range logs { - delta[log[0]-offset]++ - delta[log[1]-offset]-- + a, b := log[0]-offset, log[1]-offset + d[a]++ + d[b]-- } - res, mx, cur := 0, 0, 0 - for i := 0; i < len(delta); i++ { - cur += delta[i] - if cur> mx { - mx = cur - res = i + var s, mx, j int + for i, x := range d { + s += x + if mx < s { + mx = s + j = i } } - return res + offset + return j + offset } \ No newline at end of file diff --git a/solution/1800-1899/1854.Maximum Population Year/Solution.java b/solution/1800-1899/1854.Maximum Population Year/Solution.java index 32a203a601640..ea1328babc3dd 100644 --- a/solution/1800-1899/1854.Maximum Population Year/Solution.java +++ b/solution/1800-1899/1854.Maximum Population Year/Solution.java @@ -1,18 +1,22 @@ class Solution { public int maximumPopulation(int[][] logs) { - int[] delta = new int[2055]; - for (int[] log : logs) { - ++delta[log[0]]; - --delta[log[1]]; + int[] d = new int[101]; + final int offset = 1950; + for (var log : logs) { + int a = log[0] - offset; + int b = log[1] - offset; + ++d[a]; + --d[b]; } - int res = 0, mx = 0, cur = 0; - for (int i = 0; i < delta.length; ++i) { - cur += delta[i]; - if (cur> mx) { - mx = cur; - res = i; + int s = 0, mx = 0; + int j = 0; + for (int i = 0; i < d.length; ++i) { + s += d[i]; + if (mx < s) { + mx = s; + j = i; } } - return res; + return j + offset; } } \ No newline at end of file diff --git a/solution/1800-1899/1854.Maximum Population Year/Solution.js b/solution/1800-1899/1854.Maximum Population Year/Solution.js index 621d1ef2172b3..08877ab2d009a 100644 --- a/solution/1800-1899/1854.Maximum Population Year/Solution.js +++ b/solution/1800-1899/1854.Maximum Population Year/Solution.js @@ -3,22 +3,21 @@ * @return {number} */ var maximumPopulation = function (logs) { + const d = new Array(101).fill(0); const offset = 1950; - const len = 2050 - 1950 + 1; - let delta = new Array(len).fill(0); - for (let log of logs) { - delta[log[0] - offset] += 1; - delta[log[1] - offset] -= 1; + for (let [a, b] of logs) { + a -= offset; + b -= offset; + d[a]++; + d[b]--; } - let max = 0; - let total = 0; - let index = 0; - for (let i = 0; i < len; i++) { - total += delta[i]; - if (total> max) { - max = total; - index = i; + let j = 0; + for (let i = 0, s = 0, mx = 0; i < 101; ++i) { + s += d[i]; + if (mx < s) { + mx = s; + j = i; } } - return index + offset; + return j + offset; }; diff --git a/solution/1800-1899/1854.Maximum Population Year/Solution.py b/solution/1800-1899/1854.Maximum Population Year/Solution.py index 3ac6ba301c8b4..a0deb94423c2d 100644 --- a/solution/1800-1899/1854.Maximum Population Year/Solution.py +++ b/solution/1800-1899/1854.Maximum Population Year/Solution.py @@ -1,14 +1,14 @@ class Solution: def maximumPopulation(self, logs: List[List[int]]) -> int: - delta = [0] * 2055 - for birth, death in logs: - delta[birth] += 1 - delta[death] -= 1 - - mx = res = cur = 0 - for i, v in enumerate(delta): - cur += v - if mx < cur: - mx = cur - res = i - return res + d = [0] * 101 + offset = 1950 + for a, b in logs: + a, b = a - offset, b - offset + d[a] += 1 + d[b] -= 1 + s = mx = j = 0 + for i, x in enumerate(d): + s += x + if mx < s: + mx, j = s, i + return j + offset diff --git a/solution/1800-1899/1854.Maximum Population Year/Solution.ts b/solution/1800-1899/1854.Maximum Population Year/Solution.ts new file mode 100644 index 0000000000000..95e149da12283 --- /dev/null +++ b/solution/1800-1899/1854.Maximum Population Year/Solution.ts @@ -0,0 +1,17 @@ +function maximumPopulation(logs: number[][]): number { + const d: number[] = new Array(101).fill(0); + const offset = 1950; + for (const [birth, death] of logs) { + d[birth - offset]++; + d[death - offset]--; + } + let j = 0; + for (let i = 0, s = 0, mx = 0; i < d.length; ++i) { + s += d[i]; + if (mx < s) { + mx = s; + j = i; + } + } + return j + offset; +} From ca289c7ae3fa2be3754dea30584ae8bbae8dd1ed Mon Sep 17 00:00:00 2001 From: yanglbme Date: 2023年3月30日 21:39:55 +0800 Subject: [PATCH 12/14] feat: add solutions to lc problem: No.1856 No.1856.Maximum Subarray Min-Product --- .../README.md | 115 +++++++++++++----- .../README_EN.md | 107 +++++++++++----- .../Solution.cpp | 32 +++-- .../Solution.go | 15 ++- .../Solution.java | 6 +- .../Solution.py | 11 +- .../Solution.ts | 38 ++++++ 7 files changed, 237 insertions(+), 87 deletions(-) create mode 100644 solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.ts diff --git a/solution/1800-1899/1856.Maximum Subarray Min-Product/README.md b/solution/1800-1899/1856.Maximum Subarray Min-Product/README.md index 940b87334c860..c54ebe9d190a9 100644 --- a/solution/1800-1899/1856.Maximum Subarray Min-Product/README.md +++ b/solution/1800-1899/1856.Maximum Subarray Min-Product/README.md @@ -62,11 +62,13 @@ **方法一:单调栈 + 前缀和** -枚举每个元素 `nums[i]` 作为子数组的最小值,找出子数组的左右边界 `left[i]`, `right[i]`。 +我们可以枚举每个元素 $nums[i]$ 作为子数组的最小值,找出子数组的左右边界 $left[i]$ 和 $right[i]$。其中 $left[i]$ 表示 $i$ 左侧第一个严格小于 $nums[i]$ 的位置,而 $right[i]$ 表示 $i$ 右侧第一个小于等于 $nums[i]$ 的位置。 -其中 `left[i]` 表示 i 左侧第一个严格小于 `nums[i]` 的位置,`right[i]` 表示 i 右侧第一个小于等于 `nums[i]` 的位置。`s[i]` 表示 nums 的前缀和数组。 +为了方便地算出子数组的和,我们可以预处理出前缀和数组 $s,ドル其中 $s[i]$ 表示 $nums$ 前 $i$ 个元素的和。 -则以 `nums[i]` 作为子数组最小值的最小乘积为 `nums[i] * s[right[i]] - s[left[i] + 1]`。 +那么以 $nums[i]$ 作为子数组最小值的最小乘积为 $nums[i] \times s[right[i]] - s[left[i] + 1]$。我们可以枚举每个元素 $nums[i],ドル求出以 $nums[i]$ 作为子数组最小值的最小乘积,然后取最大值即可。 + +时间复杂度 $O(n),ドル空间复杂度 $O(n)$。其中 $n$ 为数组 $nums$ 的长度。 @@ -77,13 +79,12 @@ ```python class Solution: def maxSumMinProduct(self, nums: List[int]) -> int: - mod = int(1e9) + 7 n = len(nums) left = [-1] * n right = [n] * n stk = [] - for i, v in enumerate(nums): - while stk and nums[stk[-1]]>= v: + for i, x in enumerate(nums): + while stk and nums[stk[-1]]>= x: stk.pop() if stk: left[i] = stk[-1] @@ -95,9 +96,9 @@ class Solution: if stk: right[i] = stk[-1] stk.append(i) - s = [0] + list(accumulate(nums)) - ans = max(v * (s[right[i]] - s[left[i] + 1]) for i, v in enumerate(nums)) - return ans % mod + s = list(accumulate(nums, initial=0)) + mod = 10**9 + 7 + return max((s[right[i]] - s[left[i] + 1]) * x for i, x in enumerate(nums)) % mod ``` ### **Java** @@ -138,10 +139,10 @@ class Solution { } long ans = 0; for (int i = 0; i < n; ++i) { - long t = nums[i] * (s[right[i]] - s[left[i] + 1]); - ans = Math.max(ans, t); + ans = Math.max(ans, nums[i] * (s[right[i]] - s[left[i] + 1])); } - return (int) (ans % 1000000007); + final int mod = (int) 1e9 + 7; + return (int) (ans % mod); } } ``` @@ -157,25 +158,35 @@ public: vector right(n, n); stack stk; for (int i = 0; i < n; ++i) { - while (!stk.empty() && nums[stk.top()]>= nums[i]) stk.pop(); - if (!stk.empty()) left[i] = stk.top(); + while (!stk.empty() && nums[stk.top()]>= nums[i]) { + stk.pop(); + } + if (!stk.empty()) { + left[i] = stk.top(); + } stk.push(i); } stk = stack(); - for (int i = n - 1; i>= 0; --i) { - while (!stk.empty() && nums[stk.top()]> nums[i]) stk.pop(); - if (!stk.empty()) right[i] = stk.top(); + for (int i = n - 1; ~i; --i) { + while (!stk.empty() && nums[stk.top()]> nums[i]) { + stk.pop(); + } + if (!stk.empty()) { + right[i] = stk.top(); + } stk.push(i); } - vector s(n + 1); - for (int i = 0; i < n; ++i) s[i + 1] = s[i] + nums[i]; + long long s[n + 1]; + s[0] = 0; + for (int i = 0; i < n; ++i) { + s[i + 1] = s[i] + nums[i]; + } long long ans = 0; - const int mod = 1e9 + 7; for (int i = 0; i < n; ++i) { - long long t = nums[i] * (s[right[i]] - s[left[i] + 1]); - ans = max(ans, t); + ans = max(ans, nums[i] * (s[right[i]] - s[left[i] + 1])); } - return (int)(ans % mod); + const int mod = 1e9 + 7; + return ans % mod; } }; ``` @@ -192,8 +203,8 @@ func maxSumMinProduct(nums []int) int { right[i] = n } stk := []int{} - for i, v := range nums { - for len(stk)> 0 && nums[stk[len(stk)-1]]>= v { + for i, x := range nums { + for len(stk)> 0 && nums[stk[len(stk)-1]]>= x { stk = stk[:len(stk)-1] } if len(stk)> 0 { @@ -212,21 +223,63 @@ func maxSumMinProduct(nums []int) int { stk = append(stk, i) } s := make([]int, n+1) - for i, v := range nums { - s[i+1] = s[i] + v + for i, x := range nums { + s[i+1] = s[i] + x } ans := 0 - for i, v := range nums { - t := v * (s[right[i]] - s[left[i]+1]) - if ans < t { + for i, x := range nums { + if t := x * (s[right[i]] - s[left[i]+1]); ans < t { ans = t } } - mod := int(1e9) + 7 + const mod = 1e9 + 7 return ans % mod } ``` +### **TypeSript** + +```ts +function maxSumMinProduct(nums: number[]): number { + const n = nums.length; + const left: number[] = new Array(n).fill(-1); + const right: number[] = new Array(n).fill(n); + let stk: number[] = []; + for (let i = 0; i < n; ++i) { + while (stk.length && nums[stk[stk.length - 1]]>= nums[i]) { + stk.pop(); + } + if (stk.length) { + left[i] = stk[stk.length - 1]; + } + stk.push(i); + } + stk = []; + for (let i = n - 1; i>= 0; --i) { + while (stk.length && nums[stk[stk.length - 1]]> nums[i]) { + stk.pop(); + } + if (stk.length) { + right[i] = stk[stk.length - 1]; + } + stk.push(i); + } + const s: number[] = new Array(n + 1).fill(0); + for (let i = 0; i < n; ++i) { + s[i + 1] = s[i] + nums[i]; + } + let ans: bigint = 0n; + const mod = 10 ** 9 + 7; + for (let i = 0; i < n; ++i) { + const t = BigInt(nums[i]) * BigInt(s[right[i]] - s[left[i] + 1]); + if (ans < t) { + ans = t; + } + } + return Number(ans % BigInt(mod)); +} +``` + ### **...** ``` diff --git a/solution/1800-1899/1856.Maximum Subarray Min-Product/README_EN.md b/solution/1800-1899/1856.Maximum Subarray Min-Product/README_EN.md index 64f25cbdbce08..f2f4329883e2e 100644 --- a/solution/1800-1899/1856.Maximum Subarray Min-Product/README_EN.md +++ b/solution/1800-1899/1856.Maximum Subarray Min-Product/README_EN.md @@ -61,13 +61,12 @@ ```python class Solution: def maxSumMinProduct(self, nums: List[int]) -> int: - mod = int(1e9) + 7 n = len(nums) left = [-1] * n right = [n] * n stk = [] - for i, v in enumerate(nums): - while stk and nums[stk[-1]]>= v: + for i, x in enumerate(nums): + while stk and nums[stk[-1]]>= x: stk.pop() if stk: left[i] = stk[-1] @@ -79,9 +78,9 @@ class Solution: if stk: right[i] = stk[-1] stk.append(i) - s = [0] + list(accumulate(nums)) - ans = max(v * (s[right[i]] - s[left[i] + 1]) for i, v in enumerate(nums)) - return ans % mod + s = list(accumulate(nums, initial=0)) + mod = 10**9 + 7 + return max((s[right[i]] - s[left[i] + 1]) * x for i, x in enumerate(nums)) % mod ``` ### **Java** @@ -120,10 +119,10 @@ class Solution { } long ans = 0; for (int i = 0; i < n; ++i) { - long t = nums[i] * (s[right[i]] - s[left[i] + 1]); - ans = Math.max(ans, t); + ans = Math.max(ans, nums[i] * (s[right[i]] - s[left[i] + 1])); } - return (int) (ans % 1000000007); + final int mod = (int) 1e9 + 7; + return (int) (ans % mod); } } ``` @@ -139,25 +138,35 @@ public: vector right(n, n); stack stk; for (int i = 0; i < n; ++i) { - while (!stk.empty() && nums[stk.top()]>= nums[i]) stk.pop(); - if (!stk.empty()) left[i] = stk.top(); + while (!stk.empty() && nums[stk.top()]>= nums[i]) { + stk.pop(); + } + if (!stk.empty()) { + left[i] = stk.top(); + } stk.push(i); } stk = stack(); - for (int i = n - 1; i>= 0; --i) { - while (!stk.empty() && nums[stk.top()]> nums[i]) stk.pop(); - if (!stk.empty()) right[i] = stk.top(); + for (int i = n - 1; ~i; --i) { + while (!stk.empty() && nums[stk.top()]> nums[i]) { + stk.pop(); + } + if (!stk.empty()) { + right[i] = stk.top(); + } stk.push(i); } - vector s(n + 1); - for (int i = 0; i < n; ++i) s[i + 1] = s[i] + nums[i]; + long long s[n + 1]; + s[0] = 0; + for (int i = 0; i < n; ++i) { + s[i + 1] = s[i] + nums[i]; + } long long ans = 0; - const int mod = 1e9 + 7; for (int i = 0; i < n; ++i) { - long long t = nums[i] * (s[right[i]] - s[left[i] + 1]); - ans = max(ans, t); + ans = max(ans, nums[i] * (s[right[i]] - s[left[i] + 1])); } - return (int)(ans % mod); + const int mod = 1e9 + 7; + return ans % mod; } }; ``` @@ -174,8 +183,8 @@ func maxSumMinProduct(nums []int) int { right[i] = n } stk := []int{} - for i, v := range nums { - for len(stk)> 0 && nums[stk[len(stk)-1]]>= v { + for i, x := range nums { + for len(stk)> 0 && nums[stk[len(stk)-1]]>= x { stk = stk[:len(stk)-1] } if len(stk)> 0 { @@ -194,21 +203,63 @@ func maxSumMinProduct(nums []int) int { stk = append(stk, i) } s := make([]int, n+1) - for i, v := range nums { - s[i+1] = s[i] + v + for i, x := range nums { + s[i+1] = s[i] + x } ans := 0 - for i, v := range nums { - t := v * (s[right[i]] - s[left[i]+1]) - if ans < t { + for i, x := range nums { + if t := x * (s[right[i]] - s[left[i]+1]); ans < t { ans = t } } - mod := int(1e9) + 7 + const mod = 1e9 + 7 return ans % mod } ``` +### **TypeSript** + +```ts +function maxSumMinProduct(nums: number[]): number { + const n = nums.length; + const left: number[] = new Array(n).fill(-1); + const right: number[] = new Array(n).fill(n); + let stk: number[] = []; + for (let i = 0; i < n; ++i) { + while (stk.length && nums[stk[stk.length - 1]]>= nums[i]) { + stk.pop(); + } + if (stk.length) { + left[i] = stk[stk.length - 1]; + } + stk.push(i); + } + stk = []; + for (let i = n - 1; i>= 0; --i) { + while (stk.length && nums[stk[stk.length - 1]]> nums[i]) { + stk.pop(); + } + if (stk.length) { + right[i] = stk[stk.length - 1]; + } + stk.push(i); + } + const s: number[] = new Array(n + 1).fill(0); + for (let i = 0; i < n; ++i) { + s[i + 1] = s[i] + nums[i]; + } + let ans: bigint = 0n; + const mod = 10 ** 9 + 7; + for (let i = 0; i < n; ++i) { + const t = BigInt(nums[i]) * BigInt(s[right[i]] - s[left[i] + 1]); + if (ans < t) { + ans = t; + } + } + return Number(ans % BigInt(mod)); +} +``` + ### **...** ``` diff --git a/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.cpp b/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.cpp index 8145923aa4199..af8a9b0db1a32 100644 --- a/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.cpp +++ b/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.cpp @@ -6,24 +6,34 @@ class Solution { vector right(n, n); stack stk; for (int i = 0; i < n; ++i) { - while (!stk.empty() && nums[stk.top()]>= nums[i]) stk.pop(); - if (!stk.empty()) left[i] = stk.top(); + while (!stk.empty() && nums[stk.top()]>= nums[i]) { + stk.pop(); + } + if (!stk.empty()) { + left[i] = stk.top(); + } stk.push(i); } stk = stack(); - for (int i = n - 1; i>= 0; --i) { - while (!stk.empty() && nums[stk.top()]> nums[i]) stk.pop(); - if (!stk.empty()) right[i] = stk.top(); + for (int i = n - 1; ~i; --i) { + while (!stk.empty() && nums[stk.top()]> nums[i]) { + stk.pop(); + } + if (!stk.empty()) { + right[i] = stk.top(); + } stk.push(i); } - vector s(n + 1); - for (int i = 0; i < n; ++i) s[i + 1] = s[i] + nums[i]; + long long s[n + 1]; + s[0] = 0; + for (int i = 0; i < n; ++i) { + s[i + 1] = s[i] + nums[i]; + } long long ans = 0; - const int mod = 1e9 + 7; for (int i = 0; i < n; ++i) { - long long t = nums[i] * (s[right[i]] - s[left[i] + 1]); - ans = max(ans, t); + ans = max(ans, nums[i] * (s[right[i]] - s[left[i] + 1])); } - return (int) (ans % mod); + const int mod = 1e9 + 7; + return ans % mod; } }; \ No newline at end of file diff --git a/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.go b/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.go index aed3ef14bca1f..8149732315e9a 100644 --- a/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.go +++ b/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.go @@ -7,8 +7,8 @@ func maxSumMinProduct(nums []int) int { right[i] = n } stk := []int{} - for i, v := range nums { - for len(stk)> 0 && nums[stk[len(stk)-1]]>= v { + for i, x := range nums { + for len(stk)> 0 && nums[stk[len(stk)-1]]>= x { stk = stk[:len(stk)-1] } if len(stk)> 0 { @@ -27,16 +27,15 @@ func maxSumMinProduct(nums []int) int { stk = append(stk, i) } s := make([]int, n+1) - for i, v := range nums { - s[i+1] = s[i] + v + for i, x := range nums { + s[i+1] = s[i] + x } ans := 0 - for i, v := range nums { - t := v * (s[right[i]] - s[left[i]+1]) - if ans < t { + for i, x := range nums { + if t := x * (s[right[i]] - s[left[i]+1]); ans < t { ans = t } } - mod := int(1e9) + 7 + const mod = 1e9 + 7 return ans % mod } \ No newline at end of file diff --git a/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.java b/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.java index db80ae00eb701..c83935bd39101 100644 --- a/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.java +++ b/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.java @@ -31,9 +31,9 @@ public int maxSumMinProduct(int[] nums) { } long ans = 0; for (int i = 0; i < n; ++i) { - long t = nums[i] * (s[right[i]] - s[left[i] + 1]); - ans = Math.max(ans, t); + ans = Math.max(ans, nums[i] * (s[right[i]] - s[left[i] + 1])); } - return (int) (ans % 1000000007); + final int mod = (int) 1e9 + 7; + return (int) (ans % mod); } } \ No newline at end of file diff --git a/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.py b/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.py index 7b982e2003d08..26582da87374e 100644 --- a/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.py +++ b/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.py @@ -1,12 +1,11 @@ class Solution: def maxSumMinProduct(self, nums: List[int]) -> int: - mod = int(1e9) + 7 n = len(nums) left = [-1] * n right = [n] * n stk = [] - for i, v in enumerate(nums): - while stk and nums[stk[-1]]>= v: + for i, x in enumerate(nums): + while stk and nums[stk[-1]]>= x: stk.pop() if stk: left[i] = stk[-1] @@ -18,6 +17,6 @@ def maxSumMinProduct(self, nums: List[int]) -> int: if stk: right[i] = stk[-1] stk.append(i) - s = [0] + list(accumulate(nums)) - ans = max(v * (s[right[i]] - s[left[i] + 1]) for i, v in enumerate(nums)) - return ans % mod + s = list(accumulate(nums, initial=0)) + mod = 10**9 + 7 + return max((s[right[i]] - s[left[i] + 1]) * x for i, x in enumerate(nums)) % mod diff --git a/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.ts b/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.ts new file mode 100644 index 0000000000000..135913ee58862 --- /dev/null +++ b/solution/1800-1899/1856.Maximum Subarray Min-Product/Solution.ts @@ -0,0 +1,38 @@ +function maxSumMinProduct(nums: number[]): number { + const n = nums.length; + const left: number[] = new Array(n).fill(-1); + const right: number[] = new Array(n).fill(n); + let stk: number[] = []; + for (let i = 0; i < n; ++i) { + while (stk.length && nums[stk[stk.length - 1]]>= nums[i]) { + stk.pop(); + } + if (stk.length) { + left[i] = stk[stk.length - 1]; + } + stk.push(i); + } + stk = []; + for (let i = n - 1; i>= 0; --i) { + while (stk.length && nums[stk[stk.length - 1]]> nums[i]) { + stk.pop(); + } + if (stk.length) { + right[i] = stk[stk.length - 1]; + } + stk.push(i); + } + const s: number[] = new Array(n + 1).fill(0); + for (let i = 0; i < n; ++i) { + s[i + 1] = s[i] + nums[i]; + } + let ans: bigint = 0n; + const mod = 10 ** 9 + 7; + for (let i = 0; i < n; ++i) { + const t = BigInt(nums[i]) * BigInt(s[right[i]] - s[left[i] + 1]); + if (ans < t) { + ans = t; + } + } + return Number(ans % BigInt(mod)); +} From 1b8e686b1389854d465c15c47546ec37610714fe Mon Sep 17 00:00:00 2001 From: Qiu <99040799+qiu-it@users.noreply.github.com> Date: 2023年3月30日 15:45:26 +0200 Subject: [PATCH 13/14] feat: add php solution to lc problem: No.0349 (#960) --- .../0349.Intersection of Two Arrays/README.md | 24 +++++++++++++++++++ .../README_EN.md | 24 +++++++++++++++++++ .../Solution.php | 19 +++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 solution/0300-0399/0349.Intersection of Two Arrays/Solution.php diff --git a/solution/0300-0399/0349.Intersection of Two Arrays/README.md b/solution/0300-0399/0349.Intersection of Two Arrays/README.md index 7b7183f95afa0..a1eba31d226f4 100644 --- a/solution/0300-0399/0349.Intersection of Two Arrays/README.md +++ b/solution/0300-0399/0349.Intersection of Two Arrays/README.md @@ -148,6 +148,30 @@ func intersection(nums1 []int, nums2 []int) []int { } ``` +### **PHP** + +```php +class Solution { + /** + * @param Integer[] $nums1 + * @param Integer[] $nums2 + * @return Integer[] + */ + function intersection($nums1, $nums2) { + $rs = []; + $set1 = array_values(array_unique($nums1)); + $set2 = array_values(array_unique($nums2)); + for ($i = 0; $i < count($set1); $i++) { + $hashmap[$set1[$i]] = 1; + } + for ($j = 0; $j < count($set2); $j++) { + if ($hashmap[$set2[$j]]) array_push($rs, $set2[$j]); + } + return $rs; + } +} +``` + ### **...** ``` diff --git a/solution/0300-0399/0349.Intersection of Two Arrays/README_EN.md b/solution/0300-0399/0349.Intersection of Two Arrays/README_EN.md index d06008291a2d5..b420a86e795fc 100644 --- a/solution/0300-0399/0349.Intersection of Two Arrays/README_EN.md +++ b/solution/0300-0399/0349.Intersection of Two Arrays/README_EN.md @@ -136,6 +136,30 @@ func intersection(nums1 []int, nums2 []int) []int { } ``` +### **PHP** + +```php +class Solution { + /** + * @param Integer[] $nums1 + * @param Integer[] $nums2 + * @return Integer[] + */ + function intersection($nums1, $nums2) { + $rs = []; + $set1 = array_values(array_unique($nums1)); + $set2 = array_values(array_unique($nums2)); + for ($i = 0; $i < count($set1); $i++) { + $hashmap[$set1[$i]] = 1; + } + for ($j = 0; $j < count($set2); $j++) { + if ($hashmap[$set2[$j]]) array_push($rs, $set2[$j]); + } + return $rs; + } +} +``` + ### **...** ``` diff --git a/solution/0300-0399/0349.Intersection of Two Arrays/Solution.php b/solution/0300-0399/0349.Intersection of Two Arrays/Solution.php new file mode 100644 index 0000000000000..2366e8d602e43 --- /dev/null +++ b/solution/0300-0399/0349.Intersection of Two Arrays/Solution.php @@ -0,0 +1,19 @@ +class Solution { + /** + * @param Integer[] $nums1 + * @param Integer[] $nums2 + * @return Integer[] + */ + function intersection($nums1, $nums2) { + $rs = []; + $set1 = array_values(array_unique($nums1)); + $set2 = array_values(array_unique($nums2)); + for ($i = 0; $i < count($set1); $i++) { + $hashmap[$set1[$i]] = 1; + } + for ($j = 0; $j < count($set2); $j++) { + if ($hashmap[$set2[$j]]) array_push($rs, $set2[$j]); + } + return $rs; + } +} \ No newline at end of file From 72aac94b93355f40f006b3203d768841a183a9ea Mon Sep 17 00:00:00 2001 From: yanglbme Date: 2023年3月30日 23:12:56 +0800 Subject: [PATCH 14/14] feat: add solutions to lc problem: No.2367 No.2367.Number of Arithmetic Triplets --- .../README.md | 94 ++++++++----------- .../README_EN.md | 82 +++++++--------- .../Solution.cpp | 10 +- .../Solution.go | 15 ++- .../Solution.java | 10 +- .../Solution.py | 4 +- .../Solution.ts | 10 +- 7 files changed, 101 insertions(+), 124 deletions(-) diff --git a/solution/2300-2399/2367.Number of Arithmetic Triplets/README.md b/solution/2300-2399/2367.Number of Arithmetic Triplets/README.md index ae1a2df7e493e..b41a0bd2f6645 100644 --- a/solution/2300-2399/2367.Number of Arithmetic Triplets/README.md +++ b/solution/2300-2399/2367.Number of Arithmetic Triplets/README.md @@ -53,15 +53,17 @@ **方法一:暴力枚举** -直接暴力枚举 $i,ドル $j,ドル $k,ドル统计合法的三元组数目。 +我们注意到,数组 $nums$ 的长度只有不超过 200ドル,ドル因此可以直接暴力枚举 $i,ドル $j,ドル $k,ドル判断是否满足条件,若满足,累加三元组数目。 -时间复杂度 $O(n^3),ドル空间复杂度 $O(1)$。 +时间复杂度 $O(n^3),ドル其中 $n$ 为数组 $nums$ 的长度。空间复杂度 $O(1)$。 -**方法二:哈希表** +**方法二:数组或哈希表** -由于 $nums$ 严格递增,那么对于 $nums$ 中的每个元素 $v,ドル判断 $v+diff,ドル $v+diff+diff$ 是否也在 $nums$ 中,若是,累加三元组数目。这里用哈希表实现元素的快速查找。 +我们可以先将 $nums$ 中的元素存入哈希表或数组 $vis$ 中,然后枚举 $nums$ 中的每个元素 $x,ドル判断 $x+diff,ドル $x+diff+diff$ 是否也在 $vis$ 中,若是,累加三元组数目。 -时间复杂度 $O(n),ドル空间复杂度 $O(n)$。 +枚举结束后,返回答案。 + +时间复杂度 $O(n),ドル空间复杂度 $O(n)$。其中 $n$ 为数组 $nums$ 的长度。 @@ -69,19 +71,6 @@ -```python -class Solution: - def arithmeticTriplets(self, nums: List[int], diff: int) -> int: - ans = 0 - n = len(nums) - for i in range(n): - for j in range(i + 1, n): - for k in range(j + 1, n): - if nums[j] - nums[i] == nums[k] - nums[j] == diff: - ans += 1 - return ans -``` - ```python class Solution: def arithmeticTriplets(self, nums: List[int], diff: int) -> int: @@ -91,8 +80,8 @@ class Solution: ```python class Solution: def arithmeticTriplets(self, nums: List[int], diff: int) -> int: - s = set(nums) - return sum(v + diff in s and v + diff + diff in s for v in nums) + vis = set(nums) + return sum(x + diff in vis and x + diff * 2 in vis for x in nums) ``` ### **Java** @@ -121,13 +110,13 @@ class Solution { ```java class Solution { public int arithmeticTriplets(int[] nums, int diff) { - boolean[] vis = new boolean[310]; - for (int v : nums) { - vis[v] = true; + boolean[] vis = new boolean[301]; + for (int x : nums) { + vis[x] = true; } int ans = 0; - for (int v : nums) { - if (vis[v + diff] && vis[v + diff + diff]) { + for (int x : nums) { + if (vis[x + diff] && vis[x + diff + diff]) { ++ans; } } @@ -162,10 +151,14 @@ public: class Solution { public: int arithmeticTriplets(vector& nums, int diff) { - vector vis(310); - for (int v : nums) vis[v] = true; + bitset<301> vis; + for (int x : nums) { + vis[x] = 1; + } int ans = 0; - for (int v : nums) ans += vis[v + diff] && vis[v + diff + diff]; + for (int x : nums) { + ans += vis[x + diff] && vis[x + diff + diff]; + } return ans; } }; @@ -174,8 +167,7 @@ public: ### **Go** ```go -func arithmeticTriplets(nums []int, diff int) int { - ans := 0 +func arithmeticTriplets(nums []int, diff int) (ans int) { n := len(nums) for i := 0; i < n; i++ { for j := i + 1; j < n; j++ { @@ -186,23 +178,22 @@ func arithmeticTriplets(nums []int, diff int) int { } } } - return ans + return } ``` ```go -func arithmeticTriplets(nums []int, diff int) int { - vis := make([]bool, 310) - for _, v := range nums { - vis[v] = true +func arithmeticTriplets(nums []int, diff int) (ans int) { + vis := [301]bool{} + for _, x := range nums { + vis[x] = true } - ans := 0 - for _, v := range nums { - if vis[v+diff] && vis[v+diff+diff] { + for _, x := range nums { + if vis[x+diff] && vis[x+diff+diff] { ans++ } } - return ans + return } ``` @@ -210,33 +201,30 @@ func arithmeticTriplets(nums []int, diff int) int { ```ts function arithmeticTriplets(nums: number[], diff: number): number { - let res = 0; const n = nums.length; - for (let i = 0; i < n - 2; i++) { - for (let j = i + 1; j < n - 1; j++) { - for (let k = j + 1; k < n; k++) { - if (nums[k] - nums[j]> diff) { - break; - } + let ans = 0; + for (let i = 0; i < n; ++i) { + for (let j = i + 1; j < n; ++j) { + for (let k = j + 1; k < n; ++k) { if (nums[j] - nums[i] === diff && nums[k] - nums[j] === diff) { - res++; + ++ans; } } } } - return res; + return ans; } ``` ```ts function arithmeticTriplets(nums: number[], diff: number): number { - let vis = new Array(310).fill(false); - for (const v of nums) { - vis[v] = true; + const vis: boolean[] = new Array(301).fill(false); + for (const x of nums) { + vis[x] = true; } let ans = 0; - for (const v of nums) { - if (vis[v + diff] && vis[v + diff + diff]) { + for (const x of nums) { + if (vis[x + diff] && vis[x + diff + diff]) { ++ans; } } diff --git a/solution/2300-2399/2367.Number of Arithmetic Triplets/README_EN.md b/solution/2300-2399/2367.Number of Arithmetic Triplets/README_EN.md index 398ac96693a89..59f56e5d0caa4 100644 --- a/solution/2300-2399/2367.Number of Arithmetic Triplets/README_EN.md +++ b/solution/2300-2399/2367.Number of Arithmetic Triplets/README_EN.md @@ -51,19 +51,6 @@ ### **Python3** -```python -class Solution: - def arithmeticTriplets(self, nums: List[int], diff: int) -> int: - ans = 0 - n = len(nums) - for i in range(n): - for j in range(i + 1, n): - for k in range(j + 1, n): - if nums[j] - nums[i] == nums[k] - nums[j] == diff: - ans += 1 - return ans -``` - ```python class Solution: def arithmeticTriplets(self, nums: List[int], diff: int) -> int: @@ -73,8 +60,8 @@ class Solution: ```python class Solution: def arithmeticTriplets(self, nums: List[int], diff: int) -> int: - s = set(nums) - return sum(v + diff in s and v + diff + diff in s for v in nums) + vis = set(nums) + return sum(x + diff in vis and x + diff * 2 in vis for x in nums) ``` ### **Java** @@ -101,13 +88,13 @@ class Solution { ```java class Solution { public int arithmeticTriplets(int[] nums, int diff) { - boolean[] vis = new boolean[310]; - for (int v : nums) { - vis[v] = true; + boolean[] vis = new boolean[301]; + for (int x : nums) { + vis[x] = true; } int ans = 0; - for (int v : nums) { - if (vis[v + diff] && vis[v + diff + diff]) { + for (int x : nums) { + if (vis[x + diff] && vis[x + diff + diff]) { ++ans; } } @@ -142,10 +129,14 @@ public: class Solution { public: int arithmeticTriplets(vector& nums, int diff) { - vector vis(310); - for (int v : nums) vis[v] = true; + bitset<301> vis; + for (int x : nums) { + vis[x] = 1; + } int ans = 0; - for (int v : nums) ans += vis[v + diff] && vis[v + diff + diff]; + for (int x : nums) { + ans += vis[x + diff] && vis[x + diff + diff]; + } return ans; } }; @@ -154,8 +145,7 @@ public: ### **Go** ```go -func arithmeticTriplets(nums []int, diff int) int { - ans := 0 +func arithmeticTriplets(nums []int, diff int) (ans int) { n := len(nums) for i := 0; i < n; i++ { for j := i + 1; j < n; j++ { @@ -166,23 +156,22 @@ func arithmeticTriplets(nums []int, diff int) int { } } } - return ans + return } ``` ```go -func arithmeticTriplets(nums []int, diff int) int { - vis := make([]bool, 310) - for _, v := range nums { - vis[v] = true +func arithmeticTriplets(nums []int, diff int) (ans int) { + vis := [301]bool{} + for _, x := range nums { + vis[x] = true } - ans := 0 - for _, v := range nums { - if vis[v+diff] && vis[v+diff+diff] { + for _, x := range nums { + if vis[x+diff] && vis[x+diff+diff] { ans++ } } - return ans + return } ``` @@ -190,33 +179,30 @@ func arithmeticTriplets(nums []int, diff int) int { ```ts function arithmeticTriplets(nums: number[], diff: number): number { - let res = 0; const n = nums.length; - for (let i = 0; i < n - 2; i++) { - for (let j = i + 1; j < n - 1; j++) { - for (let k = j + 1; k < n; k++) { - if (nums[k] - nums[j]> diff) { - break; - } + let ans = 0; + for (let i = 0; i < n; ++i) { + for (let j = i + 1; j < n; ++j) { + for (let k = j + 1; k < n; ++k) { if (nums[j] - nums[i] === diff && nums[k] - nums[j] === diff) { - res++; + ++ans; } } } } - return res; + return ans; } ``` ```ts function arithmeticTriplets(nums: number[], diff: number): number { - let vis = new Array(310).fill(false); - for (const v of nums) { - vis[v] = true; + const vis: boolean[] = new Array(301).fill(false); + for (const x of nums) { + vis[x] = true; } let ans = 0; - for (const v of nums) { - if (vis[v + diff] && vis[v + diff + diff]) { + for (const x of nums) { + if (vis[x + diff] && vis[x + diff + diff]) { ++ans; } } diff --git a/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.cpp b/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.cpp index bcb401569a6bb..d0a2779abb874 100644 --- a/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.cpp +++ b/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.cpp @@ -1,10 +1,14 @@ class Solution { public: int arithmeticTriplets(vector& nums, int diff) { - vector vis(310); - for (int v : nums) vis[v] = true; + bitset<301> vis; + for (int x : nums) { + vis[x] = 1; + } int ans = 0; - for (int v : nums) ans += vis[v + diff] && vis[v + diff + diff]; + for (int x : nums) { + ans += vis[x + diff] && vis[x + diff + diff]; + } return ans; } }; \ No newline at end of file diff --git a/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.go b/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.go index 3992f69e394fd..c8abb142e55ad 100644 --- a/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.go +++ b/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.go @@ -1,13 +1,12 @@ -func arithmeticTriplets(nums []int, diff int) int { - vis := make([]bool, 310) - for _, v := range nums { - vis[v] = true +func arithmeticTriplets(nums []int, diff int) (ans int) { + vis := [301]bool{} + for _, x := range nums { + vis[x] = true } - ans := 0 - for _, v := range nums { - if vis[v+diff] && vis[v+diff+diff] { + for _, x := range nums { + if vis[x+diff] && vis[x+diff+diff] { ans++ } } - return ans + return } \ No newline at end of file diff --git a/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.java b/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.java index 60e749024cc32..5312b45e468b2 100644 --- a/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.java +++ b/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.java @@ -1,12 +1,12 @@ class Solution { public int arithmeticTriplets(int[] nums, int diff) { - boolean[] vis = new boolean[310]; - for (int v : nums) { - vis[v] = true; + boolean[] vis = new boolean[301]; + for (int x : nums) { + vis[x] = true; } int ans = 0; - for (int v : nums) { - if (vis[v + diff] && vis[v + diff + diff]) { + for (int x : nums) { + if (vis[x + diff] && vis[x + diff + diff]) { ++ans; } } diff --git a/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.py b/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.py index b4b94e729a4a5..fb70b11a3fbd5 100644 --- a/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.py +++ b/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.py @@ -1,4 +1,4 @@ class Solution: def arithmeticTriplets(self, nums: List[int], diff: int) -> int: - s = set(nums) - return sum(v + diff in s and v + diff + diff in s for v in nums) + vis = set(nums) + return sum(x + diff in vis and x + diff * 2 in vis for x in nums) diff --git a/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.ts b/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.ts index c9f2144361b94..220955cc46501 100644 --- a/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.ts +++ b/solution/2300-2399/2367.Number of Arithmetic Triplets/Solution.ts @@ -1,11 +1,11 @@ function arithmeticTriplets(nums: number[], diff: number): number { - let vis = new Array(310).fill(false); - for (const v of nums) { - vis[v] = true; + const vis: boolean[] = new Array(301).fill(false); + for (const x of nums) { + vis[x] = true; } let ans = 0; - for (const v of nums) { - if (vis[v + diff] && vis[v + diff + diff]) { + for (const x of nums) { + if (vis[x + diff] && vis[x + diff + diff]) { ++ans; } }

AltStyle によって変換されたページ (->オリジナル) /