CF1992F Valuable Cards

题意分析

长度为n的序列ai,求将序列划分为最少数列的区间,这些区间的要求是区间内任意选出任意数的乘积不等于x。

求解思路

要让区间数列尽可能少,就得尽可能的多向右扩展,能加入当前区间就加,加不了再开新区间。

↓

问题转为:新加入一个数y,这个区间的任意数的乘积是否会变成x。

↓

对于y而言,y*sum=x,sum是要判断的区间内任意数的乘积,我们发现

  1. 只有y是x的约数,才能在乘以另一个数的时候变成x。也就是说,y如果不是x的约数,那么直接放进当前区间即可,不需要再作其他操作。
  2. 当y是x的约数时,就要看这个区间内是否有可能构成x的乘积存在了,这里如何判断呢?感觉是一个难点。

解决:把所有的约数记录下来,来一个ai,就与这一段区间内的数相乘,如果结果是x的约数,就把它记录下来,方便后面用,如果相乘的结果不是x的约数,那么直接不用管。

代码实现

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[100009],ans;
unordered_set<int>s,cur;
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		s.clear();cur.clear();
		int n,x;
		ans=1;
		cin>>n>>x;
		for(int i=1;i<=n;i++)  cin>>a[i];
		
		for(int i=1;i<=n;i++)
		{
			if(x%a[i]!=0)  continue;
			for(auto j:s)//计算当前段中所有数*a[i] 
			{
				int k=a[i]*j;
				if(x%k==0)
				{
					if(k==x)
					{
						ans++;
						s.clear();
						cur.clear();
						break;
					}
					cur.insert(k);
				}
			}
			for(auto j:cur)
			{
				s.insert(j);	
			}
			cur.clear();
			if(x%a[i]==0)  s.insert(a[i]);			
		}
		cout<<ans<<endl;
	}
 } 

样例过了,但没有在cf测,突然上不了cf了,后面再测把,先发出来。

相关推荐
飞Link3 小时前
什么是 AirSim?一文读懂无人机仿真平台
python·算法·无人机
一去不复返的通信er5 小时前
贪心算法-合并区间(LeetCode 56)
算法·leetcode·贪心算法
Shaoshing6 小时前
LeetCode100 49. 字母异位词分组
java·算法
YFJ_mily6 小时前
第二届区块链技术与基础模型国际学术会议(BTFM2027)
算法·区块链·能源·智能系统·rdlink研发家·机器人自动化
汤姆宝库7 小时前
收官深拆:第一性原理、产业电网与未来推演
大数据·人工智能·算法
moshuying9 小时前
块扩散 + GDN 改造:Clover 把「并行生成」塞进了 Agent 的长上下文里
前端·算法
没落之王9 小时前
历史系统建模:宋初太祖太宗「再立天庭」秩序重构推演
人工智能·算法·重构
INGNIGHT9 小时前
91 · 最小调整代价(序列dp)
数据结构·算法·leetcode
moshuying9 小时前
扩散模型开始写代码、开网页了:350 亿参数,速度比 Jev 快一倍
前端·算法