首页 > 其他分享 >CF1777C Quiz Master题解

CF1777C Quiz Master题解

时间:2023-05-13 15:12:05浏览次数:40  
标签:满足条件 CF1777C int 题解 Master 端点 序列

题目简述

给定一个长度为 \(n\) 的正整数序列 \(a\),以及一个正整数 \(m\)。在序列 \(a\) 中选出一个长度为子序列(不是子段) \(b\) ,\(\forall i \in [1, m] ,\exists b_j, b_j\) 能整除 \(i\)。

求所有满足条件的序列 \(b\) 的极差(最大值于最小值的差)的最小值;若无满足条件序列 \(b\) ,输出 \(-1\) 。

思路

考虑先排序。

将序列排序之后,如果区间 \(a[l, r]\) 满足条件,则 \(a[l, r + 1]\) 一定不优;如果区间 \(a[l, r]\) 不满足条件,则 \(a[l + 1, r]\) 一定不满足条件。

所以可以考虑双指针,每次将右端点向右移一位。考虑删去左端点,若可以整除的数没有减少,则删去左端点。

代码

#include<bits/stdc++.h>
#include<cstdio>
using namespace std;
const int N = 1E5 + 5;
int t, n, m; 
int a[N];
int b[N];
int main()
{
	cin >> t;
	while (t--) {
		memset(b, 0, sizeof(b));
		cin >> n >> m;
		for (int i = 1; i <= n ;i++) cin >> a[i];
		sort (a + 1, a + n + 1);
		int l = 1, ans = 0x3F3F3F3F, now = 0;
		for (int r = 1; r <= n; r++) {
			for (int i = 1; i * i <= a[r]; i++) {
				if (a[r] % i == 0) {
					if (!b[i] && i <= m) now++;
					if (i * i != a[r] && !b[a[r] / i] && a[r] / i <= m) now++;
					b[i]++;
					if (i * i != a[r]) b[a[r] / i]++;
				}
			}
			while (l < r) {
				bool ok = 1;
				for (int i = 1; i * i <= a[l]; i++) {
					if (a[l] % i == 0) {
						if (b[i] == 1 && i <= m || b[a[l] / i] == 1 && a[l] / i <= m ) {
							ok = 0;
							break;
						}
					}
				}
				if (!ok) break;
				for (int i = 1; i * i <= a[l]; i++) {
					if (a[l] % i == 0) {
						b[i]--;
						if (i * i != a[l]) b[a[l] / i]--; 
					}
				}
				l++;
			}
			if (now == m) ans = min(a[r] - a[l], ans);
		}
		if (ans == 0x3F3F3F3F) cout << -1;
		else cout << ans;
		cout << '\n';
	}
}

标签:满足条件,CF1777C,int,题解,Master,端点,序列
From: https://www.cnblogs.com/easonhe/p/17397424.html

相关文章

  • Educational Codeforces Round 148 (Rated for Div. 2) A-D 题解
    比赛地址A.NewPalindrome题意:给一个回文串,判断是否能重新排成另一个回文串Solution存不同对的个数即可voidsolve(){ strings; cin>>s; intn=s.length(); set<char>st; for(inti=0;i<n/2;i++) { st.insert(s[i]); } if(st.size()>1)cout<<"YES\n"; els......
  • 「SDOI2017」数字表格 题解
    4114「SDOI2017」数字表格题解个人评价:好题且套路多算法标签莫比乌斯反演题目难度:2700题面看我分析题面多组数据,每次给出\(n,m\),求解\(\prod_{i=1}^n\prod_{j=1}^mF_{gcd(i,j)}\),其中\(F\)是斐波那契数列问题分析第一眼化出这个式子肯定是一脸懵,毕竟我们现在做的大......
  • 问题解决:TNS-12543: TNS:destination host unreachable
    环境:11.2.0.3ADG(db11g\db11gadg\db11gcas)在自己先前克隆后的环境互相tnsping报错。tnsping本机ok,tnsping其他机器均报错:[oracle@db11g~]$tnspingjingyuTNSPingUtilityforLinux:Version11.2.0.3.0-Productionon13-MAY-202308:09:11Copyright(c)1997,......
  • cf 870div2 abcd题解
    A题,先假设一个res从0开始,判断说谎人的个数用ans表示,如果res==ans则假设成立#include<iostream>usingnamespacestd;typedeflonglongll;typedefunsignedlonglongull;typedefdoubledb;typedefpair<int,int>PII;constllINF=0x3f3f3f3f;constintN=1e4+10;in......
  • 题解 ABC239F【Construct Highway】
    翻译:给定\(n,m\)和度数数组\(\{d_i\}\),再给你\(m\)条边,请构造一棵\(n\)点的树包含这\(m\)条边,且第\(i\)个点的度数为\(d_i\),或者判断无解。显然,若\(\sumd_i\ne2(n-1)\),则无解。然后对于输入的每条边,使用并查集维护,再求出在这\(m\)条边的基础上每个点还需要多......
  • vi基本入门操作,Ubuntu中vi方向键乱码问题解决方案?
    一、vi基本操作语法:vi+文本名例如创建一个名为text的文本文件进入后先敲击键盘"I"(看个人习惯,敲“a”也是一样的结果,大小写都行),进入插入模式,即可正常输入如果要敲错了内容,和Windows一样,用backspace来删除,也可以用delete键,问题在于用delete键只能删除选中部分的内容,且仅能选......
  • 2023市北区程序设计竞赛题解
    1.分糖果原题: 解题思路:这道题类似于辗转相除法,这道题是辗转相减,每次取余数,如果整除,直接计算答案,并退出,否则继续取余 AC代码:#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intmain(){ lla,b,ans=0;cin>>a>>b; while(a!=b){ if(a<b)swap(a,b......
  • 洛谷 P4544 [USACO10NOV]Buying Feed G - 题解
    https://www.luogu.com.cn/problem/P4544感觉是很没意思的DP+DS优化,以前做过几道更难的题:https://codeforces.com/contest/1788/problem/Ehttps://atcoder.jp/contests/abc288/tasks/abc288_f这种题只要是让我写总是能把代码整的伤痕累累(逃第一眼:我艹不就是一个sbDP吗......
  • 模拟测试题解
    题目链接:https://vjudge.csgrandeur.cn/contest/557480AOJ维护中计算a+b(0<=a,b<=10)。点击查看代码#include<iostream>usingnamespacestd;intmain(){inta,b;cin>>a>>b;cout<<a+b;return0;}B不支持python队列报数,直接模拟即可。点击查看......
  • CF1542E2 题解
    首先,考虑枚举其中一个的逆序对数,这里绕不开的问题就是求\(I_{i,j}\)表示\(1-i\)的排列中逆序对个数为\(j\)的排列数,不妨把这里逆序对变成顺序对(为了方便描述,显然是等价的)。有个很显然的trick:把所有数按\(1-n\)顺序插入。然后当插入第\(i\)个数时,枚举它前面有\(k\)个......