zoukankan      html  css  js  c++  java
  • E. Group Photo 分类讨论

    E. Group Photo 分类讨论

    题目大意:

    给出一个 (a_i) 数组,然后构造 (C)(P) 序列,两个序列的合集是 (1)(n) 的排列。然后 (C) 的排列对应的 (a) 的和要小于 (P) 对应的 (a) 的和,而且 (C) 序列相隔两个数的差值要递增,(P) 要递减。

    题解:

    (C) 是要递增的, (D) 是要递减的,所以可以分出这几种情况。

    • (P..PC..C) 先是 (P) 后是 (C)
    • (CC..CP..CP..P) 先是连续的 (C) 然后是 (CP..CP) ,最后全部都是连续的 (P)
    • (CC..CP..CP..PC) 先是连续的 (C) 然后是 (CP..CP) ,然后是连续的 (P) 最后一个是 (C)
    • (PCC..CP..CP..P) 一开始是 (P) ,然后是连续的 (C) ,然后是 (CP..CP) 最后是连续的 (P)
    • (PCC..CP..CP..PC) 一开始是 (P) ,然后是连续的 (C) ,然后是 (CP..CP) ,然后是连续的 (P) ,最后是一个 (C)
    • 因为第二种包含了 (C..CP..P) 所以不考虑 (CCCPPP)
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 2e5 + 10;
    const int mod = 998244353;
    typedef long long ll;
    ll a[maxn],sum[maxn],all = 0;
    ll solve(int x,int y,ll now) {
        if (now * 2 >= all || x > y) return 0;
        int l = 1, r = (y - x) / 2 + 1, ans = 0;
        while (l <= r) {
            int mid = (l + r) >> 1;
            if (2 * (now + sum[x + 2 * (mid - 1)] - sum[x]) < all) ans = mid, l = mid + 1;
            else r = mid - 1;
        }
    //    printf("x = %d y = %d now = %lld ans = %d
    ", x, y, now, ans);
        return ans;
    }
    int main() {
        int T;
        scanf("%d", &T);
        while (T--) {
            int n;
            all = 0;
            scanf("%d", &n);
            for (int i = 1; i <= n; i++) {
                scanf("%lld", &a[i]);
                sum[i] = a[i], all += a[i];
                if (i > 1) sum[i] += sum[i - 2];
            }
            ll ans = 0;
            for (int i = 1; i <= n; i++) {
                if (2 * (sum[i] + sum[i - 1]) > all) ans++;
            }
            for (int i = 1; i <= n; i++) {
                ll now = sum[i] + sum[i - 1];
                ans = (ans + solve(i, n - 1, now)) % mod;//CCC..CPCP..P
                now += a[n];
                ans = (ans + solve(i, n - 2, now)) % mod;//CC..CPCP..PC
                if (i > 1) {
                    now -= a[1];
                    ans = (ans + solve(i, n - 2, now)) % mod;//PCC..CPCP..PC
                    now -= a[n];
                    ans = (ans + solve(i, n - 1, now)) % mod;//PCC..CPCP..P
                }
            }
            printf("%lld
    ", ans);
        }
        return 0;
    }
    // PCPC PCPP PCCP
    
  • 相关阅读:
    寒假day08
    操作系统(一)操作系统的目标和作用
    数据结构排序算法稳定性总结——写给自己看
    网络请求生命周期
    PHP 不同类型之间的松散和严格比较
    php配置可被设定范围
    laravel5.7 前后端分离开发 实现基于API请求的token认证
    laravel 自动加载 自定义的文件/辅助函数
    laravel5.7 migrate 时报错 Specified key was too long error 解决方案
    PHP 命名空间
  • 原文地址:https://www.cnblogs.com/EchoZQN/p/14713562.html
Copyright © 2011-2022 走看看