首页 > 其他分享 >题解 ARC141D【Non-divisible Set】

题解 ARC141D【Non-divisible Set】

时间:2023-09-21 20:33:08浏览次数:36  
标签:Non leq divisible 题解 int debug include 集合 符合条件

这个题不是网络流。

problem

我们说一个集合 \(D\) 是一个好的集合,当不存在集合中的两个不同元素 \(a,b\) 使得 \(a\) 是 \(b\) 的约数。

给定 \(N\) 个整数的一个集合 \(S\),值域均落在 \([1, 2*M]\) 内。

对 \(S\) 中的每个元素 \(A_i\) 询问:是否存在一个恰好包含 \(A_i\) 的 \(M\) 个元素的好的集合。

  • \(M \leq N \leq 2M\)
  • \(1 \leq M \leq 3 \times 10^5\)
  • \(1 \leq A_1 < A_2 < \dots < A_N \leq 2M\)
  • All values in input are integers.

solution

考虑将数字 \(x\) 表示为 \(2^k\cdot y\) 其中 \(y\) 是一个奇数,那么最终选出的好的集合中每个 \(y\) 唯一对应一个 \(k\) 且每个 \(y\) 都要有对应。考虑预处理每个 \(y\) 对应的可能的 \(k\)。

考虑对于两个奇数 \(a,b\),满足 \(a|b\),则 \(a\) 选出来的 \(k_a\) 必须大于 \(b\) 选出来的 \(k_b\)。考虑到 \(a|b\) 这样的关系,类似于一个 DAG,我们可以在 DAG 上 DP,获得一组合法方案,所以我们考虑能不能把 DP 去掉?我们考虑到:对于 \(a|b\),如果已经确定 \(k_b\),那么 \(k_a>k_b\),也就是说若 \(\{k_b\}\) 确定,则 \(\min k_a > \min k_b\),删除很小的 \(k_a\) 以达到这一点,将这些不可能符合条件的 \(k_a\) 踢掉。同理反过来,如果 \(k_a\) 确定,那么必须要 \(\max k_a > \max k_b\),通过删除很大的 \(k_b\) 达到这一点,将这些不可能符合条件的 \(k_b\) 删掉。如此一来,无论我们钦定哪一个 \(k_y\),我们的前面都能符合条件,后面都能符合条件,那么总的就能符合条件。

\(O(n\ln n)\)

code

点击查看代码

#include <functional>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cassert>
#include <algorithm>
using namespace std;
#ifdef LOCAL
#define debug(...) fprintf(stderr, ##__VA_ARGS__)
#else
#define debug(...) void(0)
#endif
typedef long long LL;
int n, m, a[600010];
vector<int> b[600010];
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        int x = a[i], k = 0;
        while (x % 2 == 0) x >>= 1, k++;
        b[x].push_back(k);
    }
    for (int x = m * 2 - 1; x >= 1; x -= 2) {
//      debug("x = %d, b[%d] = {", x, x);
//      for (int i: b[x]) debug("%d,", i);
//      debug("}\n");
        sort(b[x].begin(), b[x].end(), greater<int>());
        for (int y = x * 2; y <= m << 1; y += x)
            while (!b[x].empty() && !b[y].empty()
                    && b[x].back() <= b[y].back())
                b[x].pop_back();
    }
//  debug("========================\n");
    for (int x = 1; x <= m << 1; x += 2)
        reverse(b[x].begin(), b[x].end());
    for (int x = 1; x <= m << 1; x += 2){
        for (int y = x * 2; y <= m << 1; y += x)
            while (!b[x].empty() && !b[y].empty()
                    && b[x].back() <= b[y].back())
                b[y].pop_back();
//      debug("x = %d, b[%d] = {", x, x);
//      for (int i: b[x]) debug("%d,", i);
//      debug("}\n");
    }
    bool flg = 0;
    for (int x = 1; x <= m << 1; x += 2)
        flg |= b[x].empty();
    for (int i = 1; i <= n; i++) {
        int x = a[i], k = 0;
        while (x % 2 == 0) x >>= 1, k++;
        auto it = lower_bound(b[x].begin(), b[x].end(), k);
        puts(flg || it == b[x].end() || *it != k ? "No" : "Yes");
    }
    return 0;
}

标签:Non,leq,divisible,题解,int,debug,include,集合,符合条件
From: https://www.cnblogs.com/caijianhong/p/solution-ARC141D.html

相关文章

  • Little Victor and Set 题解
    LittleVictorandSet题目大意在\([l,r]\)中选不超过\(k\)个相异的数使得异或和最小,输出方案。思路分析分类讨论:当\(k=1\)时:显然选\(l\)是最优的。当\(r-l+1\le10\)时:直接\(O(n2^n)\)暴力枚举每个数选或不选即可。(判了这个之后后面的很多讨论会简单很......
  • docker搭建青龙面板及白屏问题解决方法
    最近也是想赚点小钱,搭建个青龙面包来挂脚本,但是在搭建过程中遇到过一些问题,所以记录下来。docker搭建青龙面板我这里是使用aliyun服务器进行搭建的,系统是centOS7.6版本。另外docker自行搜索安装即可。拉取青龙面板镜像远程登录服务器,输入命令拉取青龙镜像dockerpullwhyour......
  • 题解 P9019 [USACO23JAN] Tractor Paths P
    显然,对于给定的\(l,r\),最短路可以贪心求出,即每次走与当前区间相交且左端点最大的区间,这个可以用倍增加速。定义\(f_{i,j}\)表示从区间\(i\)往右走\(j\)步后到达的区间,\(g_{i,j}\)表示往左走的情况。正反遍历一下即可求出\(f_{i,1}\)和\(g_{i,1}\)。对于第二问,第\(i......
  • To_Heart—题解——好多好多!
    1.CF1860Dlink&&submission发现自己并不会处理纯纯的dp甚至自己根本不会dp!定义dp_{i,j,k}状态表示前i个字符有j个0,01的数量减去10的数量为k。转移比较显然了,答案是\(dp_{n,cnt0,0}\),其中cnt0是原序列中0的个数。注意k有正负。2.CF1860Flink.首先......
  • 【UVA 12676】Inverting Huffman 题解(哈夫曼树)
    静态霍夫曼编码是一种主要用于文本压缩的编码算法。给出的文本为由N个不同字符组成的特定大小,算法选择N个代码,每个代码对应一个不同的字符性格使用这些代码压缩文本。为了选择代码,算法构建一个有N片叶子的二元根树。对于N≥2,树可按如下方式构建。1.对于文本中的每个不同字符,构......
  • 题解 UVA1537 Picnic Planning
    这道题在显然是最小生成树,但是很显然我是不会打最小生成树的。题意描述给定一张\(n\)个点\(m\)条边的无向图,求出无向图的一棵最小生成树,满足一号节点的度数不超过给定的整数\(s\)。具体思路首先,看到这种度数最多为\(s\)的题,显然想到wqs二分。但是wqs二分是恰好选......
  • 【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答(四)
    ​贴接上回。。。 【往期FAQ参考】【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答(一)【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答(二)【HarmonyOS】【FAQ】HarmonyOS应用开发相关问题解答(三) 【本期FAQ】1、JS服务卡片能实现按钮触摸时更换背景色,离开恢复原来......
  • ABC319题解
    直接从D开始了。D可可爱爱的二分捏。check就按照题目里写的就行了。然后\(l\)的初值要注意一下,就是\(\max^{i\len}_{i=1}a_i\)。代码:#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintmaxn=2e5+10;intn,m;inta[maxn];intl,......
  • Friendly Arrays题解
    2023-09-18题目FriendlyArrays难度&重要性(1~10):5题目来源luogu题目算法贪心解题思路一道大水题。这道题解法非常的套路,我们需要对于处理按位或和按位异或时,首先就要把数拆成二进制的形式去考虑。首先我们需要简单了解一下按位或和按位异或的运算规则:按位或,对于两......
  • 使用dom4j解析xml文件及selectNodes取不到值问题解决
    参考文档:https://blog.csdn.net/PARADDD/article/details/131307189https://blog.csdn.net/weixin_37703598/article/details/81273199......