1. 程式人生 > 其它 >Codeforces Round #837 (Div. 2)補題

Codeforces Round #837 (Div. 2)補題

Codeforces Round #837 (Div. 2)

A. Hossam and Combinatorics

知識點:簡單題
複雜度:\(O(nlogn)\)

很明顯能看出,該題與資料的位置無關,只與大小有關
所以我們可直接排序,判斷最大與最小元素個數即可
注意特判所有元素均相等情況


#define rep(i,l,r) for(int i=l,_##i=r;i<=_##i;i++)
#define per(i,r,l) for(int i=r,_##i=l;i>=_##i;i--)
#define ll long long
#define fi first
#define se second
#define endl '\n'
#define pll pair<ll,ll>
#define pii pair<int,int>
template<class T> using vc = vector<T>;
template<class T> using vvc = vc<vc<T> >;
const int N = 1e5 + 5;

ll n, m, k;
int a[N];

void solve()
{
    cin >> n;
    rep(i, 1, n) cin >> a[i];
    sort(a + 1, a + n + 1);
    if (a[1] == a[n]) cout << n * (n - 1) << endl;
    else
    {
        ll x(0), y(0);
        rep(i, 1, n) if (a[i] == a[1]) x++;
        rep(i, 1, n) if (a[i] == a[n]) y++;
        cout << x * y * 2 << endl;
    }
}

B. Hossam and Friends

知識點:計數,思維題
複雜度:\(O(nlogn)\)

很明顯能觀察出當一段區間內有一對互不相認的人時,該區間不合法
所以我們可以列舉區間左端點,找到每一對中不相認的較大編號的人的最小值,即可得到合法個數
顯然當一對不相認的人的較小編號在我們列舉的區間左端點左邊時,該較大編號對我們沒影響,可以刪去
分別用vector和multiset實現即可


#define rep(i,l,r) for(int i=l,_##i=r;i<=_##i;i++)
#define per(i,r,l) for(int i=r,_##i=l;i>=_##i;i--)
#define ll long long
#define fi first
#define se second
#define endl '\n'
#define pll pair<ll,ll>
#define pii pair<int,int>
template<class T> using vc = vector<T>;
template<class T> using vvc = vc<vc<T> >;
const int N = 1e5 + 5;

int n, m, k;
vc<int> h[N];
void solve()
{
    cin >> n >> m;
    rep(i, 1, n) h[i].clear();
    multiset<int> s;
    s.insert(n + 1);
    rep(i, 1, m)
    {
        int x, y; cin >> x >> y;
        if (x > y) swap(x, y);
        h[x].pb(y);
        s.insert(y);
    }
    ll ans(0);
    rep(i, 1, n)
    {
        ans += *s.begin() - i;
        for (auto x : h[i]) s.erase(s.find(x));
    }
    cout << ans << endl;
}

C. Hossam and Trainees

知識點:質因數分解,線性篩
複雜度:\(O(n^2logn)\)

fst了,1e3*1e3==1e9,我可真是大聰明

顯然我們可以用一個set儲存所有數的質因數,如果有兩個數有相同的質因數時,輸出YES
如果直接暴力篩質因數,複雜度為\(O(1e5*\sqrt{1e9}*log(1e5*10))\),複雜度爆炸
(1e9大小的數最多有10個不同的質因子)
但是如果我們先篩出\(\sqrt{1e9}\)內的質數,
那麼負責度就降為\(O(1e5*\frac{\sqrt{1e9}}{ln\sqrt{1e9}}*log(1e6)+\sqrt{1e9})\)

,大約為\(O(1e6*log(1e6))\)


#define rep(i,l,r) for(int i=l,_##i=r;i<=_##i;i++)
#define per(i,r,l) for(int i=r,_##i=l;i>=_##i;i--)
#define ll long long
#define fi first
#define se second
#define endl '\n'
#define pll pair<ll,ll>
#define pii pair<int,int>
template<class T> using vc = vector<T>;
template<class T> using vvc = vc<vc<T> >;
const int N = 1e5 + 5;

int n, m, k;
int a[N];

const int M = 4e4 + 5;

bool prime[M];
int p[M], pn = 0;
 
void get_prime(int n)
{
    fill(prime + 2, prime + n + 1, true);
    for (int i = 2; i <= n; i++)
    {
        if (prime[i]) p[++pn] = i;
        for (int j = 1; p[j] * i <= n; j++)
        {
            prime[i * p[j]] = false;
            if (i % p[j] == 0) break;
        }
    }
}

void solve()
{
    cin >> n;
    rep(i, 1, n) cin >> a[i];
    set<int> s;
    rep(i, 1, n)
    {
        for (int j = 1; j <= pn && p[j] <= a[i] / p[j]; j++)
        {
            if (a[i] % p[j] == 0)
            {
                if (s.count(p[j]))
                {
                    YES;
                    return;
                }
                s.insert(p[j]);
                while (a[i] % p[j] == 0) a[i] /= p[j];
            }
        }
        if (a[i] > 1)
        {
            if (s.count(a[i]))
            {
                YES;
                return;
            }
            s.insert(a[i]);
        }
    }
    NO;
}

void init()
{
    cin >> T_T;
    get_prime(40000);
}

D. Hossam and (sub-)palindromic tree

知識點:不知道
複雜度:\(O(不知道)\)

沒做出來,有時間就補