zoukankan      html  css  js  c++  java
  • Single Round Match 811 1~4 题解

    vjudge链接

    TripleEliminationTournament

    先把 G 组中获胜的那个人抠出来,其他人都需要滚到被淘汰组:那么这些人的步数就是 $ 3 * (n - 1)$,对于胜者自己:只需走 $ G $ 步.

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define forn(i,x,n) for(int i = x;i <= n;++i)
    #define forr(i,x,n) for(int i = n;i >= x;--i)
    #define Angel_Dust ios::sync_with_stdio(0);cin.tie(0)
    
    class TripleEliminationTournament 
    {
        public:
        int countGames(int n,int k)
        {
            return 3 * (n - 1) + k;
        }
    };
    

    CircularParking

    直接模拟,注意跨过一环的情况.

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define forn(i,x,n) for(int i = x;i <= n;++i)
    #define forr(i,x,n) for(int i = n;i >= x;--i)
    #define Angel_Dust ios::sync_with_stdio(0);cin.tie(0)
    
    class CircularParking 
    {
        public:
        ll park(int n,int a,int b,int c)
        {
            set<int> unused;
            forn(i,0,n - 1) unused.insert(i);
    
            ll res = 0;
            forn(i,0,n - 1)
            {
                int p = (1ll * a * i % n * i % n + 1ll * b * i % n + c) % n;
                auto it = unused.lower_bound(p);
                if(it == unused.end())
                {
                    res += n - p;
                    it = unused.begin();
                    res += (*it);
                }
                else res += (*it) - p;
                unused.erase(it);
            }
    
            return res;
        }  
    };
    

    ReconstructPermutation

    直接模拟.

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define forn(i,x,n) for(int i = x;i <= n;++i)
    #define forr(i,x,n) for(int i = n;i >= x;--i)
    #define Angel_Dust ios::sync_with_stdio(0);cin.tie(0)
    
    const int N = 505;
    bool st[N];
    
    class ReconstructPermutation  
    {
        public:
        vector<int> reconstruct (int n, vector <int> a)
        {   
            forn(i,0,n - 1) st[i] = 0;
            vector<int> b,res;
            for(auto& _ : a)    st[_] = 1;
            forn(i,0,n - 1) if(!st[i])  b.push_back(i);
            sort(b.begin(),b.end());
            reverse(a.begin(),a.end());reverse(b.begin(),b.end());
            forn(i,0,n - 1)
            {
                if(a.empty())   res.push_back(b.back()),b.pop_back();
                else if(b.empty())  res.push_back(a.back()),a.pop_back();
                else
                {
                    if(a.back() < b.back()) res.push_back(a.back()),a.pop_back();
                    else                    res.push_back(b.back()),b.pop_back();
                }
            }
            return res;
        }  
    };
    

    SmoothDivisors

    因为范围特别大,所以应该有比较简单的办法判断某个数是否是牛逼的.先手推一些情况可以发现:显然对于 (1) 或者 (p) 肯定是牛逼的.如果再进一步的话,对于 (p * q) 或者 (p * p * q) 这种形式的不能是牛逼的,而如果有一个幂次达到 $ 3 $ 就可以.如果再往下组合 (p * q * r) 也是可以的,显然更多也可以.如此可以发现 不牛逼的数肯定是 (p * q) 或者 (p^2 * q) 这种形式.

    但是由于范围特别大,所以需要开 bitset 来保证运行.至于后面部分直接枚举质数就可以了,因为质数也没那么多.

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define forn(i,x,n) for(int i = x;i <= n;++i)
    #define forr(i,x,n) for(int i = n;i >= x;--i)
    #define Angel_Dust ios::sync_with_stdio(0);cin.tie(0)
    
    const int N = 4e7+7;
    vector<int> primes;
    bitset<N> st,bad;
    
    void init()
    {
        forn(i,2,N - 1)
        {
            if(!st[i])  primes.push_back(i);
            for(int j = 0;j < primes.size() && 1ll * primes[j] * i < N;++j)
            {   
                st[primes[j] * i] = 1;
                if(i % primes[j] == 0)  break;
            }
        }
    
        for(int i = 0;i < primes.size() && 1ll * primes[i] * primes[i] < N;++i)
        {
            for(int j = i + 1;j < primes.size() && 1ll * primes[i] * primes[j] < N;++j)  bad[primes[i] * primes[j]] = 1;
            for(int j = 0;j < primes.size() && 1ll * primes[i] * primes[i] * primes[j] < N;++j)  if(j != i) bad[primes[i] * primes[i] * primes[j]] = 1;
        }
    }
    
    class SmoothDivisors   
    {
        public:
        int count (int a,int b)
        {   
            init();
            int res = 0;
            forn(i,a,b) if(!bad[i])    ++res;
            return res;
        }  
    };
    

    MonotoneStrings

    不会 等着做.

  • 相关阅读:
    C语言程序设计100例之(12):Eratosthenes筛法求质数
    C语言程序设计100例之(11):求质数
    C语言程序设计100例之(10):最大公约数
    C语言程序设计100例之(9):生理周期
    C语言程序设计100例之(8):尼科彻斯定理
    C语言程序设计100例之(7):级数求和
    C/C++ 内部连接与外部连接
    C/C++ 内存管理问题
    C/C++浮点数的比较
    C/C++规范
  • 原文地址:https://www.cnblogs.com/HotPants/p/15173233.html
Copyright © 2011-2022 走看看