D. Constructing the Array Codeforces Round 642 (Div. 3)

该篇文章讲述了在Codeforces问题1353D中,如何使用二分查找和深度优先搜索(DFS)算法,对一个空数组进行填充,每次选择最长空区间的中间位置。通过先确定区间大小并排序,最后放置数字以确保优化填充顺序。
摘要由CSDN通过智能技术生成

题目链接:Problem - 1353D - Codeforcesicon-default.png?t=N7T8https://codeforces.com/problemset/problem/1353/D

题目大意:

往空的数组里从1~n填数字,每次填最长的空区间的中间位置(位置向下取整)。

思路:

用二分判断放每一个数字时此区间的大小。

排序完后再将数字放入对应的位置。

方法:

用dfs去实现二分:

void dfs(ll l ,ll r){//用二分判断填一个数字时的区间大小 
	if(l <= r){
		ll mid = l + (r-l >> 1);
		p[mid].first = l-r-1;//区间大的先排,负数影响了排序规则 
		dfs(l ,mid-1);
		dfs(mid+1 ,r);
	}
	return;
}

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl "\n"

const ll N = 2e5+7;
ll n;
ll v[N];
pair<ll,ll>p[N];

void dfs(ll l ,ll r){//用二分判断填一个数字时的区间大小 
	if(l <= r){
		ll mid = l + (r-l >> 1);
		p[mid].first = l-r-1;//区间大的先排,负数影响了排序规则 
		dfs(l ,mid-1);
		dfs(mid+1 ,r);
	}
	return;
}

void solve(){
	cin >> n;
	dfs(1,n);
	for(ll i = 1 ; i <= n ; i ++)//数字放在哪个位置 
		p[i].second=i;
	sort(p+1,p+n+1);
	for(ll i = 1 ; i <= n ; i ++)//依次放数字进数组 
		v[p[i].second]=i;
	for(ll i = 1 ; i <= n ; i ++)
		i > 1 ? cout << " " << v[i] : cout << v[i];
	cout << endl;
	return;
}

int main() {
	ll t=1;cin >> t;
	while(t --)solve();
	return 0;
}
遇到 "error constructing MAC: java.lang.SecurityException: JCE cannot authenticate the provider BC" 错误,通常是因为 Java 加密库 (Java Cryptography Extension, JCE) 中的某个安全提供者 (Provider) 没有正确配置或授权。BC (Bouncy Castle) 提供者在这种情况下出现问题。 解决步骤如下: 1. **检查JDK安装**:确保你的Java Development Kit (JDK) 安装包含了正确的加密库,特别是Bouncy Castle。有时它可能不是默认安装的一部分,需要单独下载并添加到JDK的jre/lib/security目录下。 2. **更新或添加BC JCE**:从Bouncy Castle官网下载最新版本的JCE Unlimited Strength Jurisdiction Policy Files,它们包含了解决此问题所需的权限文件。将下载的jar包放入`JAVA_HOME/jre/lib/security` 或 `JRE_HOME/lib/security` 目录下。 3. **重启JVM**:更改了库之后,你需要重启Java虚拟机(JVM),让系统加载新的安全提供者。 4. **检查安全策略**:打开`JAVA_HOME/jre/lib/security/java.security` 文件,查看是否正确添加了Bouncy Castle的provider信息。如果没有,需要添加类似这样的行: ``` security.provider.1=BC security.provider.10=bouncyCastleProvider ``` 5. **重新部署应用**:最后,重新部署你的应用程序,确保Java运行环境能够识别并使用新添加的BC Provider。 如果以上步骤都无法解决问题,可能是其他第三方库或者代码中存在冲突,尝试更新依赖库或排查相关的代码段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值