Central Europe Regional Contest 2016
XJTU ICPC Team Selection - Summer 2021 - Day3
A: Appearance Analysis
1s
Description
給你一個這樣的窗戶照片:
################
#....#++++#+...#
#....#++.+#+...#
#....#.++.#++.+#
#....#....#++++#
################
#....#.+..#++++#
#..++#.+..#++.+#
#+...#....#.++.#
#+...#..++#....#
################
“#”是窗玻璃邊緣,“+”表示有色的,“.”表示無色的
保證每片玻璃一樣大
求有多少片不同的玻璃(旋轉後完全重合算相同,不能翻轉)
行、列數\(\leq 111\)
Solution
模擬
B: Bipartite Blanket
3s
Description
給你一個二分圖 \(n\)個白點 \(m\)個黑點 ,每個點有點權。
從裡面選出若干黑點和若干白點使得它們可以完美匹配且點權之和大於等於\(t\),問有多少種選法
\(1\leq n,m\leq 20\)
C: Convex Contour
1s
Description
有一排連著的\(n\)個單位正方形,每個正方形裡面有下面圖形中的一個:
- 填滿單位正方形的正方形
- 內切圓
- 以單位正方形下底為邊的正三角形
求這一列圖形的凸包
Solution
可能是個計算幾何題但我拿解析幾何做的
考慮兩種情況
- 全是三角形:答案是\(2n+1\)
- 不全是:
找到左邊第一個不是三角形的和右邊第一個不是三角形的
它們之間的一定是兩條線段
它們兩側的分兩種情況:- \(x\)個三角形+正方形
- \(x\)個一串三角形+圓形
具體怎麼算直接貼程式碼吧
double calc(int x,bool b){//b=true表示圓,false表示正方形 if(x==0) return b?pi/2:2; if(b){ long double OP2=x*x+(D-1)*(D-1)/4; long double AP=sqrt(OP2-0.25); long double alpha=atan((D-1)/(2*x)),beta=acos(0.5/sqrt(OP2)); long double AB=(pi/2-alpha-beta)*0.5; return AB+AP+x+1.5; } else return x+2+sqrt( (x-0.5)*(x-0.5) + (1-D/2)*(1-D/2) ); }
D: Dancing Disks
E: Easy Equation
F: Free Figurines
1s
Description
給你\(n\)個俄羅斯套娃,從\(1\)到\(n\)依次增大。只能把小的放大的裡面。不在任何其他套娃裡的套娃是自由的。你可以:
- 把一個自由的套娃放進一個更大的空的自由的套娃中
- 開啟一個非空的自由的套娃並把直接位於其中的套娃拿出來
一組套娃的狀態可以用一個數組表示:p[i]表示套娃i外層的套娃,自由的套娃對應的p[i]=0。
告訴你初始狀態和結束狀態,求最少需要幾步到達結束狀態
Solution
定義操作 free(x)--將套娃\(x\)變為自由的 :
1.若p[x]不自由,free(p[x])
2.p[x]=0
首先,將所有初始狀態和結束狀態不同的套娃變為自由的。
其次,從小到大,將所有當前狀態和結束狀態不同的套娃直接變為結束狀態(若其結束狀態對應的p[i]不自由則還要先free(p[i]))。
G: Geohash Grid
H: Hangar Hurdles
8s
Description
你正在評估一些關於一個巨型飛機倉庫的建設計劃。飛機倉庫的地面可以表示為n行n列的網格圖,其中每個格子要麼是空的,要麼有障礙物。行從上到下依次被編號為1到n,列從左到右依次被編號為1到n。
存放飛機零件的大型集裝箱能在飛機倉庫的地面上自由移動是很重要的。我們可以將每個集裝箱看作一個以某個格子為中心的邊平行於座標軸的正方形。對於一個奇數k,一個尺寸為k的集裝箱是一個包含k行k列的正方形。一個集裝箱的座標為其中心格子的座標。集裝箱可以向上下左右移動,但不能碰到障礙物,且不能移出倉庫的邊界。
給定q對格子A_k和B_k,對於每對格子,請找到能從A_k移動到B_k的集裝箱的最大尺寸,注意這個尺寸也要是一個奇數。(轉自洛谷)
\(1\leq n\leq 1000\) , \(1\leq q\leq 300000\)
Solution(非正解)
先bfs預處理每個點能容納的最大箱子尺寸
然後列舉箱子尺寸:並查集維護對於當前尺寸能聯通的格子,對於每組詢問,若能到達則更新答案。
I: Invisible Integers
J: Jazz Journey
K: Key Knocking
1s
Description
定義一段01串's[0:3n]'的權重為:\(1+\sum_{1\leq i<3n} s[i]!=s[i-1]?1:0\)
你可以這樣修改字串:選定兩個相鄰的字元,將它們都取反。
請你通過至多\(n\)次操作使字串的權重達到至少\(2n\)。
\(1\leq n\leq 100000\)
Solution
從左到右掃一遍,若找到"111x"
或"000x"
則將最後的"1x"
或"0x"
取反。
若整個字串結尾是"000"
或"111"
,則改為"011"
或"100"
。
再從左到右掃一遍,若找到"0011"
或"1100"
則改為"0101"
或"1010"
,若修改次數達到上限則停止。
可以證明 前兩步通過至多\(\lfloor\frac{n}{2}\rfloor\)次將權重提至至少\(\lfloor\frac{3n}{2}\rfloor\)
第三步每次可以將權重提高至少\(1\),若修改次數達到上限則權重達到至少\(2n\)。若未達到上限說明已經不存在"0011"
或"1100"
可以證明此時權重也達到了\(2n\)。