首页 > 其他分享 >【题解】CF1891E - Brukhovich and Exams

【题解】CF1891E - Brukhovich and Exams

时间:2023-11-13 19:23:12浏览次数:45  
标签:int 题解 Brukhovich len CF1891E 相邻 答案 区间

【题解】CF1891E - Brukhovich and Exams

https://www.luogu.com.cn/problem/CF1891E

我们考虑把区间分段:若两个相邻的数不互素,中间分开;若两个相邻的数中有且仅有一个 \(1\),中间分开。那么我们得到了两种区间:全 \(1\) 区间与无 \(1\) 区间。若两个相邻数在同一区间内,那么就在区间内考虑;否则在两个区间的交点处,归到旁边的全 \(1\) 区间考虑;若旁边两个区间都是无 \(1\) 区间,那么这两个数一定不互素,不用考虑。

首先考虑无 \(1\) 区间:设长度为 \(len\),则有 \(len-1\) 对相邻数。显然可以先通过 \(\lfloor \dfrac{len-1}2\rfloor\) 次操作,每次答案减少 \(2\),然后可能还剩一个,使用一次操作使得答案减少 \(1\)。

接着考虑全 \(1\) 区间:设长度为 \(len\),分三类讨论。

  • 如果两端都非 \(1\) 或 \(n\),那么有 \(len+1\) 对相邻数。可以通过 \(len-1\) 次操作每次答案减少 \(1\),最后一次操作答案减少 \(2\)。
  • 如果有一段为 \(1\) 或 \(n\),那么从更靠中间的点的那端开始,\(len\) 次操作每次答案减少 \(1\)。
  • 否则就是 \(1\sim n\) 全部都是 \(1\),易得答案是 \(n-k\),特判即可。

然后现在会有若干种操作:减 \(2\),先减若干次 \(1\) 最后减一次 \(2\),减 \(1\)。

贪心地操作即可。

//CF1891E
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
int T, n, k, a[N], ot[N], ans[N];

int main(){
	scanf("%d", &T);
	while(T--){
		scanf("%d%d", &n, &k);
		bool flg = true;
		for(int i = 1; i <= n; ++ i){
			scanf("%d", &a[i]);
			if(a[i] != 1){
				flg = false;
			}
		}
		if(flg){
			printf("%d\n", n - k);
			continue;
		}
		int le = 1, two = 0, one = 0, tp = 0;
		ans[0] = 0;
		for(int i = 1; i <= n; ++ i){
			if(i != 1 && __gcd(a[i-1], a[i]) == 1){
				++ ans[0];
			}
			if(a[i] == 1 && a[i+1] != 1){
				int len = i - le + 1;
				if(le == 1 || i == n){
					one += len;
				} else {
					ot[++tp] = len;
				}
				le = i + 1;
			} else if(__gcd(a[i], a[i+1]) != 1 || (a[i+1] == 1 && a[i] != 1)){
				int len = i - le;
				two += len / 2;
				one += len % 2;
				le = i + 1;
			}
		}
		sort(ot + 1, ot + tp + 1);
		for(int i = 1; i <= two; ++ i){
			ans[i] = ans[i-1] - 2;
		}
		int ps = two;
		for(int i = 1; i <= tp; ++ i){
			for(int j = 1; j < ot[i]; ++ j){
				ans[ps+1] = ans[ps] - 1;
				++ ps;
			}
			ans[ps+1] = ans[ps] - 2;
			++ ps;
		}
		for(int i = 1; i <= one; ++ i){
			ans[ps+i] = ans[ps+i-1] - 1;
		}
		printf("%d\n", ans[k]);
		for(int i = 0; i <= n; ++ i){
			ans[i] = 0;
			ot[i] = 0;
			a[i] = 0;
		}
	}
	return 0;
}

标签:int,题解,Brukhovich,len,CF1891E,相邻,答案,区间
From: https://www.cnblogs.com/KiharaTouma/p/CF1891E.html

相关文章

  • [题解] CFgym101623F Factor-Free Tree
    Factor-FreeTree当一棵二叉树中的每个节点的权值都与它所有祖先的权值互质时,我们称它为factor-freetree。给你一棵按照中序遍历的顺序的权值序列\(a\),求这个序列是否对应这一棵factor-freetree。如果是就输出每个节点的父亲。\(n\le10^5,a_i\le10^7\)。考虑怎么......
  • SP2139题解
    思路这题数据范围小,暴力就可以了。首先我们用map来统计每个人的下标,用\(bk_{i,j}\)表示第\(i\)个人第\(j\)题是否知道答案。对于每次合作交流,暴力修改就可以了,先统计出两个人的下标,假设一个为\(x\),另一个为\(y\)。然后,如果\(bk_{x,i}\)和\(bk_{y,i}\)中(\(1\lei......
  • [ARC106E] Medals 题解
    题意有一个商店和\(N\)名员工,其中第\(i\)名员工在第\(1\simA_i\)天工作,在第\(A_i+1\sim2\timesA_i\)休息,接下来每\(A_i\)天改变一次状态。每一天你都可以选择一名来上班的员工并为其颁一个奖,求使得每名员工都获得至少\(K\)个奖的最小天数。\(1\leN\le......
  • [题解] CF1156E Special Segments of Permutation
    SpecialSegmentsofPermutation给你一个排列\(p\),求有多少个区间\([l,r]\)满足\(p_l+p_r=\max_{i\in[l,r]}p_i\)。\(n\le2\times10^5\)。按最大值分治,记当前的分治中心为\(mid\),分治区间为\([l,r]\)。然后需要计算跨分治中心的贡献。如果\(mid-l......
  • [题解]AT_abc328_f [ABC328F] Good Set Query
    思路带权并查集模板。如果对于一个三元组\((a,b,c)\)如果它能够添加到\(S\)中一定满足如下条件中的一条:\(X_a,X_b\)满足其中有一个是「不确定」的。在这里\(X_i\)「不确定」指\(X_i\)没有与其它的任意\(X_j\)有关系。\(X_a,X_b\)有间接或直接的关系,但是能计算......
  • CF300B Coach 题解
    闲话调了好一会,甚至还重构了一次代码才对,但是还是很喜欢并查集,并查集可爱捏。题意省流$n$个学生分成$3$人一组,要满足$m$个条件,每个条件给出两个数$x,y$,要求$x$和$y$必须在一个组里。正文要使学生三人一组,一眼使用并查集。首先考虑无解(输出$-1$)的情况:给出的限......
  • 【题解 P8476】 惊蛰
    「GLR-R3」惊蛰题目背景  「微雨众卉新,一雷惊蛰始」  中午,休息室,阿绫肩膀上。  “我有一个愿望,参加全国音乐祭,获奖,和阿绫一起,摆脱这训练的苦海。”  “为热爱而到来,为抽身而努力……吗”。  正午的阳光渗过窗帘,抚上困倦的人儿的脸颊。天依的左手悄悄搭上阿绫怀里......
  • NOJ题解
    NOJ题解30-40素数埃氏筛,欧拉筛都可可变参数累加/平均用给出的库函数即可基思数根据题意模拟#include<stdio.h>#definelllonglongllnum[102];inlineboolIsKeith(lln){inttot=0,t=0;lls=n;while(s){num[++tot]=s%10......
  • 问题解答:SAP OData V2 和 V4 里针对日期类型的字段进行过滤操作(filter)的正确语法试
    我的知识星球里有朋友咨询一个问题:我测试了一个S/4HANAcloud的purchaseorder的API,这个是ODATAV4格式的。在对CreationDate做filter后运行有报错Invalidparametertypeusedwithfunction'eq'.对datetime字段做filter,一直搞不清楚格式。请帮忙看一下。本文就安排这......
  • [题解] P6569 [NOI Online #3 提高组] 魔法值
    P6569[NOIOnline#3提高组]魔法值不放简要题意了,题面写的很简要。看到数据范围自然可以想到矩阵快速幂优化。但乘法对异或没有分配律。所以直接拆位,把异或变成加法对二取模就有分配律了。还有一个优化就是提前预处理出矩阵的2的幂次方,然后询问时直接二进制分解乘起来就行......