zoukankan      html  css  js  c++  java
  • Codeforces Round #645 (Div. 2)

    题目传送门

    还是视频题解
    昨晚比赛没打,就看了看题,ABD基本就是贪心+模拟,C感受一下算一下公式就行,E的话有点像交互,分情况讨论一下,(xleq 0)的情况最简单,枚举一下后缀就行;(x>0)的时候利用到了倍增的思想,就刚好符合题目给出的条件。感觉这种将题目条件运用到极致的题目挺像交互了2333。F细节是真的多,各种判断,一不小心就卡半天。。不过思路还是有借鉴性,考虑逆操作和前缀和的一些性质,还有最后(n=2)时操作类似于欧几里得算法这里也很巧妙。。

    补充一下E题思路:
    后面(lfloorfrac{n}{2} floor)个数,假设都为(x)

    考虑(xleq 0)的情况:注意到最后的答案(k>lfloorfrac{n}{2} floor),否则([n-k+1,n])这段区间和非正,不满足条件。那么可以直接枚举所有区间最后一个左端点的位置(i),当前会新产生([i,n])这段区间,显然其区间和可以直接计算;对于之前的区间,区间右端点都会左移一位,也就是之前所有的区间都会减少一个相同的数(x)。我们要考察所有区间和的最小值,那么只需对所有区间维护一个最小值,当区间端点移动时,最小值减去(x)即可,之后再与当前新产生的区间取(min)即可。

    (x>0)时,答案(k)没有明确的限制,我们可以发现若存在一个(k>lfloorfrac{n}{2} floor)合法,那么直接让(k=n)也是合法的;接下来就考虑(kleq lfloorfrac{n}{2} floor)的情况,此时假设存在一个(k)合法,容易发现(2k)也是合法的答案。也就是说我们能够将(k)倍增至大于(lfloorfrac{n}{2} floor)的某个位置。归纳一下(x>0)直接取(k=n)即可。


    代码如下:

    A. Park Lighting
    /*
     * Author:  heyuhhh
     * Created Time:  2020/5/27 9:52:38
     */
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <cmath>
    #include <set>
    #include <map>
    #include <queue>
    #include <iomanip>
    #include <assert.h>
    #include <functional>
    #include <numeric>
    #define MP make_pair
    #define fi first
    #define se second
    #define pb push_back
    #define sz(x) (int)(x).size()
    #define all(x) (x).begin(), (x).end()
    #define INF 0x3f3f3f3f
    #define Local
    #ifdef Local
      #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
      void err() { std::cout << std::endl; }
      template<typename T, typename...Args>
      void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
      template <template<typename...> class T, typename t, typename... A> 
      void err(const T <t> &arg, const A&... args) {
      for (auto &v : arg) std::cout << v << ' '; err(args...); }
    #else
      #define dbg(...)
    #endif
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> pii;
    //head
    const int N = 1e5 + 5;
     
    void run() {
        int n, m; cin >> n >> m;
        int ans = n * (m / 2);
        if (m & 1) {
            ans += n / 2;
            if (n & 1) ++ans;
        }
        cout << ans << '
    ';
    }
     
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0); cout.tie(0);
        cout << fixed << setprecision(20);
        int T; cin >> T; while(T--)
        run();
        return 0;
    }
    
    B. Maria Breaks the Self-isolation
    /*
     * Author:  heyuhhh
     * Created Time:  2020/5/27 9:35:36
     */
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <cmath>
    #include <set>
    #include <map>
    #include <queue>
    #include <iomanip>
    #include <assert.h>
    #include <functional>
    #include <numeric>
    #define MP make_pair
    #define fi first
    #define se second
    #define pb push_back
    #define sz(x) (int)(x).size()
    #define all(x) (x).begin(), (x).end()
    #define INF 0x3f3f3f3f
    #define Local
    #ifdef Local
      #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
      void err() { std::cout << std::endl; }
      template<typename T, typename...Args>
      void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
      template <template<typename...> class T, typename t, typename... A> 
      void err(const T <t> &arg, const A&... args) {
      for (auto &v : arg) std::cout << v << ' '; err(args...); }
    #else
      #define dbg(...)
    #endif
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> pii;
    //head
    const int N = 1e5 + 5;
     
    void run() {
        int n; cin >> n;
        vector <int> a(n);
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        sort(all(a));
        int r = 1;
        for (int i = 0, j; i < n; i = j + 1) {
            int fur = -1;
            for (j = i; j < n; j++) {
                if (j - i + r >= a[j]) fur = j;
            }
            if (fur == -1) break;
            j = fur;
            r += j - i + 1;
        }
        cout << r << '
    ';
    }
     
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0); cout.tie(0);
        cout << fixed << setprecision(20);
        int T; cin >> T; while(T--)
        run();
        return 0;
    }
    
    C. Celex Update
    /*
     * Author:  heyuhhh
     * Created Time:  2020/5/27 9:25:12
     */
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <cmath>
    #include <set>
    #include <map>
    #include <queue>
    #include <iomanip>
    #include <assert.h>
    #include <functional>
    #include <numeric>
    #define MP make_pair
    #define fi first
    #define se second
    #define pb push_back
    #define sz(x) (int)(x).size()
    #define all(x) (x).begin(), (x).end()
    #define INF 0x3f3f3f3f
    #define Local
    #ifdef Local
      #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
      void err() { std::cout << std::endl; }
      template<typename T, typename...Args>
      void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
      template <template<typename...> class T, typename t, typename... A> 
      void err(const T <t> &arg, const A&... args) {
      for (auto &v : arg) std::cout << v << ' '; err(args...); }
    #else
      #define dbg(...)
    #endif
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> pii;
    //head
    const int N = 1e5 + 5;
     
    void run() {
        int sx, sy, ex, ey;
        cin >> sx >> sy >> ex >> ey;
        int n = ex - sx + 1, m = ey - sy + 1;
        if (n > m) swap(n, m);
        ll ans = 1ll * n * (n - 1);
        ll r = n + m - 3;
        r -= 2 * (n - 1);
        ans += r * (n - 1);
        ++ans;
        cout << ans << '
    ';
    }
     
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0); cout.tie(0);
        cout << fixed << setprecision(20);
        int T; cin >> T; while(T--)
        run();
        return 0;
    }
    
    D. The Best Vacation
    /*
     * Author:  heyuhhh
     * Created Time:  2020/5/26 23:06:52
     */
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <cmath>
    #include <set>
    #include <map>
    #include <queue>
    #include <iomanip>
    #include <assert.h>
    #include <functional>
    #include <numeric>
    #define MP make_pair
    #define fi first
    #define se second
    #define pb push_back
    #define sz(x) (int)(x).size()
    #define all(x) (x).begin(), (x).end()
    #define INF 0x3f3f3f3f
    #define Local
    #ifdef Local
      #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
      void err() { std::cout << std::endl; }
      template<typename T, typename...Args>
      void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
      template <template<typename...> class T, typename t, typename... A> 
      void err(const T <t> &arg, const A&... args) {
      for (auto &v : arg) std::cout << v << ' '; err(args...); }
    #else
      #define dbg(...)
    #endif
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> pii;
    //head
    const int N = 1e5 + 5;
     
    void run() {
        ll n, x; cin >> n >> x;
        vector <ll> a(n << 1);
        for (int i = 0; i < n; i++) {
            cin >> a[i];
            a[i + n] = a[i];
        }
        a.pb(a[0]);
        auto calc = [&] (int l, int r) {
            return 1ll * (r - l + 1) * (l + r) / 2;  
        };
        vector <ll> sum(n << 1), sum2(n << 1);
        for (int i = 0; i < n << 1; i++) {
            if (i == 0) sum[i] = a[i];
            else sum[i] = sum[i - 1] + a[i];
        }
        for (int i = 0; i < n << 1; i++) {
            if (i == 0) sum2[i] = calc(1, a[i]);
            else sum2[i] = sum2[i - 1] + calc(1, a[i]);
        }
        auto chk = [&] (int i, int j) {
            return sum[j] - (i == 0 ? 0 : sum[i - 1]);
        };
        ll ans = 0;
        for (int i = 0; i < n; i++) {
            int l = i + 1, r = 2 * n, mid;
            while (l < r) {
                mid = (l + r) >> 1;
                if (chk(i, mid) <= x) l = mid + 1;
                else r = mid;
            }
            int j = l - 1;
            ll s = x - chk(i, j);
            if (s > 0) {
                ll k = min(a[i] - 1, a[j + 1] - s);
                ans = max(ans, calc(1 + k, a[i]) + calc(1, s + k) + sum2[j] - sum2[i]);
            } else if (s == 0) {
                ans = max(ans, sum2[j] - (i == 0 ? 0 : sum2[i - 1]));   
            } else {
                ans = max(ans, calc(a[i] - x + 1, a[i]));
            }
        }
        cout << ans << '
    ';
    }
     
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0); cout.tie(0);
        cout << fixed << setprecision(20);
        run();
        return 0;
    }
    
    E. Are You Fired?
    /*
     * Author:  heyuhhh
     * Created Time:  2020/5/26 23:50:38
     */
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <cmath>
    #include <set>
    #include <map>
    #include <queue>
    #include <iomanip>
    #include <assert.h>
    #include <functional>
    #include <numeric>
    #define MP make_pair
    #define fi first
    #define se second
    #define pb push_back
    #define sz(x) (int)(x).size()
    #define all(x) (x).begin(), (x).end()
    #define INF 0x3f3f3f3f
    #define Local
    #ifdef Local
      #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
      void err() { std::cout << std::endl; }
      template<typename T, typename...Args>
      void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
      template <template<typename...> class T, typename t, typename... A> 
      void err(const T <t> &arg, const A&... args) {
      for (auto &v : arg) std::cout << v << ' '; err(args...); }
    #else
      #define dbg(...)
    #endif
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> pii;
    //head
    const int N = 5e5 + 5;
     
    int n;
    int a[N];
    ll sum[N];
     
    void run() {
        cin >> n;
        int k = (n + 1) / 2;
        for (int i = 1; i <= k; i++) {
            cin >> a[i];
            sum[i] = sum[i - 1] + a[i];
        }
        int x; cin >> x;
        auto calc = [&] (ll t) {
            return sum[k] - sum[t - 1];  
        };
        ll Min = 1e18;
        int ans = -1;
        for (int i = 1; i <= k; i++) {
            ll res = calc(i) + 1ll * (n / 2) * x;
            if (Min == 1e18) {
                Min = res;
            } else {
                Min -= x;
                Min = min(Min, res);           
            }   
            if (Min > 0) ans = n - i + 1;
        }
        cout << ans << '
    ';
    }
     
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0); cout.tie(0);
        cout << fixed << setprecision(20);
        run();
        return 0;
    }
    
    F. Tasty Cookie
    /*
     * Author:  heyuhhh
     * Created Time:  2020/5/27 15:17:12
     */
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <vector>
    #include <cmath>
    #include <set>
    #include <map>
    #include <queue>
    #include <iomanip>
    #include <assert.h>
    #include <functional>
    #include <numeric>
    #define MP make_pair
    #define fi first
    #define se second
    #define pb push_back
    #define sz(x) (int)(x).size()
    #define all(x) (x).begin(), (x).end()
    #define INF 0x3f3f3f3f
    #define Local
    #ifdef Local
      #define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
      void err() { std::cout << std::endl; }
      template<typename T, typename...Args>
      void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
      template <template<typename...> class T, typename t, typename... A> 
      void err(const T <t> &arg, const A&... args) {
      for (auto &v : arg) std::cout << v << ' '; err(args...); }
    #else 
      #define dbg(...)
    #endif
      
    using namespace std;
    typedef long long ll;
    typedef pair<int, int> pii;
    //head
    const int N = 1e5 + 5;
     
    bool operator == (vector <ll>& A, vector <ll>& B) {
        for (int i = 0; i < sz(A); i++) {
            if (A[i] != B[i]) return false;
        }
        return true;   
    }
     
    vector <ll> rev(vector <ll>& A) {
        vector <ll> B = A;
        reverse(all(B));
        return B; 
    }
     
    void D(vector <ll>& A) {
        int n = sz(A);
        for (int i = n - 1; i > 0; i--) {
            A[i] -= A[i - 1];
        }
    }
     
    void out(ll cntp, ll cntr, vector <char>& ans) {
        reverse(all(ans));
        if (cntp > 2e5) {
            cout << "BIG" << '
    ';
            cout << cntp << '
    ';
        } else {
            cout << "SMALL" << '
    ';
            cout << sz(ans) << '
    ';
            for (auto it : ans) cout << it;
            cout << '
    ';
        }
    }    
            
    void run() {
        int n; cin >> n;
        vector <ll> a(n), b(n);
        for (int i = 0; i < n; i++) {
            cin >> a[i];
        }
        for (int i = 0; i < n; i++) {
            cin >> b[i];
        }
        if (n == 1) {
            if (a[0] == b[0]) {
                cout << "SMALL" << '
    ';
                cout << 0 << '
    ' << '
    ';
            } else {
                cout << "IMPOSSIBLE" << '
    ';
            }
            return;
        }
        ll cntr = 0, cntp = 0;
        vector <char> ans;
        bool BIG = false, f = false;
        if (n > 2) {
            while (!(a == b || a == rev(b))) {
                for (int i = 1; i < n; i++) {
                    if (b[i] <= b[i - 1]) {
                        b = rev(b), ++cntr;
                        ans.push_back('R'); 
                        break;
                    }
                }
                D(b), ++cntp;
                if (cntp > 2e5) BIG = true;
                if (!BIG) ans.push_back('P');
                for (int i = 0; i < n; i++) {
                    if (b[i] < 0) {
                        cout << "IMPOSSIBLE" << '
    ';
                        return;
                    }
                }
            }
            if (a == rev(b)) f = true;
        } else {
            while (1) {
                if (b[0] == a[1]) {
                    swap(a[0], a[1]);
                    f = true;
                }
                if (b[0] == a[0]) {
                    if (b[1] < a[1]) {
                        cout << "IMPOSSIBLE" << '
    ';
                        return;
                    }
                    ll r = (b[1] - a[1]) % b[0];
                    if (r == 0) {
                        ll now = ((b[1] - a[1]) / b[0]);
                        cntp += now;
                        if (cntp > 2e5) BIG = true;
                        if (!BIG) for (int i = 0; i < now; i++) {
                            ans.push_back('P');
                        }
                    } else {
                        cout << "IMPOSSIBLE" << '
    ';   
                        return;
                    }
                    break;
                }
                if (b[0] < a[0]) {
                    cout << "IMPOSSIBLE" << '
    ';   
                    return; 
                }
                ll& x = b[0], &y = b[1];
                ll now = (y - y % x) / x;
                y %= x;
                cntp += now;
                if (cntp > 2e5) BIG = true;
                if (!BIG) for (int i = 0; i < now; i++) {
                    ans.push_back('P');
                }
                swap(x, y), ++cntr;
                ans.push_back('R');
            }
        }
        if (f) {
            ++cntr;
            ans.push_back('R');
        }
        out(cntp, cntr, ans);
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0); cout.tie(0);
        cout << fixed << setprecision(20);
        run();
        return 0;
    }
    
  • 相关阅读:
    看一下有没有好的解决方案!
    netinet/in.h详细介绍
    【合集】zz数组与指针的艺术深入探索c/c++数组与指针
    struct sockaddr与struct sockaddr_in ,struct sockaddr_un的区别和联系
    C Socket实例
    C语言中malloc与free
    函数fp()、数组a[i]和箭头符号>的由来
    linux gcc编译错误
    怎样检测内存泄露
    dlmalloc解析连载完结【总】
  • 原文地址:https://www.cnblogs.com/heyuhhh/p/12972296.html
Copyright © 2011-2022 走看看