首页 > 其他分享 >题解:CF1992F Valuable Cards

题解:CF1992F Valuable Cards

时间:2024-07-23 12:18:07浏览次数:13  
标签:10 le 题解 Valuable set Kmes Cards 坏段 unordered

Part 1:前言

题目翻译

在他最喜欢的咖啡馆里,Kmes再次想尝尝皮草大衣下的鲱鱼。以前,这对他来说并不难,但咖啡馆最近推出了一项新的购买政策。

现在,为了进行购买,Kmes需要解决以下问题:在他面前摆放着 \(n\) 张不同价格的卡,第 \(i\) 张卡的价格为 \(a_i\),在这些价格中没有整数 \(x\)。

Kmes被要求将这些卡划分为最少数量的坏段(这样每张卡只属于一个段)。如果无法选择乘积等于 \(x\) 的卡子集,则认为该段是坏的。Kmes 划分卡片的所有段都必须是坏的。

从形式上讲,如果没有下标 \(i_1<i_2<\ldots<i_k\),使得 \(l\le i_1,i_k\le r\) 且 \(\prod _ {j=1} ^ {k} a_{i_j} = x\),则段 \((l,r)\) 是坏的。

帮助Kmes确定坏段的最小数量,以便享受他最喜欢的菜肴。

输入格式

第一行包含一个整数 \(t(1\le t\le 10^3)\)——测试用例的数量。

每组输入数据的第一行分别给出整数 \(n\) 和 \(x(1\le n\le 10^5,2\le x\le 10^ 5)\)——卡片数量和整数。

每组输入数据的第二行包含 \(n\) 个整数 \(a_i(1\le a_i\le 2\cdot 10^5,a_i\neq x)\)——卡片上的价格。

保证所有测试数据集的 \(n\) 总和不超过 \(10^5\)。

输出格式

对于每组输入数据,输出坏段的最小数量。

Part 2:思路

这道题,咱就选择贪心吧(主要是我 dp 不大会)。

坏段 \(B\) 的定义:\(\exist\) 子序列 \(A \in B, \prod A=x\)。

显然,一个坏段的长度是有单调性的:当 \(a_1,a_2,\dots,a_k\) 是坏段时,\(a_1,a_2,\dots,a_{k+1}\) 也必定是坏段。

所以,我们每次判断出一个段是坏段时,就把 ans 加一。

怎么判断呢?考虑用一个速度更快的 unordered_set,存储之前所有子序列的乘积。

每次循环遍历这个 unordered_set,令当前遍历到的为 \(k\)。当 \(a_i \times k=x\) 时,我们就知道,已经有一个坏段产生了。我们把 unordered_set 清空,将 ans 加一。

但是这样时间复杂度太高,极端情况下,复杂度为 \(O(nx) \approx 10^{10}\),即使 4s 时限,也救不了你。

所以我们要考虑优化。

  • 当 \(x \bmod (a_i \times k)=0\) 时,将 \(a_i \times k\) 放入 unordered_set 里。

  • 当 \(x \bmod(a_i \times k)\neq 0\) 时,由于无论之后的数怎么样,子序列的乘积已经 \(\neq x\) 了,就舍去。

Part 3:代码

你们终于来到了这里

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
ll t,n,x,a[N],ans;
unordered_set<ll> st,us;
inline void FIO(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    #define endl '\n'
} 
inline void work(){
	st.clear();us.clear();ans=1;
	cin>>n>>x;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++){
		for(auto j:st){
			ll k=a[i]*j;
			if(x%k==0){
				if(k==x){
					ans++;st.clear();us.clear();
					break;
				}
				us.insert(k);
			}
		}
		for(auto j:us) st.insert(j);
		us.clear();
		if(x%a[i]==0) st.insert(a[i]);
	}
	cout<<ans<<endl;
}
signed main(){
    FIO();
    cin>>t;
    while(t--) work();
}

标签:10,le,题解,Valuable,set,Kmes,Cards,坏段,unordered
From: https://www.cnblogs.com/OIerHhy/p/18317476

相关文章

  • 题解:P9437 一棵树
    题目传送门明显的换根dp,感觉是道不错的换根dp练习题。题意一棵\(n\)个节点的树,点带权,定义\(w(x,y)=\overline{a_x\dotsa_y}\)。求\(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}w(i,j)\bmod998244353\)。思路我们不妨先求出\(i=1\)时的\(\sumw(i,j)\),再求\(......
  • [SDOI2012] 走迷宫 题解
    [SDOI2012]走迷宫题目描述Morenan被困在了一个迷宫里。迷宫可以视为\(n\)个点\(m\)条边的有向图,其中Morenan处于起点\(s\),迷宫的终点设为\(t\)。可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发的有向边,到达另一个点。这样,Morenan走的步数可能......
  • 2024年暑期2024牛客暑期多校训练营1 C和H题解
    C题SumofSuffixSums题目大意:开始是给你一空数组,要经历q次操作,每次操作都会给出两个数字t和v,其中要从数组末尾去走元素t次,最后加上元素v。定义si=ai+ai+1+ai+2+ai+3+......+an,最后求s1+s2+s3+.......+sn的总和。最后答案注意取模。 题解:注意到sum的总和其实就......
  • CF512D Fox And Travelling 题解
    Description给定一张\(n\)个点\(m\)条边的无向图。一个点只有当与它直接相连的点中最多只有一个点未被选择过时才可被选择。询问对于每个\(k\in[0,n]\),有序选择\(k\)个点的方案数。\(n\le100\),\(m\le\frac{n(n-1)}2\),答案对\(10^9+9\)取模。Solution容易发......
  • [COCI2015-2016#1] UZASTOPNI 题解
    前言题目链接:洛谷。题意简述一棵有根树,节点数\(n\leq10^5\),每个点有权值\(v_i\leq2000\),现在选出一些点,满足:一个点的父亲点若未被选择则其不能被选择。所选点的集合内不能有相同的权值。对于每一个选择的点,其子树中所有被选择点的权值必须可以构成公差为\(1\)的等......
  • 2024牛客暑期多校训练营2(部分题目题解)
    2024牛客暑期多校训练营2(部分题目题解)C.RedWalkingonGrid题意:给定只有红白的2*n个格子,只能走红色各自且只能上下左右走,问最多可以走多少红色格子。题解:左右走:dp[0][i]=dp[0][i-1]+1;上下走:intk1=dp[0][i];intk2=dp[1][i];dp[0][i]=max(dp[0][i],k2+......
  • 20240722题解
    孩子们,我回来了......
  • Luogu P4310 绝世好题 题解 [ 绿 ] [ 线性 dp ] [ 单调队列优化 ] [ 二进制优化 ]
    题目:绝世好题。暴力dp显然\(O(n^2)\)转移即可。单调队列优化观察到只有某二进制位两个数都为\(1\)时才能转移,因此我们把每个二进制位开一个单调队列,然后对于一个数\(a\),找到它是\(1\)的二进制位并选其单调队列的队头进行转移,在这之后把这个数加入符合要求的单调队列......
  • 题解:CF1349B Orac and Medians
    洛谷|CF刷一些CF2000,进行一个录的记。思路记录首先观察到数列里的数不能凭空产生,所以初始序列必须含\(k\)。由于两个数的中位数是较小的那个,所以只要有一个与数列里的\(k\)相邻且比\(k\)大的数,就可以扩展到整个序列。发现可以把第二条推广一下,不必要和\(k\)相邻,因......
  • SLF4J: Class path contains multiple SLF4J bindings 问题解决
    背景:springboot项目名称test,在使用slf4j后,服务启动报错 报错信息:SLF4J:ClasspathcontainsmultipleSLF4Jbindings.SLF4J:Foundbindingin[jar:file:/D:/Program%20Files/Java/.m2/repository/ch/qos/logback/logback-classic/1.2.7/logback-classic-1.2.7.jar!/or......