1. 程式人生 > >Codeforces Round #505 (Div 1 + Div 2 Combined) Partial Solution

Codeforces Round #505 (Div 1 + Div 2 Combined) Partial Solution

style tro weak 必要條件 scan any none mas 做出

從這裏開始

  • 題目列表
  • 瞎扯
  • Problem A Doggo Recoloring
  • Problem B Weakened Common Divisor
  • Problem C Plasticine zebra
  • Problem D Recovering BST
  • Problem E Colored Cubes
  • Problem F Disjoint Triangles
  • Problem G Company Acquisitions

瞎扯

  打比賽,發現自己特別菜。

技術分享圖片

  居然還茍且水上紫名

技術分享圖片

  這個號不敢玩了。要努力學習才能對得起紫名啊,不然再玩兩場就灰了。

  然後日常瞎扯一下比賽狀況。比如奇葩的AC順序:A->D->B->C。

  為啥B題分辣麽低?Wrong Answer -(發現自己犯傻)-> Pretests Passed -(發現嚴重bug)-> Resubmission

  C居然數組開小1倍RE了一次,白白丟50分。

  由於做出B的時間有點晚,Hack的機會被Room裏一個1小時做不動題的Master全搶走了(好吧,其實是有些人代碼看不懂)

技術分享圖片

  最開始看完B沒有一眼切,後來AC的時候還想復雜了qwq。

  只能切完D穩定情緒再回來做。

  然後吐槽一下比賽吧。

  System Test 前 rk 300+,System Test 後 rk 200+。

  為啥?看一下Room裏的情況:

技術分享圖片

  fst + hack專場?

技術分享圖片

  (mcfx差點rk 1)。

  F好像是bzoj某道合宿題的簡化版(看完題解覺得好水。。怪不得OwenOwl一直說這次F好水,好後悔沒來打。dream_maker同學說他會$O(n^3)$,不會$O(n^2\log n)$,我很想噴一句。。),E可以用神奇的構造過掉。G?修說是神仙題。

  (最近可能有點忙,坑填得會很慢)

Problem A Doggo Recoloring

題目大意

  給定一個只包含小寫字母的字符串,每次可以將一種至少出現了2次的字符都變成另一個字符。問是否可能使所有字符一樣。

  特判$n = 1$的時候。其他時候看有沒有一個字符出現了兩次。

Code

技術分享圖片
 1 /**
 2  * Codeforces
 3  * Problem#1025D
 4  * Accepted
 5  * Time: 31ms
 6  * Memory: 100k
 7  */ 
 8 #include <bits/stdc++.h>
 9 using namespace std;
10 typedef bool boolean;
11 
12 const int N = 1e5 + 5;
13 
14 int n;
15 char str[N];
16 boolean aflag = false;
17 boolean vis[30];
18 
19 int main() {
20     scanf("%d", &n);
21     scanf("%s", str);
22     if (n == 1) {
23         puts("YES");
24         return 0;
25     }
26     for (int i = 0; i < n; i++)
27         if (vis[str[i] - a]) {
28             puts("YES");
29             return 0;
30         } else 
31             vis[str[i] - a] = true;
32     puts("NO");
33     return 0;
34 }
Problem A

Problem B Weakened Common Divisor

題目大意

  給定$n$個二元組$(a_{i}, b_{i})$,問是否存在一個$d > 1$,使得對於每個$1\leqslant i \leqslant n$滿足$d \mid a_{i}$或者$d \mid b_{i}$。

  首先講一個沙雕做法。

  暴力枚舉$a_{1} \times b_{1}$的質因子。然後$O(n)$檢查。時間復雜度$O(\sqrt{V} + n\log{V})$。

  然後講考場上我的zz做法。

  如果$d$滿足條件,那麽$d$能夠整除$lcm(a_{i}, b_{i})$。就是說$d$能整除每一對的最小公倍數的最大公約數。

  然後找它較小的約數就是答案(因為上面那句話只是必要條件,但不是充分條件,比如可能$d > a_{i}$且$d > b_{i}$,但$d\mid a_{i}b_{i}$)。(少了這一步 WA * 1)

  找這個合法的約數不能暴力找(然後暴力找能過pretest,後來發現resubmission * 1)

  取能成為答案的那部分約數的最小值就好了。這樣就可以保證它既是答案,又不會超過任意一個被選中的$a_{i}$或$b_{i}$。

Code

技術分享圖片
 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 
 5 const int N = 150005;
 6 
 7 int n;
 8 int a[N], b[N];
 9 ll ls[N];
10 
11 ll gcd(ll a, ll b) {
12     return (!b) ? (a) : (gcd(b, a % b));
13 }
14 
15 int main(){
16     scanf("%d", &n);
17 
18     for (int i = 1; i <= n; i++)
19         scanf("%d%d", a + i, b + i);
20 
21     for (int i = 1; i <= n; i++)
22         ls[i] = a[i] / gcd(a[i], b[i]) * b[i];
23     ll res = ls[1];
24     
25     for (int i = 2; i <= n; i++)
26         res = gcd(res, ls[i]);
27     for (int i = 1; i <= n; i++) {
28         ll x = gcd(res, a[i]);
29         if (x > 1)
30             res = min(res, x);
31         ll y = gcd(res, b[i]);
32         if (y > 1)
33             res = min(res, y);
34     } 
35 
36     if (res == 1)
37         cout << -1;
38     else
39         cout << res;
40     return 0;
41 }
Problem B

Codeforces Round #505 (Div 1 + Div 2 Combined) Partial Solution