1. 程式人生 > >noi.ac系列NOIP2018模擬賽參賽實錄

noi.ac系列NOIP2018模擬賽參賽實錄

已更新到2018.9.23:第六場比賽


被教練要求去參加這個比賽,結果被錘爆…難道我OI生涯的最後一年要晚節不保了麼…
題目質量非常不錯,思維很廣闊,出題人陣容很強大,難度比NOIP稍高,但並沒有到很省選的水平,所以還是我太菜了啊…
比賽網址:noi.ac
**注意,這裡寫的是本人的參賽實錄,可能並不包含題目真正的題解!**

2018.9.8 Day1

T1 Candy

題目大意: 兩個數列,每個數列中有nn個數,要從中取數,取一個數有w(>0)w(>0)的代價,收益為在AA中取的數的和,與在BB中取的數的和,這兩個和的最小值。求收益-代價的最大值。
我的思路:

原題的資料範圍中給出了A,BA,B已經排好序的性質,實際上如果不給這個性質的話你手動排序就行,就是不容易看出來。
可以肯定的是,最優解中A,BA,B中取的數一定都是對應最大的。那麼我們先列舉哪一邊是最小值,然後在兩邊用兩個指標進行計算,因為收益是最小值,所以另一邊只要達到列舉的最小值就不再繼續了,因此是最優的,於是我們就O(n)O(n)解決了這一題。
這道題我在場上就拿到了滿分。

T2 Sort

題目大意: 給定長為n(50000)n(\le 50000)的一個序列AA,可以進行區間翻轉操作,翻轉區間[l,r][l,r]的代價是rl+1r-l+1。構造出一種操作方案使得代價不超過2

×1072\times 10^7,並使得操作後序列AA中的數字按照從小到大的順序排列。
我的思路: 我在場上寫了O(n2)O(n^2)的暴力拿了65分,然後在考試結束前半個小時想到了(疑似)正解,可惜碼力實在不夠寫不出來。
正解的思路大概是從序列中只有0011的特殊性質入手。考慮分治,每次的意圖是把11湊在區間的右邊。先遞迴處理左半和右半區間,然後處理當前區間時,只需要一次翻轉把左半區間的11湊到右邊即可。顯然這樣的代價不超過nlognn\log n,所以直接模擬翻轉操作,時間複雜度就是O(logn)O(\log n)
當序列是任意序列時,可以借用快速排序的思想,選定一箇中間點,然後把比它小的放前面,否則放後面。選中間點就是O
(nlogn)O(n\log n)
的了,而這個放置的過程,實際上我們只要給比中間點小的數標00,否則標11,就和上面的特殊性質一模一樣了。於是外層用快速排序的分治,對於每個區間的排列也分治,這樣代價就不超過nlog2nn\log^2n,時間複雜度也同樣了。

T3 MST

題目大意: 給定一棵生成樹的邊權集合,求有多少點數為n(40)n(\le 40)的,邊權在[1,n(n1)2][1,\frac{n(n-1)}{2}]中的,不同邊邊權不同的無向完全圖,滿足存在邊權集合為給定集合的最小生成樹。
我的思路: 這題我在考場上只想出了邊權集合為11n1n-1的方法…
我們知道Cayley定理:無向完全圖的帶標號生成樹數目是nn2n^{n-2}。而當邊權集合為11n1n-1時,顯然我們只需要列舉生成樹的位置,其他的邊無論怎麼填都不會影響最小生成樹的位置。於是答案就是nn2(n1)!(n(n1)2n+1)!n^{n-2}\cdot (n-1)!\cdot (\frac{n(n-1)}{2}-n+1)!
本來可以拿到40分的,結果傻逼了忘記取模,爆成10分…
其實我考場上有一個思路和正解的思路非常接近,但很遺憾沒有時間細想下去。按Kruskal的思想從小到大填邊,在填一條樹邊的時候,一定要是連線原來分開的兩個連通塊,反之,則一定是在原來的某個連通塊中連。注意到這個過程僅和所有點的連通塊的狀態有關,並且並不用求出真的連通狀態,只需要表達出各大小的連通塊的數量就行了。這樣的狀態數有多少個呢?注意到這就是整數拆分數PnP_n,打表可知P40P_{40}大約為3000030000多。接著就可以按照上面的方法轉移了,不過好像還要優化,因為我還沒細想,所以就先到這裡吧。

第一天我的分數是100+65+10=175,有諸多遺憾,甚至一度認為自己連NOIP都考不出來了…不過這些題目也是很好地開闊了我的思維,受教了。

2018.9.9 Day2

T1 Palindrome

題目大意: 定義一個字串的迴文拆分為,將其拆分成kk段,使得第11和第kk段,第22和第k1k-1段…都相等。對每個字串,求最大的kk
我的思路: 由於考試策略的原因,這道題我是在最後寫的…
我們需要一個結論:在進行兩端的分割的時候,一定是割出最短的合法相等子串是最優的。這個可以用反證法自己證明。然後我們就可以用字串雜湊做到O(n)O(n)了。
然而考場上我非常傻逼地寫了一個KMP只拿了70…太毒了…

T2 String

題目大意: 有一個長為n(50)n(\le 50)的只包含ABCDABCD四個字母的字串,每次操作可以交換兩個相鄰字元,也可以在給定的m(100)m(\le 100)個操作中選擇一個,這些操作的形式都是把某一個特定的子串換成長度相等的另一個子串,也是隻包含ABCDABCD四個字母。求一個操作序列,使得途中經過的不同字串的數量最多,輸出這個數量。
我的思路: 首先,由於可以交換字元,所以當字元的數量相等時,不同的字串可以相互轉換,因此我們就可以用(a,b,c,d)(a,b,c,d)這樣的狀態表示有aaAAbbBB…的字串集合。而因為字串長度nn總是不變,因此可以省掉一維。
接下來,因為可以交換字元,所以只要字元數達到要求,就一定可以交換出一個可以進行操作的子串,用這樣的要求去判斷和連邊即可。
連完邊之後,我們發現可能有環,因此進行SCC縮點,然後對得到的有向圖做拓撲序DP,找到帶權最長路即可。
要注意的是,答案可能超過long long的範圍,但不會超過兩個long long拼起來的範圍,因此要使用一些玄學操作來進行計算。反正我不太會…所以在考場上只得到了80分。

T3 BST

題目大意: 有一棵有2n(n20)2^n(n\le 20)個葉子節點的完全二叉樹,葉子一開始從左到右編號為112n2^n,非葉子節點從上到下分層,第ii層從左到右編號為2i12^{i-1}2i12^i-1。現在有mm次操作,一個是給定一個區間[l,r][l,r],依次交換點ll到點rr的左右子樹。另一個是詢問現在從左到右第xx個葉子節點的編號。要注意的是,葉子節點的編號是隨著旋轉而變化的,而非葉子節點的編號單純按位置來定。
我的思路: 正解用線段樹,暫時不是很會,只寫了60分的部分分。
首先30分可以暴力模擬…就不說了。然後我做的是特殊性質,注意到如果把點的編號化成二進位制串,那麼題中的樹就是一棵trie,而對於區間[2x,2y1][2^x,2^y-1]進行操作,實際上就是把第x+1x+1到第yy層的0101索引交換了,因此在找的時候如果這一層的索引被交換了奇數次,就往反方向走就行了。

這次比賽考得就不錯了,70+80+60=210,得到了第三名,雖然也有點遺憾(第一題傻逼了),但還是考出了應有的水平(?)吧。

2018.9.15 Day3

T1 列隊

題目大意:11n(1000)×m(1000)n(\le 1000)\times m(\le 1000)的排列填在一個n×mn\times m的方陣中,q(5×105)q(\le 5\times 10^5)個詢問,每次詢問一對(x,y)(x,y),表示詢問有多少個數在當前行是第xx大,在當前列是第yy大。
我的思路: 這題挺水的…把n×mn\times m11按順序填入方陣,一個數在填入的時候,在當前行中已填入的數字的數目,就是當前行比它大的數字的數目,因此很自然地得到排名,列也是同理,就這樣記錄一下即可O(1)O(1)回答每個詢問,時間複雜度O(nm)O(nm)

T2 染色

題目大意:m(5000)m(\le 5000)種顏色填入有n(5000)n(\le 5000)個小格的紙條,求對於任意連續mm個格子裡,必然存在兩個格子顏色相同的填色方案數。
我的思路: 這題我是最後做的,在考場上想了兩個小時…然而還是涼了…
賽後同校AFO大佬說:“這題挺簡單的啊…”並一下就說出了怎麼轉移,仔細一想還真的很有道理…
f(i,j)f(i,j)為前ii個格子中填色,其中從後往前最長一段不包含相同顏色格子的字尾長度為jj的方案數。那麼在轉移時,如果不選擇最後jj個格子中的顏色,那麼最長字尾長度就變成j+1j+1,有mjm-j種顏色可供轉移。如果選擇最後jj個格子中的顏色,那麼最長字尾長度就會變成1,2,...,j1,2,...,j,各有11種顏色轉移。於是得到狀態轉移方程:
f(i,j)=(mj+1)f(i1,j1)+kjf(i1,k)f(i,j)=(m-j+1)f(i-1,j-1)+\sum_{k\ge j}f(i-1,k)
轉移的時候用字尾和優化一下就可以達到O(nm)O(nm)的複雜度了。而此時,要計算最長字尾長度達到過mm的方案數比較麻煩,不如補集轉化一下,反過來求最長字尾長度不曾達到過mm的方案數更加簡單,只需要不考慮f(i,m)f(i,m)的影響即可,最後用mnm^n減去這個方案數就是答案了。

T3 遊戲

題目大意: 一個遊戲有n(105)n(\le 10^5)個角色排成一個序列,有m(10)+1m(\le 10)+1個等級(0,1,...,m0,1,...,m),有mm個引數a1,...,ama_1,...,a_m,滿足角色經驗值ax\ge a_x

相關推薦

noi.ac系列NOIP2018模擬參賽實錄

已更新到2018.9.23:第六場比賽 被教練要求去參加這個比賽,結果被錘爆…難道我OI生涯的最後一年要晚節不保了麼… 題目質量非常不錯,思維很廣闊,出題人陣容很強大,難度比NOIP稍高,但並沒有到很省選的水平,所以還是我太菜了啊… 比賽網址:noi.ac *

NOIP2018模擬2018.10.17】刺客信條(AC

題目 題解 –這道題可以用二分,或者是並查集 但是怎麼寫check()是個大問題 首先,你可以發現,對於一個人,他能控制的範圍是個圓 如果不能到終點的情況就是一串圓相連,把起點和終點隔開 所以可以用並查集維護連通性 當邊界剛好聯通的那個就是最遠的距離 程式碼

EZ 2018 05 13 NOIP2018 模擬(十三)

ret 觀察 長度 [] 自己 上線 發現 int end uil 這次的比賽真心水,考時估分240,然後各種悠閑亂逛 然後測完T1數組開小了炸成40,T2,T3都沒開long long,T2炸成20,T3爆0 掉回1600+的深淵,但是還有CJJ dalao比我更慘 T1

EZ 2018 05 20 NOIP2018 模擬(十五)

html cst PE com space 相對 stdin 順序 處理 這次的比賽充滿著玄學的氣息 首先講一下為什麽沒有第十四場 其實今天早上9點時看到題目就叫了:原題! 沒錯,整套試卷都做過,我還寫了題解 然後老葉就說換一套,但如果僅僅是這樣就沒什麽 但等13min後結

[NOIP2018模擬10.20A]掛分報告

查詢 不用 ble names != 還記得 就是 roi con 閑扯 先看看了B組,T1 ZROI剛好講過一個性質原根一般很小的,直接枚舉;T2一眼二分然後似乎狀壓 T3沒看 然後上來A組題,T1 flow這名字...網絡流?! T1題面非常的社會主義核心價值觀,看到有

[NOIP2018模擬10.25]瞎搞報告

情況 read 要求 ati 大小 樹狀 ... void 兩個 閑扯 最近有點頹,都修到好晚,早上起來和吔shi一樣難受 忍著困意把題面看完,發現啥也不會,又是一場寫暴力的模擬賽 T1發現似乎可以DP,順手碼了個 T2像個最小瓶頸路板子,但是只做過N^2算法的... T3

雅禮 noip2018 模擬 day3 T3

典型樹形dp 這裡,我們應該看到一些基本性質: ①:如果這個邊不能改(不是沒有必要改),我們就不改,因為就算改過去還要改回來,顯然不是最優的 注意:“不能改”是指邊的性質和要求的相同而不包括對邊的顏色沒有要求的情況! ②:如果我們每翻轉一條邊,就認為將這條邊的兩個端點度數+

雅禮 noip2018 模擬day3 T2

典型的狀壓思想 設0表示黑球,1表示白球,用一串01序列代表剩下的球的狀態,記f[i]表示在i狀態下取球的最大期望 那麼可以利用記憶化搜尋更新,每一層列舉可能拿走的球然後向下搜尋,同時記憶化即可 在狀態中刪去一個點可以利用位運算實現 同時要注意一個問題,就是狀態0010和狀

【HHHOJ】NOIP2018 模擬(二十五) 解題報告

點此進入比賽 得分: \(100+100+20=220\)(\(T1\)打了兩個小時,以至於\(T3\)沒時間打了,無奈交暴力) 排名: \(Rank\ 8\) \(Rating\):\(+19\) \(T1\):【HHHOJ126】求和(點此看題面) 看到這道題,我不由得想到這道題目:【BZO

NOIP2018模擬2018.11.1】

預處理優化  一看就知道是快速冪,但是很可惜,暴力快速冪很慢,50分。 考慮分解b,達到O(1)查詢效果  觀察到一個重點l <= 1012,即可知道b <= 1012  於是考慮分解b,分成 x*1e6 + y 的形式,預處理出 a的1 ~ 1e6次方, 然後

NOIP2018模擬Potato 概率Dp 矩陣優化

NOIP2018模擬賽Potato 題目 分析 考慮動態規劃。 首先考慮到產生一個 j j

NOIP2018模擬2018.10.31】

簡單模擬  貪心思想,每次儘量輸出最大的數,維護一個字尾最大值,表示當前位置(包括當前數)到n中的最大值,可以通過倒推得到。  首先棧中壓入第一個數,然後進行比較:若當前位置字尾最大值小於棧頂元素,則彈出棧頂,否則依次壓入棧中直至後面沒有比當前棧頂大的數,如此重複即可。 程式碼如下

NOIP2018模擬2018.10.30】

區間DP  明顯的序列合併操作,dalao們想到了區間DP  預處理0~7進行題目所示操作(實際上你會發現就是(a + b)/2)結果(O(1)算也可以),f[l][r][k]代表區間為[l,r]時,可以合併出k,轉移明顯是:  if(f[l1][r1][ki] &&

NOIP2018模擬2018.10.29】

正解 邊帶權並查集 具體思路,跟一般的邊帶權並查集一樣,一邊加入並查集,維護每個點到其根的dis,還沒加入的邊預設正確,在加入的邊中進行判斷是否合法。  可以知道,若一次詢問兩個士兵 (設為l,r) 在一個集合中,為了滿足前面的要求,又要滿足這次的要求,必須 dis[l] + d == d

NOIP2018模擬2018.10.27】

小貓爬山 【題目描述】: Freda和rainbow飼養了N只小貓,這天,小貓們要去爬山。經歷了千辛萬苦,小貓們終於爬上了山頂,但是疲倦的它們再也不想徒步走下山了(嗚咕>_<)。 Freda和rainbow只好花錢讓它們坐索道下山。索道上的纜車最大承重量為W,而N只小貓的重量

NOIP2018模擬2018.10.26】

第一題數論,證不出來,,, spfa統計到每個點最短路數量,乘起來就是答案。 統計方法:更新最短路就把此點最短路數量重新賦為1,遇到相等dis[x] + w == dis[to]的情況則數量++。 程式碼: #include<bits/stdc++.h> using

NOIP2018模擬2018.10.25 B組】

此題爆零。原因不知道可以因費馬小定理推出 b' = b MOD p。 可以看出,f(u,p) = v 在這道題裡面意思就是 v = u MOD p,由於p是一個質數,那麼可以知道所有的a[i]等價於a[i] % p,所有的b[i]等價於b[i] % (p-1) 懶得講部分分 

NOIP2018模擬2018.10.24 B組】

此題直接暴力列舉 1~1e6 + 1000 左右預處理一個好數陣列,然後二分找到詢問n位置,往後找m個就行了。。 被行末空格噁心到,,程式碼變醜了好多。。 #include<bits/stdc++.h> using namespace std; #define ll lon

NOIP2018模擬2018.10.23】字串

字串(string) 【題目描述】 定義兩個字串A,B相似當且僅當滿足以下兩個條件中的至少一個: (1)A和B相同; (2)將A分為長度相同的兩個子串A0,A1,將B分為長度相同的兩個子串B0,B1,滿足A0相似於B0,A1相似於B1或A0相似於B1,A1相似於B0。 給定兩個字串S,T,問它們

NOIP2018模擬2018.10.22】pets

與cards同天考的題,反正很噁心人。。 首先分組,我將一隊放進a,二隊放進b,然後隊伍中n^2建邊,若 i 打得過 j 就連一條有向邊,將 j 的入度+1,然後topo序判環。 可以看出如果有環就說明一個隊中存在 a 打得過 b,b 打得過 c, c 又打得過 a 的情況,這種