2019 Multi-University Training Contest 9

这场多校,运气太背,开局研究了01一个多小时,无果就顺手切了02,然后深陷03,导致了原题08题目没读,07简单换根dp没开,发现队友越来越厉害了,连续两场200到300人的题都能切了,而我好像越来越菜了…
1001 Rikka with Quicksort

解法:我们记 s u m [ i ] sum[i] sum[i] g [ i ] g[i] g[i]前缀和,公式变化一下:
F ( i ) : i s u m [ i ] = i ∗ ( i − 1 ) + ( i + 2 ) s u m [ i − 1 ] F(i): isum[i] = i*(i-1)+(i+2)sum[i-1] F(i):isum[i]=i(i1)+(i+2)sum[i1]
F ( i ) − F ( i − 1 ) F(i) - F(i-1) F(i)F(i1)得到: i g [ i ] = 2 ( i − 1 ) + ( i + 1 ) g [ i − 1 ] ig[i] = 2(i-1)+(i+1)g[i-1] ig[i]=2(i1)+(i+1)g[i1]
继续变换: i ( g [ i ] − 2 ) = 2 i + ( i + 1 ) ( g [ i − 1 ] − 2 ) i(g[i]-2)=2i+(i+1)(g[i-1]-2) i(g[i]2)=2i+(i+1)(g[i1]2)
稍微变化一下: g [ i ] − 2 i + 1 = 2 i + 1 + g [ i − 1 ] − 2 i \frac{g[i]-2}{i+1}=\frac{2}{i+1}+\frac{g[i-1]-2}{i} i+1g[i]2=i+12+ig[i1]2
H [ i ] = g [ i ] − 2 i + 1 H[i] = \frac{g[i]-2}{i+1} H[i]=i+1g[i]2,则我们可以通过求 H [ n ] H[n] H[n]来求 g [ n ] g[n] g[n],问题进一步转化成求 2 ∑ i = 1 n 1 i 2\sum_{i=1}^{n}\frac{1}{i} 2i=1ni1,这个调和级数我们可以分段打表其前缀和,然后存进数组里面,我大概存了2000个前缀和,也就是每5e5就存一次调和级数前缀和,知道了调和级数前缀和,这题就随便切啦 //昨天已经推到公式最后一步,就是不知道怎么快速求调和级数前缀和…
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod = 1e9 + 7, N = 5e5;
ll A[] = {0,389417116,881884276,553560598,224432428,260751735,117569315,346569238,65973860,256727000,517470973,876872576,558995133,401034235,860051261,536279467,155788942,955368968,910520518,551669479,120304438,868572373,154582539,657446462,519742130,937315262,627424624,261857562,845041807,947164171,554328605,482373981,656331368,36059187,691227914,538023106,840211063,712172696,388741362,105309083,529978561,185368676,897343109,895444019,93875054,796757979,197837413,258616124,294171160,256252543,218059710,432483635,992370950,998412848,608415075,497589222,127363831,933703444,605748785,892473929,874956379,500087023,695700236,175774637,302540311,535825517,434730736,888251098,585400383,158924035,704261248,773664140,297528324,564952040,326818180,907093492,492252413,942671867,463421375,157069629,387370501,739182811,872587234,493403290,361055436,982695338,992982497,506967624,325135313,139432162,801394116,453282175,557360951,863788156,403960409,87987742,547993698,668279581,775785847,202341215,299703623,985901935,472678625,625901892,403957663,400898273,380758761,808106200,540946595,399100493,374446961,543807609,228705807,650166923,892207521,657180487,718954981,347048384,57611608,888748566,776424610,865895081,71562850,388913307,896393406,149844661,90704811,847090444,271738138,599648680,153293323,25276529,339320628,444749727,153347307,913959099,896068049,46732292,632403841,111671658,117739701,431209934,466237359,92531571,504300280,230286215,315016389,593369627,391019917,170185585,945735692,933492428,935020357,435114737,882658738,268811339,739835603,949251083,933165221,542499646,989769439,523226750,782121533,92948180,249519096,571311841,193556131,518177930,703222437,990319348,419413446,441470909,431786435,679913200,631744438,555918800,949953078,482508989,999174487,216453269,347817442,481802904,181159585,170484593,782823623,170348466,724333362,894176406,992209009,668353268,421432125,388368704,717981978,479900086,963213881,717830438,949213181,313261786,905975821,375088827,397787437,888156970,979828694,625110244,480573495,27116448,277991208,327190878,549719751,911236059,567216451,926379681,47229125,367041435,193523226,945980477,562775516,777761880,198426247,274321633,701258838,117844353,658499361,348615673,951483459,774167087,798815837,564219784,289824405,376946374,212292772,10903613,298288616,164895248,228285400,456895326,82003167,835113182,14644418,219675409,667403141,867649986,637219612,513019047,776881735,906719336,746273961,324433545,470673094,930426229,63221052,336356381,396553805,241846252,802421416,856290602,664109705,835723147,330618733,844530433,80898868,981109485,500911712,19012239,372936810,330748900,14763369,723787870,164434278,82327247,800155067,605234103,129543226,637773976,522371293,954838687,885734730,310622951,864146098,319564474,190734195,246200234,760467956,22662236,53928139,429662225,773945403,969760528,355892699,978407063,893464662,908021390,613233574,546378870,649265872,659568871,750616222,878639633,542952833,774648402,174676223,843228321,49232709,463526087,491571581,541144119,636833544,905462845,18734469,12962695,128738923,25064732,344556596,456113835,869386371,30891062,926461092,835590703,866124411,998294297,189177380,94421296,528948452,101236982,137544262,228585373,899481695,425340656,604975812,212863662,982588373,478630853,880849435,149414031,858716632,861806063,680329826,886786107,787961996,97375858,331778750,488255625,91643473,482696817,471903941,720231022,35501904,327391134,297918764,996892378,875624473,892970348,698628706,944223790,177359323,834468505,96043834,158651660,799943555,268307906,132305296,91501436,274017167,307171415,430246600,142950244,803909020,778054401,885071333,583898600,211359087,379263459,908310181,943017790,163092501,472894133,289723843,714964176,862932058,351490071,335517815,523579059,160745095,186863098,353121184,347680289,396002777,197519171,254876617,971331885,299997699,80705369,148894905,832751326,282450851,466349450,892767244,953811475,141750010,93805088,197002259,410698779,189488125,644717767,336988739,768779494,5912479,427111430,377980801,990750605,779389514,920318081,730269025,405160401,863910892,552002374,80416580,637404093,990383116,781085171,346918584,946658334,911285900,944989801,970687314,725156568,196919273,483078487,814269369,335140176,981721633,859157852,537167041,814845045,524124890,392641637,512141421,416081775,129452529,114656981,826629961,460416574,844552662,220993924,858326199,488746340,316201725,29560122,216345457,20169011,217177043,525595364,170644387,408960976,330742436,106978295,110465947,491908049,479850415,681471473,454012664,429628683,334245732,58122033,482115882,826487385,61454438,30503514,582477184,260591674,856049964,833912601,2773859,275349383,622296549,774855580,54916186,738787531,135709872,823183945,344915784,82126223,568517529,214903564,323549891,846479893,255018380,982212201,244220213,433985385,769833837,141937532,525761676,446953275,966219748,558261150,267020701,84127338,139057568,841776071,863807780,808773244,28693094,907368327,330606295,496950786,8320903,841131660,214044553,538257363,393795758,563997919,665964664,546234540,882496045,580279702,8450322,75522646,993754156,7482487,955916665,621978994,247561367,865567889,308068598,502463398,842596232,788299382,397110730,775124006,314934564,430290123,680815816,283439928,628852384,833125405,952681019,948331009,535841432,182780572,216765678,791618620,780975103,925883170,376023889,815542063,261389176,716672861,801658162,735391520,265596593,187869397,91699598,234246839,764918198,733195817,511700832,573234981,106145258,975736871,911267454,587548872,739393971,815147992,814157941,620386257,671802787,642304588,325919370,218133634,233034201,566433982,715878648,942034601,625378598,455466484,730009499,710958934,378907903,275853589,198286265,740737703,462512669,433331577,947151033,425391636,523579938,141789258,536898412,569797996,262628273,950911285,142820273,232803301,539768489,914068666,602447994,491263027,235455284,497761222,538198972,137133919,214191280,756396877,445514935,449849907,493630627,47228536,531830910,574068337,905192318,281025524,896019991,290667965,740494128,247838305,942747711,325078518,669511348,839080985,641305799,335468312,80632706,408283378,456548728,843159541,267448502,148733752,552369315,540881335,8751051,798998664,206840691,19843339,17660702,276223065,359904237,979477783,558390866,970805053,110359136,347506445,182907463,285252788,351902724,371656184,706703575,345418939,509166404,802570600,805761316,35372485,868781538,688336364,215982087,538141842,20607414,668262500,561336803,583247314,665695075,192520101,332434198,593806051,244445636,262913578,296096139,321547746,146919848,834151240,842092888,177765506,918082161,435069343,917457352,81755632,830767799,813510499,267667178,835990691,480488375,442362382,429939239,394651441,980195946,345126377,652990300,50831988,168766941,809108242,213746668,761807501,860340545,909220984,70455831,261056407,471021753,322774840,924987880,45363760,953037667,782046475,613453099,475441097,3429459,364684019,716134815,699270327,939302878,748009062,666207894,398114342,611865600,911278750,265886799,53153621,641182721,434476296,98208049,609829767,388621721,396545430,393532945,522703807,574587123,389156988,127861156,230562840,994167927,570751444,838670046,107879308,695283917,40848296,79683927,533329854,295133756,712656109,485611497,942243089,635797092,844123564,794413528,510513735,773300455,917922873,96883968,379298765,490174758,685976324,448813356,235982652,464292047,183541525,300836489,177647256,809512110,323574386,845031071,213752224,582250339,56384333,45343241,152392669,600429650,6734486,752724813,733212331,907896194,970754612,128127479,761517551,743059668,552885355,670965886,98794340,472836596,130554967,353477407,325178472,221922189,788809915,823162423,838350318,325363437,72618122,103238070,777328655,895577196,889659170,377600299,369958415,724360516,575792279,317927778,712574234,696348496,477561593,480835757,826319954,822088932,292518000,173129883,714847164,100903109,146562848,509872002,694354378,30509651,368423096,793096382,416995537,912265097,78047390,635124790,515614527,329022335,164655379,792929990,883437548,593861074,191546643,724921103,570563608,364763007,889578173,323091544,970593659,105177566,334105917,446841838,519192814,69674243,70546640,301701567,221138328,775945591,50866163,118967946,586137233,357062752,869826821,879371631,570826740,881226630,111952250,637838809,81260372,956684052,262099384,243147555,254165158,625392356,851304014,75278025,341300141,889180150,604214413,838429372,468732558,229023163,262000883,163264861,579612995,829182493,441402731,889667661,459999762,102035773,547225521,411031724,300848330,273947779,695529921,21430378,674275612,208075884,517541212,680853499,713369894,49495696,156421228,27721949,79515474,840654300,341515196,411256694,977431599,891010280,570452602,970033134,912488358,34676307,605156838,825939,56162774,317514406,553271166,968573110,147422075,872439661,708853592,391075505,232841459,795407218,391327141,652489241,634448624,875070467,694991690,679206205,535111282,228223288,219147590,272752045,208649582,283364033,849812195,698940617,688584882,641498780,767860645,455485924,420896037,331410012,213780045,614815198,884616760,903969475,119476258,948700634,188432777,173366382,253432377,981988015,839747958,9972884,710404455,265040543,632766417,584278645,996580019,898235586,20804500,473365059,111506955,625076457,16967458,156934123,465670591,540091039,20269436,167257252,720882896,257419317,354651261,237528245,622195384,566697660,23176274,225807662,589188960,156540145,628083401,593965224,972173742,527434258,45419594,338543393,157076345,259063313,851981978,444248903,49033251,516869051,719101844,313817985,604873745,305869681,528104924,493528919,691270138,734963854,501247650,197766490,70087719,798226158,535552827,896336218,735066836,354472923,832378318,371412817,469133061,489817232,451650053,616040351,625830647,596732314,38979565,486982966,991574969,402379357,255879717,314004690,541696576,537330486,708776422,30977444,741312802,947304195,381995397,124325062,725518836,976014973,257533181,450850674,906948760,901262181,49293649,955255717,943549130,440111488,711671089,53222380,410346707,450538058,479857861,363670182,514669437,493526521,165325493,725077347,97888782,399102326,311945460,630022204,687119304,276349041,29196624,533417615,606383129,572250039,271050735,922645861,664547924,348873742,961864369,866756797,695170893,651127832,249306264,726333652,999957224,319491323,646279525,421305744,421002278,505167105,867311258,107977989,637052146,457483343,100213508,212077938,489319526,967327512,698586733,33490544,759783390,745899187,143578174,964625899,107716047,685294202,884902791,408869465,675385514,782873514,153041933,512264754,777859724,753534275,695819542,890050157,521743891,466432933,347618735,670353054,17603825,440383757,941919947,502057106,551140497,258292363,648670900,868869323,651559648,188008608,876494743,726741755,863555310,48808113,728736601,540603499,232531229,739327008,116406559,192533803,951173788,457969670,95507961,441344936,440425658,165742244,444133736,180260478,122097442,566022731,433827005,351764771,301042466,977290752,314607388,421266407,996181647,559104821,110142891,599861657,430664847,750170433,631136753,247611860,263908324,871398198,372449225,259195465,446784731,996025972,823007439,831435669,914692855,584275727,510157358,742548687,140754271,845495362,386257305,257654985,377770688,224329231,648424224,300658145,817646545,992710638,914820375,924189496,932956678,877491804,846497903,618429094,656239365,518718248,34711594,766836529,869436923,181140271,195502288,164306906,223049721,932182776,695632170,6121988,551161050,591810437,131353407,719557720,235158219,911253527,31968369,805303356,716312750,738655543,204814673,685492181,933150979,82460898,705317584,784368931,210267603,162571769,902780323,911673042,702176718,438361881,584122721,6420342,162842303,114024001,858848369,753275805,914901517,880133902,834986532,83592767,778120230,293534685,353643635,671472330,292046340,494237566,193201468,690558980,65631547,134465071,587441657,738646042,525246917,749876495,604339783,833852913,570717357,242199917,215830292,174401287,453220513,857380225,858257690,29074626,741007415,716972112,878965771,918370289,724745841,83430985,23195600,889243891,518948724,699046680,507900974,636316098,727997349,446175190,178641360,790878300,30041257,548150047,943552991,304957524,233722078,456286197,809975497,274092515,310624626,566099045,534647680,913137157,455789264,771321639,214906527,436076267,955605881,962257384,396605041,42178612,933846753,988077852,158473053,596232835,8422378,298408887,915164042,560446696,361589303,3912078,522028220,656192864,975877183,826721597,438718031,627399847,762874455,576975132,63437901,656592501,758660789,785536396,579742444,138539751,145273995,427295347,658914229,165638733,412748580,902893714,452422427,595128242,183420673,904728539,586546460,160788667,590117309,817154218,735442196,979079552,329617038,323295238,698182005,936483886,105071352,539909358,611822739,273836774,584683161,71225520,143036808,723246366,896915971,775865813,757517288,451764301,455873557,400794681,88203009,925756070,355320244,766331866,856546844,90720390,309008031,721793982,163330479,208089255,284289699,729347670,757098890,194035908,680858623,206850102,548358526,798607097,496773709,643655693,200035282,748442012,877679940,393014716,302392150,673681579,981809957,814199119,179859817,393662717,113114273,742796284,847890210,464585146,273659347,137521346,616378841,324835914,843483672,246407282,146581482,590352640,938302779,702247251,436708363,279262443,603190674,83647804,472472726,363769511,152803930,946611338,754928908,824426917,184999414,838569581,557564494,383495983,430898953,746340889,725476438,226957248,811540867,927388262,682901457,785444453,791820542,658864507,456435086,803920002,780639497,415735258,920284017,815789669,990212324,921909856,158939364,812133339,453178086,576655831,703143840,660536671,591541828,635831015,864028341,501334000,292843278,658815022,995894538,975331884,116318764,309816261,143108904,731626913,108755464,369296187,100548986,961188455,700393517,53713173,611003927,621878087,204605393,432284479,340625516,955949273,472526054,42021113,622764190,259734068,318776556,824646990,137324139,281522273,439923989,462404170,251152863,902214464,992229008,798284513,303360657,723028008,214147822,900842497,522269756,324378424,506190799,31243697,123257389,410523198,181870595,616966886,13232168,718110650,148222998,228773372,806988723,911980928,331093219,228660174,4467371,933496938,39661840,561473393,183682919,147112856,453475322,371964715,981006044,160335324,141759218,932011166,841889811,925054467,939838157,14948071,225502052,489255251,120235385,741546464,707056071,47667348,911937328,950135025,910876492,471242403,393263530,478020176,677396620,603963882,229235433,693694411,164893143,102330997,348930241,778460218,191038882,602068215,118497615,292503186,799506446,793426520,319659351,454805497,257953774,379122601,157844454,258055056,411486499,369867007,575347047,699008212,942847245,944251486,893554817,60398046,570083005,787242034,12490793,799527110,290981484,337398837,956721687,705918891,592272749,783630643,679147777,137602889,925221793,361516628,345359848,89545275,205091068,202557990,84260159,373566327,538381261,225298631,812434888,554742575,686815125,366543172,455613631,710718080,34682776,868963785,974917736,610251883,968789153,502926489,280672990,644091186,57424102,163493553,35189487,813415264,380987962,994924108,618092756,434774307,452886215,318433738,628065168,242574397,202391056,702991705,693971606,57526831,546531597,586672671,633153341,440416879,916735363,87596049,178406410,572671848,211296225,729512740,918901933,771374890,999080482,542698661,254073511,302683255,406303100,606049149,415782250,569537387,314027973,182146137,868497410,868529356,786511953,789129142,679428192,243079097,479027780,731329651,620551045,563329076,916785714,808571737,395459733,653366773,386199647,395406418,373449044,833598471,335921981,29318056,326536876,317139270,981301286,409025531,700738585,562631959,190730019,627560387,266280692,531514690,375289525,103524186,722203202,143258325,137152895,207509362,131733346,191628679,772066635,137929026,862426374,861259567,4521619,57924370,630515180,188797797,492263768,336997649,505350586,476012756,471297637,152663007,681657137,741338990,688052265,262294828,246047274,420458654,185213150,866909380,559009391,979671928,559004510,710467521,380936186,58011431,731511240,705705059,464171394,873168245,514739941,968561226,677924054,525481154,267937090,921013575,56269077,314593293,585048709,185794685,327921878,461664578,211149558,277226950,820809370,222473208,149716265,344310275,642597773,164741562,541976947,205122217,578230562,914862108,138342548,969034915,108801333,191542875,837524283,302316228,349752663,465063693,484534109,399140014,30036658,464419894,706424275,688420298,289241734,528631763,999228618,112402264,183326067,490921942,556677581,151491026,411556388,200484827,402099470,111571174,611447694,250475091,8007887,722810866,348653588,935509511,680248379,668624876,206978298,939723686,750511958,144520355,453524897,504580877,162014354,93769428,758525986,806874801,650080483,794170657,367960257,679630385,314701963,74738395,354443972,762160779,175599241,65866925,680425617,777576606,897621603,22111448,160822323,415308584,723912010,135029452,832847150,799083566,814808781,953631184,858152935,972533318,692089121,658976380,782989268,49939295,787302792,892850702,304108470,109774344,714566023,373162740,588664579,116476013,303353284,274593180,784918493,711768279,945010033,303926936,973828039,914630948,850355275,212925783,859163703,529848655,929095859,192901914,170339590,985052818,124728340,578155565,455979481,605777218,65237269,699637142,94088445,228885201,672399383,828823391,754928771,57521826,431540442,387205131,527908225,410487464,562593076,574352165,414351608,682685261,37543583,615748262,761993353,379733355,917311825,291377225,357787091,47444855,89867907,535136576,787229851,370476359,125265137,209382736,29783439,892709245,913473120,915667077,314640831,307405918,658084698,533807867,916519165,487154669,397026001,694159220,778701877,997868324,659413629,624218138,157577865,363386280,328875402,404338312,870467638,218959588,136111460,618522582,208602533,612900277,357469376,985368038,14248252,123144193,297390096,545433933,256283197,569624187,814113387,48299749,43813594,142786049,463277580,777421606,867710618,839188154,384365181,963975440,891517022,183825221,821995493,805714418,370525045,367873472,147044444,924257051,275306245,449294689,507074986,806657966,824749191,638182780,346674265,55800762,746967799,962983911,827849602,183930350,387070203,949783426,814589900,880068416,842957571,564374056,801841125,224984765,773733355,265676925,332703346,275956497,519092991,396679834,934345340,368641496,450579596,754190920,109368641,252080293,363445830,210397673,136323514,209873051,5302170,951400423,945322884,669724648,288681170,479962412,569024020,410045432,282727176,477146710,244906158,593244473,102366699,178494482,461397151,130920516,132547326,668511900,258743775,256615293,744129593,229349869,158233613,271882058,577971127,659238085,613600554,577408535,620096753,563035954,942058954,247225826,394624963,640851700,213336642,807040045,751464724,573836850,602786455,751242666,767092390,40189818,905939563,846681441,647968282,152406455,335457034,707949528,700155510,322288153,582256201,241406619,147472017,671719842,326430492,271537091,118318562,130872560,214792275,175988967,42761158,538229443,490813396,631514013,395122909,138810550,984426225,263473971,98117698,761853121,113190704,544104102,409038272,241138305,149819271,737424861,50235825,458829333,518723111,649395755,3438202,288171817,912457808,662356488,628843304,762767804,751488641,844443702,399809383,567843845,998342867,524979882,236091556,827600166,378655393,650000007};
void add(ll &x, ll y) {
    x += y;
    if (x >= mod)
        x -= mod;
    if (x < 0)
        x += mod;
}
ll ksm(ll x, int y) {
    ll res = 1;
    while (y) {
        if (y & 1)
            res = res * x % mod;
        x = x * x % mod;
        y /= 2;
    }
    return res;
}
ll calc(int n) {
    ll ans = A[n / N];
    int m = n / N * N;
    for (int i = m + 1; i <= n; i++)
        ans = (ans + ksm(i, mod - 2)) % mod;
    return ans;
}
ll gao(int n, int m) {
    if (n == m )
        return 0;
    ll ans = 2ll * (calc(n + 1) - calc(m + 2) + mod) % mod;
    ll res = 1ll * (m - 2 + mod) * ksm(m + 2, mod - 2) % mod;
    add(ans, res);
    ans = ans * (n + 1) % mod;
    add(ans, 2);
    return ans;
}
int main() {
    int T, n, m;
    cin>>T;
    while (T--) {
        cin>>n>>m;
        cout<<gao(n, m)<<endl;
    }
}

1002 Rikka with Cake

题意:有n条线段,每条线段两端都刚好有一个端点在边界上,求联通块个数
解法:不难发现,连通块数量等于线段交点+1,那我们将所有竖线看成点,然后按照高度扫一遍就行,水题
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 2e5 + 10, N = 1e9;
int sum[maxn * 31], ls[maxn * 31], rs[maxn * 31], cnt;
struct node {
    int x1, x2, y1, opt;
    bool operator<(const node& t) const {
        if (y1 == t.y1)
            opt < t.opt;
        return y1 < t.y1;
    }
} a[maxn];
#define mid (l + r) / 2
void up(int &o, int l, int r, int k, int v) {
    if (!o)
        o = ++cnt;
    sum[o] += v;
    if (l == r)
        return;
    if (k <= mid)
        up(ls[o], l, mid, k, v);
    else
        up(rs[o], mid + 1, r, k, v);
}
int qu(int o, int l, int r, int ql, int qr) {
    if (l >= ql && r <= qr)
        return sum[o];
    int res = 0;
    if (ql <= mid)
        res += qu(ls[o], l, mid, ql, qr);
    if (qr > mid)
        res += qu(rs[o], mid + 1, r, ql, qr);
    return res;
}
int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        cnt = 0;
        ll ans = 1;
        int rt = 0, n, m, k, x, y;
        char c, s[2];
        scanf("%d%d%d", &n, &m, &k);
        for (int i = 1; i <= k; i++) {
            scanf("%d%d%s", &x, &y, s);
            c = s[0];
            if (c == 'L')
                a[i] = node{1, x, y, 2};
            if (c == 'R')
                a[i] = node{x, n, y, 2};
            if (c == 'U')
                a[i] = node{x, x, y, 1};
            if (c == 'D') {
                a[i] = node{x, x, y, 3};
                up(rt, 1, n, x, 1);
            }
        }
        sort(a + 1, a + 1 + k);
        for (int i = 1; i <= k; i++)
            if (a[i].opt == 1)
                up(rt, 1, n, a[i].x1, 1);
            else if (a[i].opt == 2)
                ans += qu(rt, 1, n, a[i].x1, a[i].x2);
            else
                up(rt, 1, n, a[i].x1, -1);
        printf("%lld\n", ans);
        for (int i = 1; i <= cnt; i++)
            sum[i] = ls[i] = rs[i] = 0;
    }
}

1003 Rikka with Mista

题意:有n个数,你可以选择一些数相加得到一个新的数num,求所有选择方案中产生的num数位上的4的个数总和
解法:n最大才40,我们不妨折半枚举,两个集合各存2^20个数,然后枚举4出现的位置(即xxx4,xx4x,x4xx…),分别去计算贡献,怎么算,比如我要算4出现在十位的数量,我们把两个集合的数取出来都%100,然后基数排序,用两个指针扫一下,对于所有的 a i ai ai,我们找一个 j j j,使得 a i + b j ai+bj ai+bj是不超过50的最大数,找一个 k k k,使得 a i + a k ai+ak ai+ak是不超过40的最大数,然后 a n s + = j − k ans += j - k ans+=jk即可,150和140的贡献亦同理
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 2e6 + 10;
vector<int> G, V;
int a[41], A[maxn], B[maxn];
struct node {
    int x, m, v;
};
stack<node> sta;
int vis[maxn * 10];
void merge(int k, int *arr, int opt) {
    int id = 0;
    if (opt == 1)
        for (auto x : G) {
            arr[++id] = x % k;
            if (k <= 10000000)
                vis[arr[id]]++;
        }
    else
        for (auto x : V) {
            arr[++id] = x % k;
            if (k <= 10000000)
                vis[arr[id]]++;
        }
    if (k <= 10000000) {
        id = 0;
        for (int i = 0; i < k; i++)
            while (vis[i])
                arr[++id] = i, vis[i]--;
    }
    else
        sort(arr + 1, arr + 1 + id);
}
int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        int n;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
            scanf("%d", &a[i]);
        G.clear();
        V.clear();
        sta.push(node{1, n / 2, 0});
        while (!sta.empty()) {
            node tmp = sta.top();
            sta.pop();
            if (tmp.x > tmp.m) {
                G.push_back(tmp.v);
                continue;
            }
            sta.push(node{tmp.x + 1, tmp.m, tmp.v});
            sta.push(node{tmp.x + 1, tmp.m, tmp.v + a[tmp.x]});
        }
        sta.push(node{n / 2 + 1, n, 0});
         while (!sta.empty()) {
            node tmp = sta.top();
            sta.pop();
            if (tmp.x > tmp.m) {
                V.push_back(tmp.v);
                continue;
            }
            sta.push(node{tmp.x + 1, tmp.m, tmp.v});
            sta.push(node{tmp.x + 1, tmp.m, tmp.v + a[tmp.x]});
        }
        int n1 = G.size(), n2 = V.size();
        ll ans = 0;
        for (int i = 1, p = 1; i <= 9; i++, p *= 10) {
            merge(p * 10, A, 1);
            merge(p * 10, B, 2);
            if (B[n2] < p)
                break;
            int p2 = lower_bound(A + 1, A + 1 + n1, 5 * p - B[1]) - A;
            if (p2 > n1)
                p2--;
            int p1 = lower_bound(A + 1, A + 1 + n1, 4 * p - B[1]) - A;
            if (p1 > n1)
                p1--;
            int j = 1;
            for (; j <= n2 && B[j] < 5 * p; j++) {
                while (p2 && B[j] + A[p2] >= 5 * p)
                    p2--;
                while (p1 && B[j] + A[p1] >= 4 * p)
                    p1--;
                if (B[j] + A[p2] >= 4 * p)
                    ans += p2 - p1;
            }
            while (j && B[j] >= 4 * p)
                j--;
            j++;
            int p4 = lower_bound(A + 1, A + 1 + n1, 15 * p - B[j]) - A;
            if (p4 > n1)
                p4--;
            int p3 = lower_bound(A + 1, A + 1 + n1, 14 * p - B[j]) - A;
            if (p3 > n1)
                p3--;
            for (; j <= n2; j++) {
                while (p4 && B[j] + A[p4] >= 15 * p)
                    p4--;
                while (p3 && B[j] + A[p3] >= 14 * p)
                    p3--;
                if (B[j] + A[p4] >= 14 * p)
                    ans += p4 - p3;
            }
        }
        printf("%lld\n", ans);
    }
}

1007 Rikka with Travels

题意:给一棵树,求出所有的pair<a, b>,a,b为树上两条不相交的路径长度,路径长度定义为路径上点的数量
解法:裸的动态维护树的直径,两颗树合并新的直径的两端点必定是原来两颗树直径上的4个端点之2,然后我们枚举所有边,对边两边的子树分别求直径即可,也没啥好讲的,简单题。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5 + 10;
vector<int> G[maxn];
int dep[maxn], son[maxn], f[maxn], sz[maxn], cnt;
int id[maxn], top[maxn], X[maxn];
struct node {
    int x, y, len;
} d[maxn];
vector<node> suf[maxn];
void dfs(int u, int fa, int deep)
{
    f[u] = fa;
    dep[u] = deep;
    sz[u] = 1;
    son[u] = 0;
    for(auto v : G[u]) {
        if(v == fa)
            continue;
        dfs(v, u, deep + 1);
        sz[u] += sz[v];
        if(sz[son[u]] < sz[v])
            son[u] = v;
    }
}
void dfs0(int u, int rt)
{
    id[u] = ++cnt;
    top[u] = rt;
    if(son[u])
        dfs0(son[u], rt);
    for(auto v : G[u]) {
        if(v == f[u] || v == son[u])
            continue;
        dfs0(v, v);
    }
}
int LCA(int x, int y) {
    while (top[x] != top[y]) {
        if (dep[top[x]] < dep[top[y]])
            swap(x, y);
        x = f[top[x]];
    }
    if (id[x] > id[y])
        swap(x, y);
    return x;
}
int dist(int x, int y) {
    int lca = LCA(x, y);
    return dep[x] + dep[y] - 2 * dep[lca] + 1;
}
node merge(node a, node b) {
    node tmp = a;
    if (a.len < b.len)
        tmp = b;
    if (dist(a.x, b.x) > tmp.len)
        tmp = node{a.x, b.x, dist(a.x, b.x)};
    if (dist(a.x, b.y) > tmp.len)
        tmp = node{a.x, b.y, dist(a.x, b.y)};
    if (dist(a.y, b.x) > tmp.len)
        tmp = node{a.y, b.x, dist(a.y, b.x)};
    if (dist(a.y, b.y) > tmp.len)
        tmp = node{a.y, b.y, dist(a.y, b.y)};
    return tmp;
}
void dfs1(int u, int fa) {
    d[u] = node{u, u, 1};
    for (auto v : G[u])
    if (v != fa) {
        dfs1(v, u);
        d[u] = merge(d[u], d[v]);
    }
}
void calc(int x, int y) {
    if (x > y)
        swap(x, y);
    X[x] = max(X[x], y);
}
void dfs2(int u, int fa) {
    suf[u].push_back(d[u]);
    for (int i = G[u].size() - 1, j = 0; ~i; i--, j++)
    if (G[u][i] != fa)
        suf[u].push_back(merge(suf[u][j], d[G[u][i]]));
    else
        j--;
    node tmp = d[u];
    int i = suf[u].size() -  2;
    for (auto v : G[u]) {
        if (v == fa)
            continue;
        node cat = merge(tmp, suf[u][i]);
        calc(cat.len, d[v].len);
        tmp = merge(tmp, d[v]);
        d[v] = merge(cat, node{v, v, 1});
        dfs2(v, u);
        i--;
    }
}
int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        cnt = 0;
        int n, u, v;
        scanf("%d", &n);
        for (int i = 1; i <= n + 1; i++)
            G[i].clear(), X[i] = 0, suf[i].clear();
        for (int i = 1; i < n; i++) {
            scanf("%d%d", &u, &v);
            G[u].push_back(v);
            G[v].push_back(u);
        }
        dfs(1, 0, 0);
        dfs0(1, 1);
        dfs1(1, 0);
        d[1] = node{1, 1, 1};
        dfs2(1, 0);
        ll ans = 0;
        for (int i = n; i; i--) {
            X[i] = max(X[i], X[i + 1]);
            if (X[i])
                ans += 1 + (X[i] - i) * 2;
        }
        printf("%lld\n", ans);
    }
}

1008 Rikka with Stable Marriage
多校5的原题:
2019 Multi-University Training Contest 5

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e5 + 10;
struct Tri {
    int ch[maxn * 31][2], cnt[maxn * 31], val[maxn * 31], sz;
    void init() {
        sz = 0;
        ch[sz][0] = ch[sz][1] = 0;
    }
    void insert(int x, int v) {
        int o = 0;
        for (int i = 29; i >= 0; i--) {
            int c = 0;
            if (x >> i & 1)
                c = 1;
            if (!ch[o][c]) {
                ch[o][c] = ++sz;
                cnt[sz] = ch[sz][0] = ch[sz][1] = 0;
            }
            o = ch[o][c];
            cnt[o] += v;
        }
        val[o] = x;
    }
    int query(int x) {
        int o = 0;
        for (int i = 29; i >= 0; i--) {
            int c = 1;
            if (x >> i & 1)
                c = 0;
            if (!cnt[ch[o][c]])
                c ^= 1;
            o = ch[o][c];
        }
        return val[o];
    }
    int find(int x) {
        int o = 0;
        for (int i = 29; i >= 0; i--) {
            int c = 0;
            if (x >> i & 1)
                c = 1;
            if (!cnt[ch[o][c]])
                return 0;
            o = ch[o][c];
        }
        return 1;
    }
} ac[2];
int a[maxn], b[maxn], c[maxn], s[maxn * 2];
int main() {
    int T, n;
    scanf("%d", &T);
    while (T--) {
        scanf("%d", &n);
        ac[0].init();
        ac[1].init();
        for (int i = 1; i <= n; i++) {
            scanf("%d", &a[i]);
            ac[0].insert(a[i], 1);
        }
        for (int i = 1; i <= n; i++) {
            scanf("%d", &b[i]);
            ac[1].insert(b[i], 1);
        }
        int cnt = 0, top = 0;
        s[0] = -1;
        for (int i = 1; i <= n; i++)
        if (cnt < n && ac[0].find(a[i])) {
            s[++top] = a[i];
            while (top && cnt < n) {
                if (top & 1) {
                    int B = ac[1].query(s[top]);
                    if (ac[0].query(B) == s[top]) {
                        c[++cnt] = s[top] ^ B;
                        ac[0].insert(s[top], -1);
                        ac[1].insert(B, -1);
                        top--;
                        if (s[top] == B)
                            top--;
                    }
                    else
                        s[++top] = B;
                }
                else {
                    int A = ac[0].query(s[top]);
                    if (ac[1].query(A) == s[top]) {
                        c[++cnt] = s[top] ^ A;
                        ac[0].insert(A, -1);
                        ac[1].insert(s[top], -1);
                        top--;
                        if (s[top] == A)
                            top--;
                    }
                    else
                        s[++top] = A;
                }
            }
        }
        ll ans = 0;
        for (int i = 1; i <= cnt ; i++)
            ans += c[i];
        printf("%lld\n", ans);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长沙橘子猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值