2017年四川省赛記錄與反思

本文記錄了作者參加2017年省賽的經歷,詳細描述了熱身賽與正式賽的過程,包括隊伍的準備工作、比賽中的策略選擇以及最終的成績結果。

2017年省賽在樂山師範學院,時間是2017.6.3~2017.6.4,兩天。

第一天是報道日,提供午飯晚飯,下午15:30~18:00熱身賽。

第二天上午9:00正式開賽,14:00結束。15:30開始頒獎典禮。

第一天7點30起牀,把模板整理了一下,做成PDF拿到店裏去打印。

集訓隊9:15在校門口集合,去地鐵乘車。大一有兩個隊,和張老闆因爲要考高數,不能在上午和我們一起去。他們需要晚上21:30考完高數自己包車去。

天府廣場轉一號線,到火車南站,11:40的C字頭車。

車上背了一關單詞,然後睡意襲來……一覺醒來已經到樂山了。

打了個滴滴,到了「百步梯」。上去就是樂山師範學院了。

集訓隊10來個人,都在關心那個「百步梯」有幾階嗎……

熱身賽

省賽提供devcpp、vim、emacs、codeblocks、eclipse。

桌面上已經有vim了,我配置了一下vim,找到Devcpp的目錄,把Mingw64加入Path變量裏。

然後敲頭文件。

正在敲的時候,發題冊了。因爲是熱身賽,沒有那麼多規矩,包老闆就先開始讀題。

A題是個博弈。一個棋盤,一顆棋子。兩個人,輪流將棋子移動到相鄰(四連通)的格子裏。被走過一次的格子不能再走。給出棋盤長寬,每個人都採用最優的方案求最後誰會贏。

我當時也沒多想,這明顯就是一個博弈。腦補了一下,最優的情形應該是走遍整個棋盤然後無路可走啊!我給包老闆一說,他覺得不大對,他說再讀讀。

反正是熱身賽。我繼續悠閒地敲模板。敲完,編譯運行。

然而,我驚訝地發現,編譯出來的程序是「無法運行的64位程序」,而這個系統是Win7x86,2GB內存。

不管那麼多了,乾脆在Vim裏編輯,扔進Devcpp編譯。

後來我在codeblocks下面發現了Mingw32,理論上那個是能用的。

再看一看榜,很多人過了A題和B題。這太可怕了,難道真的是我想的這樣?

……然後我再仔細一看OJ上的A題,是一個A+B。題冊裏寫着的A題對應的是OJ上的B題。包老闆也覺得事情不對,趕緊讓我把剛剛那樣的思路敲上去交一發。

我們特別注意一下長寬的範圍似乎都是 109,就用long long存。乘起來判奇偶。

交了一發B題,AC。

然後我快速敲上A+B,AC。

這個時候,包老闆已經讀完題了。爲了方便接下來都用OJ上的題號指代題目。

C題是個神奇的題目,也是樓上往下扔雞蛋的問題,包老闆說他看不懂。

D題是個約瑟夫環的變種,線性的約瑟夫環。也就是說,n (1n106 ,好像是這樣)個人排成一排(不成環!),每次從第一個活着的開始殺,每數k 個人殺掉。直到數到的編號已經超過 n 了,再從編號最小的活着的開始殺。殺到都死光爲止。給出 q 個詢問,問是第幾個死掉的是誰。

都不大會啊……我做一眼題的能力是很強的,但是做需要一點思考的題目的時候就gg了。

我去讀C題,也不是很懂題意,然後腦補了一個題意給包老闆。他敲出來之後,發現連第二個樣例都過不了。

然後我試圖用鏈表把D敲出來,但是失敗了,算法和碼力雙重意義上的失敗。這麼大的數據,應該是要用數學方法遞推,O(n) 預處理之後回答詢問。

過了好久,包老闆讀懂了C題的題意,然後開始往DP方向上思考,然後過了一會兒開始敲。

包老闆調了好久,交一發,AC。

這個時候已經差不多要到18:00了,很多隊已經收拾東西離開機房了。

我們還在繼續看D……嘗試做出來。

然後熱身賽就這麼結束了。

我把頭文件和vim配置還有Mingw32地址都保存在D盤。重啓一下,東西還在。當時心想應該沒有問題,看起來不會清。

最後一看榜,嚇死了,順哥他們隊AK了,第一。

出來一問,發現他兩個隊友都去樂山大佛玩了,似乎是單挑的……太強大了。

拿着餐券去吃晚飯了。我還有笑神隊吃了好多西瓜……

當晚,包老闆在房間裏刷高數,一直刷到凌晨1點張老闆到爲止……太強大了。

正式賽

和熱身賽一樣,正式賽也是在同一個機房舉行的。比賽場地附近全都是人。

我們悄悄地跑準備室附近看了一眼,發現滿地的氣球裏綠色的球最多。看來那就是簽到題(事實證明不是……那是防AK題的氣球)。

8:55左右,開始進機房。發題冊,一人一本。反覆強調不準偷看題冊,手機需要關機。

而電腦已經開機了,是電子教室軟件控制的黑屏的狀態。

9:00,比賽開始。電腦亮屏。

打開D盤的那一瞬間我簡直想打人。除了編輯器的安裝包什麼都沒有了!

那也沒有辦法。vim需要配置,費時間。那只能用devcpp寫了。

我趕緊敲上頭文件。張老闆和包老闆讀題。

我們讀題是隨機讀題的,據信這樣遇到簽到題的概率更大。

包老闆讀了A,發現是個簽到題。

敲完,樣例過了,交一發,WA。

我趕緊上去debug,發現,包老闆沒有測第四個樣例……而正是第4個樣例爆long long了……但是真的可怕,我建議包老闆統一轉換爲unsigned ll 處理。

看了榜,我發現了F題電科過了。題目是這樣的,判斷F(x,y)=ax2+bxy+cy2是不是在xR,yR上都有F(x,y)010a,b,c10

我也不知道我怎麼想的,至少我現在還沒有辦法證明我的算法是對的。

算法是這樣的:暴力枚舉整數 x,y[107,107],然后看F(x,y)是不是有小於0的值。

包老闆下來,我上去,1分鐘敲完,然後交一發,AC。全教室第一個氣球插在了我們前面。

這個題最後出來問了一下其他人怎麼做的,都是用二次函數的Δ寫了很久的樣子……

因爲題目安排上的問題,我們這個時候已經是十幾名左右了。

我們繼續讀題。包老闆去看L了。

我發現G題能做一下。給兩個連續的整數區間,讓你輸出分別從兩個區間裏取元素相乘,能產生幾個互異的2017的倍數。

我一下子反應過來,2017是個質數!

也就是說,把兩個區間包含「2017的倍數」的個數乘起來就行了!

一行敲完,然後發現樣例都過不了,我們的答案太大。

我拉上張老闆一起來debug。

原來問題在於,有一些數重複了,所以我們算出來的值大於樣例!

興奮,繼續修改。交一發,WA。

然後張老闆有了個想法,上去寫了一個,但是沒過樣例……

包老闆來了,他看了一下,說你這個個數算的有問題……區間算小了。只見他在我第二版的代碼上減了1……然後就過了樣例。

交一發,AC!

接下來2個小時,我們全都在做L。

我們一開始的思路是待定係數法腦補出公式然後計算。

然後一個小時過去了,毫無進展。

我突然想到,可以枚舉一個維度,利用公式+后綴和計算答案!

這樣只需要O(n)的複雜度!

張老闆和包老闆短暫地驗證了一下我的想法。包老闆敲了一段代碼,算出來的答案和我說的一樣。

我發現有個取模的問題,給包老闆說了讓他思考,然後我上去先敲框架。敲完了,樣例過了,交一發,WA Test 2。

……

然後我們檢查了一個小半小時無所謂的細節,WA了5、6次。最後30分鐘的時候,包老闆突然發現,取模遇上除法有問題。

我們給包老闆拿來書,他寫了一個擴展歐幾里得算了一個乘法逆元。

我寫了一個連續自然數的對拍,生成了一堆數字。沒拍出錯誤來。於是交一發,WA Test 2。

包老闆建議交了一下暴力的,TLE Test 2。太可怕了……

然後我改了一下,做了一個隨機數的對拍,出現錯誤了。

包老闆興奮地上去debug,我們輸出了很多中間變量。發現,是我的那一段有問題。計算的過程中,有一個中間變量是負數。經過取模之後就錯了……

發現這個的時候只剩5分鐘了。我們重寫了一下核心代碼,但是因爲括號匹配炸了,連編譯都過不了。

突然,包老闆明白過來,出現負數的時候需要加上mod再%mod!

手忙腳亂地刪掉debug代碼,然後過了我的對拍!交一發。

但是,網頁返回“out of time”。

我們的2017四川省賽結束了。

看了一下,封榜前大概30多名。

這樣的名次肯定是連牌都沒有了。

頒獎典禮

出了門,遇到笑神。笑神給我們說,金14個(10%),銀28個(20%),銅42個(30%)。前42名都是有銀牌的……松了一口氣,最菜也是有銅啊。

最後,銅獎發完,沒有我們隊的名字出現。

拿到了一個銀牌。後來在終榜上是30多名。

反思

自從練習賽的時候多次爆int,我特別注意了int溢出的問題。
所以基本上不會犯這樣的錯誤了。

但是這次……對負數取mod……我是在51nod上見過這樣的題的。但是沒有及時想到……

還有很多問題……未完成

下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
源码来自:https://pan.quark.cn/s/a4b39357ea24 在VC++开发过程中,对话框(CDialog)作为典型的用户界面组件,承担着用户进行信息交互的重要角色。 在VS2008SP1的开发环境中,常常需要满足为对话框配置个性化背景图片的需求,以此来优化用户的操作体验。 本案例将系统性地阐述在CDialog框架下如何达成这一功能。 首先,需要在资源设计工具中构建一个新的对话框资源。 具体操作是在Visual Studio平台中,进入资源视图(Resource View)界面,定位到对话框(Dialog)分支,通过右键选择“插入对话框”(Insert Dialog)选项。 完成对话框内控件的布局设计后,对对话框资源进行保存。 随后,将着手进行背景图片的载入工作。 通常有两种主要的技术路径:1. **运用位图控件(CStatic)**:在对话框界面中嵌入一个CStatic控件,并将其属性设置为BST_OWNERDRAW,从而具备自主控制绘制过程的权限。 在对话框的类定义中,需要重写OnPaint()函数,负责调用图片资源并借助CDC对象将其渲染到对话框表面。 此外,必须合理处理WM_CTLCOLORSTATIC消息,确保背景图片的展示不会受到其他界面元素的干扰。 ```cppvoid CMyDialog::OnPaint(){ CPaintDC dc(this); // 生成设备上下文对象 CBitmap bitmap; bitmap.LoadBitmap(IDC_BITMAP_BACKGROUND); // 获取背景图片资源 CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = m...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值