1. 程式人生 > >Codeforces Global Round 1 暈闕記

Codeforces Global Round 1 暈闕記

create urn bit max script inf 最小 快速 round

Codeforces Global Round 1 暈闕記

我做這場比賽的時候暈得要死。做這三道題做太久了,rating漲不起來啊!

A

如果願意的話你可以看做是膜2意義下的運算,寫快速冪等各種膜運算。只不過對手速有考驗。

B

我題意差點理解不了了。這裏講一下題意:

給你\(m\)條棍子,編號從\(1\)\(m\),有\(n\)個位置的棍子斷了。你有無限長的修改帶,求你用\(k\)次機會修補棍子,所用修改帶的最小長度。允許修補到沒斷的棍子,允許修改區間重疊。

比賽的時候硬死想不出來,其實挺sb的:

我們貪心地覆蓋前\(n-k\)短的區間,剩下的區間直接一個點覆蓋即可。

沒錯,就這麽sb且貪心。

我是想不出來。

C

題意當然是看不懂啦!我們打表看看有沒有規律。

打表出來的規律就是:如果數字滿足\(2^k-1\),那答案是個奇怪的沒有規律的答案,否則答案是比它大的第一個\(2^k-1\)

這裏就有兩種做法:

  1. 腦子不會轉彎的做法:可以發現:答案都是當\(b\)取其中的某個因數時得到。所以我們碰到這些\(2^k-1\)的時候,分解因數,\(O(\log n)\)求解。
  2. 比較聰明的人才會的解法:可以發現:這些特殊的數字沒多少個啊!我們直接打表不就可以了嗎??!!
/*************************************************************************
 @Author: Garen
 @Created Time : Thu 07 Feb 2019 09:15:33 PM CST
 @File Name: A.cpp
 @Description:
 ************************************************************************/
#include<bits/stdc++.h>
using std::cin;
using std::cout;
using std::endl;
#define ll long long
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll gcd(ll x, ll y) {
    return y == 0 ? x : gcd(y, x % y);
}
ll f(ll a) {
    ll res = -INF, idx = -1;
    for(ll b = 1; b < a; b++) {
        ll temp = gcd(a ^ b, a & b);
        //res = std::max(res, gcd(a ^ b, a & b));
        if(temp > res) {
            res = temp; idx = b;
        }
    }
    cout << idx << endl;
    return res;
}
bool check(ll a) {
    ll i = 1;
    while(i <= a) {
        if(i == a) return true;
        i = (i << 1 | 1);
    }
    return false;
}
void baoli(ll a) {
    ll bound = sqrt(a);
    ll ans = -INF;
    for(ll i = 1; i <= bound; i++) {
        if(a % i == 0) {
            if(i != 1) ans = std::max(ans, gcd(a ^ i, a & i));
            if(a / i != i) {
                ll j = a / i;
                if(j != a) ans = std::max(ans, gcd(a ^ j, a & j));
            }
        }
    }
    if(ans == -INF) ans = 1;
    cout << ans << endl;
}
int main() {
    ll q; cin >> q;
    while(q--) {
        ll a; cin >> a;
        if(check(a)) {
            baoli(a);
        } else {
            ll i = 1;
            while(i <= a) i = (i << 1 | 1);
            cout << i << endl;
        }
    }
    /*
    for(ll a = 1; a <= 10000; a++) {
        cout << "f(" << a << ") = ";
        if(check(a)) {
            baoli(a);
        } else {
            ll i = 1;
            while(i <= a) i = (i << 1 | 1);
            cout << i << endl;
        }
    }
    */
    return 0;
}

E

這裏立一個flag。聽說不難的樣子。

Codeforces Global Round 1 暈闕記