首页 > 其他分享 >SP11469 SUBSET - Balanced Cow Subsets Sol

SP11469 SUBSET - Balanced Cow Subsets Sol

时间:2022-11-16 20:36:38浏览次数:52  
标签:SUBSET lfloor right frac Cow Subsets int rfloor 集合

考虑枚举 \(3^n\) 种情况,用三进制数表示。

对于每一位,\(0\) 表示不放,\(1\) 表示放入第一个集合,\(2\) 表示放入第二个集合。

这样显然会 TLE。考虑 meet in the middle。

考虑枚举前 \(3^{\left\lfloor\frac{n}{2}\right\rfloor}\) 种情况,开一个数组 / map 处理出所有可能的情况。

随后枚举后 \(3^{n-\left\lfloor\frac{n}{2}\right\rfloor}\) 种情况,和前面处理出的答案合并。

考虑如何合并。设前半段的第一个集合和为 \(a\),第二个集合和为 \(b\);后半段的第一个集合为 \(a'\),第二个集合和为 \(b'\),则有 \(a+a'=b+b'\)。

移项有 \(a-b=b'-a'\),那么只要将答案用差为索引记录即可。

但是我们会发现一个情况,就是第一个集合和第二个集合只是我们规定的顺序,本质上它是无序对;除此之外,你不可以选两个空集。那么答案就是 \(\dfrac{ans-1}{2}\) 了吗?

其实不是。

看题目,发现要求选数的方案而非具体的安排方案,例如:

3 3 3 3

对于这四个数,分段为 3 3/3 3,前半段和后半段内共可以组成 \(2\) 个合法答案。

你会发现,\(a_1+a_2=a_3+a_4\) 本质上和 \(a_1+a_3=a_2+a_4\) 是一种选数方案。

考虑在枚举状态时加入选数的状态,用二进制 \(0/1\) 来表示。

开一个数组记录是否计算过一种方案的答案即可。

复杂度是 \(O(3^{\left\lfloor\frac{n}{2}\right\rfloor}\times2^{\left\lfloor\frac{n}{2}\right\rfloor})\) 即 \(O(6^{\left\lfloor\frac{n}{2}\right\rfloor})\) 的。\(3\) 为枚举集合分布,\(2\) 为记录的选数方案。

#include <bits/stdc++.h>
using namespace std;

const int N = 1 << 20;
unordered_map <int, int> id; bool kk[N];
int n, idx, a[N]; vector <int> kel[N];

int main() {
    ios_base::sync_with_stdio(false); cin.tie(0), cout.tie(0);
    cin >> n; for (int i = 1; i <= n; ++i) cin >> a[i];
    int mid = n >> 1, lim = 1, res = 0; for (int i = 1; i <= mid; ++i) lim *= 3;
    for (int s = 0; s < lim; ++s) {
        int tmp = s, sum = 0, sta = 0;
        for (int cnt = 1; cnt <= mid; ++cnt, sta = tmp % 3? (sta << 1 | 1) : (sta << 1), tmp /= 3)
            if ((tmp % 3) & 1) sum += a[cnt]; else if (tmp % 3) sum -= a[cnt];
        if (!id[sum]) id[sum] = ++idx;
        kel[id[sum]].emplace_back(sta);
    }
    int lst = mid; mid = n - mid, lim = 1;
    for (int i = 1; i <= mid; ++i) lim *= 3;
    for (int s = 0; s < lim; ++s) {
        int tmp = s, sum = 0, sta = 0;
        for (int cnt = 1; cnt <= mid; ++cnt, sta = tmp % 3? (sta << 1 | 1) : (sta << 1), tmp /= 3)
            if ((tmp % 3) & 1) sum -= a[cnt + lst]; else if (tmp % 3) sum += a[cnt + lst];
        int curid = id[sum]; if (!curid) continue;
        for (auto dk: kel[curid]) {
            if (!((dk << mid) + sta)) continue;
            if (kk[(dk << mid) | sta]) continue;
            kk[(dk << mid) | sta] = true, ++res;
        }
    }
    cout << res << endl;
    return 0;
}

标签:SUBSET,lfloor,right,frac,Cow,Subsets,int,rfloor,集合
From: https://www.cnblogs.com/MistZero/p/SP11469-Sol.html

相关文章

  • 78. Subsets
    样例输入{1,8,5,4}输出[[],[1],[1,4],[1,4,5],[1,4,5,8],[1,4,8],[1,5],[1,5,8],[1,8],[4],[4,5],[4,5,8],[4,8],[5],[5,8],[8]]publi......
  • Til the Cows Come Home
    题目:题解:最短路模板#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<stack>#include<......
  • 论文笔记 - GRAD-MATCH: A Gradient Matching Based Data Subset Selection For Effic
    AnalysisCoreset是带有权重的数据子集,目的是在某个方面模拟完整数据的表现(例如损失函数的梯度,既可以是在训练数据上的损失,也可以是在验证数据上的损失);给出优化目标的定......
  • 论文笔记 - PRISM: A Rich Class of Parameterized Submodular Information Measures
    Motivation与ActiveLearning类似,TargetLearning致力于挑选外卖更“感兴趣”的数据,即人为为更重要的数据添加bias。例如我们当前的任务目标是增强自动驾驶算法的夜......
  • 【题解】洛谷P2946 [USACO09MAR]Cow Frisbee Team S
    这题乍一看是一个朴素的01背包问题,将所有方案的集合按照能力值的和来划分成1~m,然后把m当作体积,把n当作物品数,做一个01背包的代码。于是我兴冲冲地写了代码交上去,然后十组样......
  • 使用qcow2磁盘格式的文件作为Qemu根文件系统
    参考使用Qemu运行Ubuntu文件系统(1)qemu-img命令详解qemu-nbd简单操作操作创建qcow2格式文件qemu-imgcreate-fqcow2ubuntu22.qcow2100G挂载modprobenb......
  • KVM 动态调整 qcow2 硬盘
    动态扩容参考:https://cloud-atlas.readthedocs.io/zh_CN/latest/kvm/kvm_vdisk_live.html在宿主机器上使用qemu-imgresize命令调整磁盘大小,会提示不可操作#qemu-im......
  • P2971 [USACO10HOL]Cow Politics G
    题意一个树上每一个点都有一个组别,求相同组别的点对相差的最大距离。分析首先对于任意一个组别,深度最大的点一定在答案的点对里。证明假设答案的点对里没有深度最大......
  • Codeforces Round #707 (Div. 1, based on Moscow Open Olympiad in Informatics) A
    A.GoingHome观察ai<=2.5e6显然我们两数之和最多5e6我们开桶让后怎么暴力让我发愁了显然我们知道我们可能一个数被用了好多次这样显然不行可以想到就是把这个数对......
  • POJ 2481 Cows
    题目链接:​​传送门​​问每条线段被包含了多少次把线段按左端点排序左端点相同的按右端点大的在前面这样就不用考虑左端点的影响了每次插入一条线段就将1-r加1询问r-i......