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\n", 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\n", ans);
    }
    return 0;
}
// PCPC PCPP PCCP
posted @ 2021-04-28 12:12  EchoZQN  阅读(58)  评论(0编辑  收藏  举报