首页 > 其他分享 >[ARC141D] Non-divisible Set 题解

[ARC141D] Non-divisible Set 题解

时间:2023-12-05 11:15:20浏览次数:48  
标签:Non ch nums divisible 题解 back long int read

题目链接

点击打开链接

题目解法

很思维的题,需要用好所有的特殊性质

暴力的做法是建出图,然后求包含点 \(i\) 的最长反链,但这明显过不了

上面的做法没用到 \(a_i<2m\) 的性质
如何用?把 \(a_i\) 拆分成 \(q\times 2^k\;(k\) 为奇数\()\) 的形式,那么对于同一个 \(q\),只能在其中选一个数,可以发现 \(q\) 为 \(1-2m\) 中的所有奇数,所以一共有 \(m\) 个不同的 \(q\)
题目需要求大小 \(m\) 的子集,所以每一个 \(q\in[1,2m],q\in odd\) 中都需要选恰好一个

考虑一个比较显然的缩小范围
若 \(q_1|q_2\),则有 \(L_{q_1}>L_{q_2},\;R_{q_2}<R_{q_1}\)
这样可以在 \(O(n\ln n)\) 的时间内缩放 \(L_i\) 和 \(R_i\) 的范围
注意一定要使 \(L_i,R_i\) 都有数

然后就只需要判断当前数是否在合法区间内即可
为什么?考虑构造 \(R_1,R_3,...,R_{k_i-2},i,L_{k_i+2},...,L_{2m-1}\) 一定是一个合法的子集

时间复杂度 \(O(n\ln n)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
inline int read(){
    int FF=0,RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    return FF*RR;
}
const int N=600100;
int n,m,L[N],R[N],a[N],k[N];
vector<int> nums[N];
void End(){ F(i,1,n) puts("No");exit(0);}
int main(){
    n=read(),m=read();
    F(i,1,n){
        a[i]=read();
        while(~a[i]&1) k[i]++,a[i]>>=1;
        a[i]=a[i]/2+1,nums[a[i]].pb(k[i]);assert(1<=a[i]&&a[i]<=m);
    }
    F(i,1,m) if(nums[i].empty()) End();
    F(i,1,m) sort(nums[i].begin(),nums[i].end(),greater<int>());
    DF(i,m,1){
        int v=2*i-1;
        for(int j=3*v;j<=m<<1;j+=v<<1){
            int k=j/2+1;
            while(!nums[i].empty()&&nums[i].back()<=nums[k].back()) nums[i].pop_back();
        }
        if(nums[i].empty()) End();
    }
    F(i,1,m) L[i]=nums[i].back();
    F(i,1,m) nums[i].clear();
    F(i,1,n) nums[a[i]].pb(k[i]);
    F(i,1,m) sort(nums[i].begin(),nums[i].end());
    F(i,1,m){
        if(nums[i].empty()) End();
        int v=2*i-1;
        for(int j=3*v;j<=m<<1;j+=v<<1){
            int k=j/2+1;
            while(!nums[k].empty()&&nums[k].back()>=nums[i].back()) nums[k].pop_back();
        }
    }
    F(i,1,m) R[i]=nums[i].back();
    F(i,1,m) if(L[i]>R[i]) End();
    F(i,1,n){
        if(L[a[i]]<=k[i]&&k[i]<=R[a[i]]) puts("Yes");
        else puts("No");
    }
    fprintf(stderr,"%d ms\n",int(1e3*clock()/CLOCKS_PER_SEC));
    return 0;
}

标签:Non,ch,nums,divisible,题解,back,long,int,read
From: https://www.cnblogs.com/Farmer-djx/p/17876761.html

相关文章

  • [ARC141E] Sliding Edge on Torus 题解
    题目链接点击打开链接题目解法比较套路的题首先画个图,然后把\(y-x\)相同的变成一个点(使\(y>x\))然后再两个点之间连有权边那么问题就变成求新图的每个连通块中形成的原图的连通块数量手玩几个数据发现,原图的连通块数量即为新图的所有环长的\(\gcd\),再和\(n\)的\(\gcd......
  • [AGC061C] First Come First Serve 题解
    题目链接点击打开链接题目解法易知总情况数为\(2^n\)考虑重复计算的情况为:存在\([l_i,r_i]\),满足没有\([l_j,r_j](i\neqj)\)选在此区间中可以得到一个容斥的\(dp\)做法这个转移虽然感觉很显然,但卡了我一个晚上,一直调不出令\(f_i\)为到\(i\)的容斥情况下的权值和......
  • [CF1902] Educational Codeforces Round 159 A~E 题解
    [CF1902]EducationalCodeforcesRound159A~E题解A.BinaryImbalance很快观察到如果有不同的相邻元素,那么一定有解,意味着如果全是1无解,其他有解B.GettingPoints题面很长,可以发现,最好的偷懒方式一定是把所有的课都拖到最后几天上(真实),可以简单调整证明这样是不劣的,最后......
  • CF1833G Ksyusha and Chinchilla 题解
    题意:思路:当$n\not\equiv0\space(mod\space3)$时,无解;当$n\equiv0\space(mod\space3)$时,设$size_u$表示以$u$为根的子树还剩余的节点个数,自根节点向叶子节点递归,返回时进行处理节点$u$:设节点$u$的子节点为长度为$len$的序列$v$,设......
  • [ARC120E] 1D Party 题解
    提供二分+DP做法。Solution题意给出\(n(\le2\times10^5)\)个单调递增偶整数\(a_i\),求最小的\(k\)满足每一个\(i\)都可以在\(k\)时刻之前(含)与相邻的数相遇。每个单位时间可以移动一个单位距离。思路启发式思考在想到正解之前,我们可以想想类正解。显然,在时间一单......
  • CF1695C Zero Path 题解
    题意:思路:设$minv$表示路径最小权值和,$maxv$表示路径最大权值和。当且仅当路径长度$n+m-2\equiv0\space(mod\space2)$且$minv\le0\lemaxv$时,一定有权值和为$0$的路径;否则,一定没有权值和为$0$的路径。证明:由于只能向右或向下走,路径长度......
  • CF1163B2 Cat Party (Hard Edition) 题解
    题意:思路:对于满足条件的区间$[1,x]$,有如下三种情况:$1$.所有元素出现次数都为$1$;$2$.除了一个元素出现次数为$1$之外,其余元素出现次数都相等;$3$.除了一个出现次数比其他数的出现次数多$1$的元素之外,其余元素出现次数都相等。在线处理:设$cnt_i......
  • CF1198B Welfare State 题解
    题意:有一个长度为$n$的序列$a$,给定$q$次操作,每次操作为以下两种之一:$1$.$1$$p$$x$:$a_p=x$$2$.$2$$x$:$a_i$$=$$max$$($$a_i$,$x$$)$$(1\lei\len)$求经过$q$次操作后的序列$a$。思路:$a_i$的最终值只受......
  • ABC331G 题解
    盒子里有\(n\)张\(m\)种卡片,第\(i\)种卡片有\(c_i\)张。\(\sumc_i=n\)。每次均匀随机选一张,再放回去。求拿出过的卡片包含全部种类所需要的取出次数的期望。对\(998244353\)取模。\(1\leqn,m\leq2e5,c_i\gt0\)。首先观察到,对于任意终止局面,最后取出的卡片一定......
  • CF1442D Sum 题解
    题目链接点击打开链接题目解法\(n^3\)的\(dp\)是显然的但我们没用到\(a\)不降的性质考虑一个很妙的结论:最优选法中,至多只有一个序列取了且未取满为什么?如果最优情况下,存在选且未选满的序列为\(a,b\),第一个未选的元素为\(x,y\)如果\(a_x>a_{pre_y}\),那么选\(x\)......