D. Rating Compression(双指针 + 思维)

news/2024/7/23 18:40:37

Problem - D - Codeforces

在竞争编程平台CodeCook上,每个人都有一个由长度为n的整数数组a描述的评分图。现在你正在更新基础设施,所以你已经创建了一个程序来压缩这些图。程序的工作原理如下。给定一个整数参数k,程序取in中每个长度为k的连续子数组中的最小值一个。更正式地说,对于长度为n和整数k的数组a,将a的k-压缩数组定义为长度为n - k + 1的数组b,这样b; =敏ai j <我< + k - 1例如,[1,3,4,5,2]的3-压缩数组为[min{1,3,4}, min{3,4,5}, min{4,5,2}] =[1,3,2]。长度为m的排列是由m个从1到m的不同整数以任意顺序组成的数组。例如,[2,3,1,5,4]是一个排列,但[1,2,2]不是一个排列(2在数组中出现两次),[1,3,4]也不是一个排列(m = 3,但数组中有4个)。如果k-压缩数组是一种排列,CodeCook的用户会很高兴。给定一个数组a,确定对于所有1 < k≤n的数组,CodeCook用户在对该数组进行k-压缩后是否满意。输入第一行包含一个整数t (1 < t < 104)——测试用例的数量。每个测试用例描述的第一行包含一个整数n (1 < n < 3 - 105)——数组的长度。每个测试用例描述的第二行包含n个整数a1,。, an (1 < ai S n) -数组的元素。可以保证,所有测试用例的n的和不超过3 - 105。输出对于每个测试用例,打印一个长度为n的二进制字符串。如果CodeCook用户对数组a进行k-压缩后感到满意,则字符串的第k个字符应为1,否则为O。

Example

input

Copy

5
5
1 5 3 4 2
4
1 3 2 1
5
1 3 3 3 2
10
1 2 3 4 5 6 7 8 9 10
3
3 3 2

output

Copy

10111
0001
00111
1111111111
000

题解:

首先特判一下k = 1,k = n的情况(很简单)

由于取长度为k的子数组取最小,1肯定在首或尾,否则(除了特判)肯定都不不行

比如3 1 2,k = 2 [1,1]

假设1在首位,如果排列[1,2]成立

那么下标2~n的数组中肯定要有2,否则后面的肯定都不行

接着下标为2的数应该是2,否则会出现

这种情况,依次递推下去,发现数组应该是单调递增的

同理1在末尾,从右往左也是一样的

总结下来就是

当k = n − 1时,全排列就是 1和2 两个数,假设 1不在两端,而在中间,那么结果一定是 1 ,1 ,这就不可能为全排列,所以1 一定在数组两端。

接下来就是 k = n − 2  ,假设上面 1 在首部,那么剩下就是去考虑区间 ( 2 , n )  ,同理,此时2 也只能出现一次,那么2 也只能在 区间( 2 , n )  的两端。

根据上述规律一直递归求解,遇到不满足的直接退出即可。需要注意的是,要保证区间这个数只能出现一次,并且+ 1  这个数一定要存在

#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
//#define int long long
map<int,int> f;
int ans[300050];
int a[300050];
int n;
void dfs(int l,int r,int val)
{
	if(l > r)
	return ;
	if(a[l] == val || a[r] == val)
	{
		if(f[val] == 1&&f.count(val + 1))
		{
			if(a[l] == val)
			{
				ans[n - val] = 1;
				dfs(l + 1,r,val + 1);
			}
			else 
			{
				ans[n - val] = 1;
				dfs(l,r - 1,val + 1);

			}
		}
	}
}
void solve()
{
	cin >> n;
	f.clear();
	int flag = 0;
	for(int i = 1;i <= n;i++)
	{
		cin >> a[i]; 
		ans[i] = 0;
		f[a[i]]++;
		if(f[a[i]] != 1)
		flag = 1;
	}
	if(!flag)
	ans[1] = 1;
	if(f.count(1))
	ans[n] = 1;
	dfs(1,n,1);
	for(int i = 1;i <= n;i++)
	cout << ans[i] ;
	cout << "\n"; 
}

signed main()
{
//	ios::sync_with_stdio(0);
//	cin.tie(0);cout.tie(0);
	int t = 1;
	cin >> t;
	while(t--)
	{
		solve(); 
	}
}


http://www.niftyadmin.cn/n/212628.html

相关文章

prometheus标签

004 标签 1. 作用 Prometheus中存储的数据为时间序列&#xff0c;是由Metric的名字和一系列的标签(键值对)唯一标识的, 不同的标签代表不同的时间序列&#xff0c;即 通过指定标签查询指定数据 。 指标标签实现了查询条件的作用&#xff0c;可以指定不同的标签过滤不同的数据…

DC综合基本概念-set_max_delay,set_min_delay,reset_path,reset_design,set_case_analysis

一.set_max_delay 二.set_min_delay 三.reset_path 四.reset_design 五.set_case_analysis

《这就是软件工程师》- 每位软件工程师值的看的一本书,尤其是刚刚步入IT行业的年轻人

文章目录第一部分&#xff5c;行业地图1、现实&#xff1a;为什么会有996&#xff1f;1&#xff09;行业处于特定的发展阶段2&#xff09;公司组织管理问题2、进阶&#xff1a;软件工程师的四大台阶1&#xff09;新手阶段【执行力】2&#xff09;进阶阶段【设计能力】3&#xf…

基于LSTM神经网络的通用股票预测源代码+模型+数据集

基于神经网络的通用股票预测模 下载地址&#xff1a;基于LSTM神经网络的通用股票预测源代码模型数据集 0 使用方法 How to use 使用getdata.py下载数据&#xff0c;或者使用自己的数据源&#xff0c;将数据放在stock_daily目录下 使用data_preprocess.py预处理数据&#xff…

记两个有关线程池的小问题

最近小伙伴们找我查的问题里&#xff0c;有两个与线程池相关的&#xff0c;最终都是花了一些时间才揪出原因所在&#xff0c;做一下记录&#xff0c;供以后的自己和其它需要的人参考。一、异步变同步现象&#xff1a;有一个方法&#xff0c;被请求后只是向线程池提交一个任务&a…

大规模优化方法(一)

迄今为止&#xff0c;我们介绍的优化算法都是从整体性出发&#xff0c;搜索全局最优点。而且大多数都是从一个初始可行解出发进行的&#xff08;分支定界搜索从某种意义上可以说不是&#xff09;。换句话&#xff0c;这些算法都是直接求解。但一些问题过于复杂&#xff0c;要优…

基于 SpringBoot+Vue+Java 的大学生体质测试管理系统( 源码+数据库)

文章目录简介技术栈数据库设计效果图系统首页模块管理员功能模块用户功能模块教师功能模块部分源码源码下载地址大家好&#xff0c;今天为大家带来的是基于 SpringBoot 的大学生体质测试管理系统&#xff08;附源码和教程&#xff0c;亲测可用&#xff09; 1.Java 200 款精品项…

机器学习实战:Python基于朴素贝叶斯Bayes进行分类预测(二)

文章目录1 前言1.1 朴素贝叶斯的介绍1.2 朴素贝叶斯的应用2 iris数据集演示2.1 导入函数2.2 导入数据2.3 训练模型2.4 预测模型3 模拟离散数据演示3.1 导入函数3.2 模拟/导入数据3.3 训练模型3.4 预测模型4 原理补充说明4.1 贝叶斯算法4.2 朴素贝叶斯算法5 讨论1 前言 1.1 朴素…