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了,后面再测把,先发出来。

相关推荐
蒸蒸yyyyzwd3 分钟前
秋招笔记day58
算法·哈希算法
Jasmine_llq12 分钟前
《P5663 [CSP-J 2019] 加工零件》
数据结构·算法·bfs·广度优先搜索·分层 bfs /·奇偶分层最短路·奇数最短步数
在所不辞兄21 分钟前
分层PINN提升多物理场一致性
人工智能·神经网络·算法·机器学习·工程仿真
wanderist.22 分钟前
CSP 第43次认证 T4:集合划分 —— 图染色与二分图判定
算法·图论
不做无法实现的梦~26 分钟前
基于 PX4 的全仓库架构、无人机算法解析与开发学习规划
算法·架构·无人机
做cv的小昊31 分钟前
【大模型算法自学笔记01】NLP基础知识(1.1 自注意力)
人工智能·笔记·算法·自然语言处理·大模型·llm
stolentime1 小时前
AT_arc182_a [ARC182A] Chmax Rush!题解
数据结构·c++·算法·动态规划
longlongzihan1 小时前
LeetCode 189. 轮转数组:从直观模拟到最优原地算法
c++·算法·leetcode
爱喝热水的呀哈喽1 小时前
cpp二分库函数 lambda捕获
算法
longlongzihan1 小时前
LeetCode 76. 最小覆盖子串:滑动窗口算法详解
算法·leetcode·滑动窗口