11.8 33oj 模拟赛总结(时间安排 + 题解(数学 + 二分 + 括号匹配DP + 性质DP))

文章目录

  • 考试时间及策略
  • 考试结果
  • 赛后总结
  • 题解
    • Balance Addicts
    • Boboniu and String
    • Bracket Insertion
    • Conveyor

考试时间及策略

7:40 - 8:00       开题。T1 应该是个dp, 但是好像有点恶心。T2是个神秘构造。T3是个求随机括号匹配的概率,一眼应该是个 n 3 n^3 n3 的dp。T4有点离谱,不知道啥东西。
8:00 - 9:20       开始想T1, 发现部分分给的很足。 n 4 n^4 n4 的dp比较一眼,想了一会儿发现 可以优化到 n 3 n^3 n3。然后还有一个特殊性质 a i = 0 a_i = 0 ai=0 的分。这样加起来就有 84 p t s 84pts 84pts了。之后开始想怎样优化。想到了如果没有 0 0 0,那么状态可以优化到 O ( n ) O(n) O(n),转移是 O ( n 2 ) O(n^2) O(n2)。但是转移还是没办法通过,就放弃了接着思考这个思路。(实际上可以接着优化转移,优化过程并不是很难)。又想了 30 m i n 30min 30min,感觉转移真的没办法优化到 O ( n ) O(n) O(n),并且时间不是很够。就直接开写了。写完过了部分分的大样例。
9:25 - 10:00       想T2,发现了一些T2的性质,也成功把问题转化成了图上找一点到其它点距离的最大值最小。但是接着就不会了。只能去拿 ∣ s ∣ 2 n |s|^2n s2n 和 特殊性质的 45 45 45 分了。
10:00 - 11:20       想 T3,想到了一些自认为重要的性质,并且想到了一个看似很对的 O ( N 3 ) O(N^3) O(N3) 的dp。开写!!!写完之后发现过不去样例。调着调着发现刚才想的好像不对。深入思考感觉给状态换一个定义就好了。然后改了改,发现过掉了第二个样例,但是第三个样例过不去了。一直在想哪里错了,但是想不出来。后来发现时间只剩了20min,但是我T4还没开!!!赶紧把T3的几个我会写的特殊性质分写了,含泪拿了 20 p t s 20pts 20pts。去看T4了。
11:20 - 11:40       5min理解完题意,发现35pts是可以拿的,火速开写。写完没过样例!!!慌了,静态查错。终于在时间还剩 1min 的时候过样例了。赶紧交了。

考试结果

期望得分:84 + 45 + 20 + 35 = 184
实际得分:84 + 45 + 20 + 0 = 149
暴力哥都没当成功

赛后总结

T1:应该是有能力场A的,但是没有深入往下想。
T2: 差了一步,正解就是接着往下做了个二分。但是我不是很会线性规划,没做出来也正常。
T3:假完了,白白浪费一个多小时。
T4:漏了一句话导致没拿到35pts,亏麻了。但主要还是因为没有充分的时间去写。下次应该先尽快把暴力写完再去磕正解。

这一场是搬的CF的题,第一题2300,后三题都是2600+,有点恐怖

题解

Balance Addicts

题面

简要题意:
       给定一个长度为 n n n 的序列 a a a,对于每一种将 a a a 划分成若干个子串的方式,我们设当前划分有 k k k 个子串,分别描述为 ( l 1 , r 1 ) , ( l 2 , r 2 ) , . . . ( l k , r k ) (l_1, r_1),(l_2, r_2),...(l_k, r_k) (l1,r1),(l2,r2),...(lk,rk),定义长度为 k k k 的数组 s s s 满足 s i = ∑ j = l i r i a j s_i = \sum_{j = l_i}^{r_i}a_j si=j=liriaj。如果 s s s 是一个回文数组,那么称这一种划分方式是好的。求 a a a 有多少种好的划分。

分析:
       下面提供两种解法。

       S o l 1 Sol_1 Sol1

       因为要求最后数组是回文的,所以我们可以想到一个 O ( n 4 ) O(n^4) O(n4) 的dp:设 f i , j f_{i, j} fi,j 表示序列的前 i i i 个 与后 j j j 个进行分段,形成 对称 的两部分的划分方案数。那么我们枚举左右两边的段的断点 k k k l l l。使得 ∑ p = k i a p = ∑ q = n − j + 1 n − l + 1 a q \sum_{p = k}^{i}a_p = \sum_{q = n - j + 1}^{n - l + 1}a_q p=kiap=q=nj+1nl+1aq。那么 f i , j ← f k − 1 , l − 1 f_{i, j} \leftarrow f_{k - 1, l - 1} fi,jfk1,l1

       仔细思考,我们会发现有一个要求是 [ k , i ] [k, i] [k,i] [ n − j + 1 , n − l + 1 ] [n - j + 1, n - l + 1] [nj+1,nl+1] 的区间和相等。我们枚举 k k k 的时候显然没必要再把所有的 l ≤ j l \leq j lj 枚举一遍。我们可以开一个 来存储信息优化复杂度。具体来说,我们设 c n t i , j cnt_{i, j} cnti,j 表示所有 f i , k f_{i, k} fi,k 的和, 其中需要满足 区间 [ n − k + 1 , n ] [n - k + 1, n] [nk+1,n] 的和为 j j j。然后我们枚举 k k k,转移时直接调用桶里的值就好了。因为 j j j 可能很大,但是后缀和的取值只有 n n n 种,离散化一下就好了。有一些细节:比如需要倒序枚举 j j j
       对于 a i = 0 a_i = 0 ai=0,显然答案是 2 n − 1 2^{n - 1} 2n1。这个可以理解为我们可以在 n − 1 n - 1 n1 个空位里面插板,可以不插,那么方案就是 2 n − 1 2^{n - 1} 2n1

#include<bits/stdc++.h>// 84pts
using namespace std;
const int N = 2e5 + 10;
const int M = 5e2 + 100;
typedef long long LL;
const LL mod = 998244353;
int n, tot, rk[N];
LL dp[M][M], a[N], cnt[M][M], sum[N], b[N];
LL S[N];
int Find(LL x){
	int c = lower_bound(b + 1, b + tot + 1, x) - (b);
	if(c > tot || (b[c] != x)) return -1;
	return c;
}
void solve1(){
	for(int i = 1; i <= n; i++){
		sum[i] = sum[i - 1] + a[i];
	}
	S[n + 1] = 0;
	b[++tot] = S[n + 1];
	for(int i = n; i >= 1; i--){
		S[i] = S[i + 1] + a[i];
		b[++tot] = S[i];
	}
	sort(b + 1, b + tot + 1);
	tot = unique(b + 1, b + tot + 1) - (b + 1);
	for(int i = n; i >= 1; i--){
		rk[i] = lower_bound(b + 1, b + tot + 1, S[i]) - (b);
	}
	dp[0][n + 1] = 1LL;
	cnt[0][1] = 1LL;
	for(int j = n; j >= 1; j--){// 倒序做 
    	for(int i = j - 1; i >= 1; i--){
			for(int k = i - 1; k >= 0; k--){
                int p = Find(S[j] - sum[i] + sum[k]);
                if(p != -1) dp[i][j] = (dp[i][j] + cnt[k][p]) % mod;
			}
			cnt[i][rk[j]] = (cnt[i][rk[j]] + dp[i][j]) % mod;
		}
	}
	LL res = 0;
	for(int i = 1; i < n; i++){
		res = (res + dp[i][i + 1]) % mod;
	}
	for(int i = 1; i <= n; i++){
		for(int j = i; j <= n; j++){
			res = (res + dp[i - 1][j + 1]) % mod;
		}
	}
	printf("%lld\n", res % mod);
}
LL Pow(LL x, LL y){
	LL res = 1, k = x % mod;
	while(y){
		if(y & 1) res = (res * k) % mod;
		y >>= 1;
		k = (k * k) % mod;
	}
	return res % mod;
}
void solve2(){//插板法 
	printf("%lld\n", Pow(2LL, 1LL * n - 1) % mod);
}
void solve3(){
	
}
int main(){
	scanf("%d", &n);
	bool f = 1;
	for(int i = 1; i <= n; i++){
		scanf("%lld", &a[i]);
		if(a[i]) f = 0;
	} 
	if(n <= 500) solve1();// 72pts
	else if(f) solve2();// 12pts
	else solve3();// 不会 
	return 0;
}

       接着我们来接着优化。不难发现,如果序列里面没有 0 0 0,那么 f i , j f_{i, j} fi,j 的每一个 i i i 都唯一对应一个 j j j,所以可以把 j j j 哪一维省去。但是如果序列里面有 0 0 0 呢?我们只处理非 0 0 0 的位置, 考虑用 0 0 0 的数量去改变转移。
       假设 b b b 序列是 a a a 序列去除序列里面的 0 0 0 后剩下元素的 位置 序列。设 f i f_{i} fi 表示 b i b_i bi 它对应后缀的 d p dp dp 值。那么考虑朴素转移:假设我们知道 f i f_i fi,向后枚举一个 j j j,转移给 f j f_j fj。设 b i b_i bi 对应的是 b k b_k bk。那么转移就是 f i ∗ ∑ l = 1 m i n ( b i + 1 − b i , b k − b k − 1 ) C b i + 1 − b i l × C b k − b k − 1 l → f j f_{i} * \sum_{l = 1}^{min(b_{i + 1} - b_{i}, b_{k} - b_{k - 1})} C_{b_{i + 1} - b_{i}}^{l} \times C_{b_{k} - b_{k - 1}}^{l} \to f_j fil=1min(bi+1bi,bkbk1)Cbi+1bil×Cbkbk1lfj。这个意思是我们可以在前面的 0 0 0 里面随便插板子,只要保证 b i + 1 b_{i + 1} bi+1 b i b_{i} bi 之间插的板子数量和 b k − 1 b_{k - 1} bk1 b k b_{k} bk 相等就行,但是不能不插。这样转移是 O ( n ) O(n) O(n) 的。我们接着考虑实际上对每一个 j > i j > i j>i f i f_i fi 的贡献都是一样的,我们可以维护一个变量 A d d Add Add,表示前面对当前及后面 f f f 数组的贡献之和。然后每次用 A d d Add Add 更新 f i f_{i} fi,并把 f i f_{i} fi 贡献到 A d d Add Add 里面就好了。时间复杂度 O ( n ) O(n) O(n)

       放一个 klz 的

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

typedef long long LL ;
const int N = 2e5+10 ;
const LL mod = 998244353 ;

int n , a[N] , pos[N] , len ;
LL S[N] , ans ; 
LL ksm( LL a , LL b)
{
	LL res = 1 , t = a % mod ;
	while( b ) {
		if( b&1 ) res = res * t % mod ;
		b = b >> 1 ;
		t = t * t % mod ;
	}
	return res ;
}
 
namespace part2
{
	int ret[N] ; LL f[N] , fac[N] , inv[N] ;
	void pre_work()
	{
		fac[0] = 1 ;
		for(int i = 1 ; i <= n ; i ++ ) fac[i] = fac[i-1] * i % mod ;
		inv[n] = ksm( fac[n] , mod-2 ) ;
		for(int i = n-1 ; i >= 1 ; i -- ) inv[i] = inv[i+1] * (i+1) % mod ;
		inv[0] = 1 ;
	}
	inline LL C ( int n , int m ) 
	{
		return fac[n] * inv[m] % mod * inv[n-m] % mod ;
	}
	void solve()
	{
		pre_work() ;
		for(int i = 1 ; i <= len ; i ++ ) {
			S[i] = S[i-1] + a[pos[i]] ;
		}
		for(int i = 0 , j = len+1 ; i < j ; i ++ ) {
			while( i < j && S[i]>S[len]-S[j-1] ) j -- ;
			if( i < j && S[i] == S[len]-S[j-1] ) {
				ret[i] = j ;
			}
		}
		f[0] = 1 ;  pos[0] = 1 , pos[len+1] = n ;
		LL ADD = 0 ;
		for(int i = 0 ; i <= len ; i ++ ) {
			if( !ret[i] ) continue ;
			f[i] = ( f[i] + ADD ) % mod ;
			int dl = pos[i+1]-pos[i] , dr = pos[ret[i]]-pos[ret[i]-1] ; LL c = 0 ;
			for(int k = 1 ; k <= min(dl,dr) ; k ++ ) {
				c = ( c + C(dl,k)*C(dr,k)%mod ) % mod ;
			}
			ADD = ( ADD + f[i]*c%mod + (!i) ) % mod ;
			if( i+1 != ret[i] ) {
				ans = ( ans + f[i]*c % mod ) % mod ;
			}
			else {
				ans = ( ans + f[i]*(ksm(2,dl)-1)%mod + mod ) % mod ;
			}
			if( !i ) ans ++ ; // 补上整体选的 
		}
		printf("%lld\n" , ans ) ;
	}
}

int main() 
{
	scanf("%d" , &n );
	for(int i = 1 ; i <= n ; i ++ ) {
		scanf("%d" , &a[i] ) ;
		if( a[i] ) pos[++len] = i ;
	}
	part2::solve() ;
	return 0 ; 
}

       S o l 2 Sol_2 Sol2
       既然要求最后是回文数组,我们需要从两边一刀刀往内切分。我们考虑把一种划分方式 双射 成两个长度分别为 k k k 的序列 p p p q q q。满足:

       1 ≤ p 1 < p 2 < . . . < p k < q k < q k − 1 < q k − 2 < . . . < q 1 ≤ n 1 \leq p_1 < p_2 < ... < p_k < q_k < q_{k - 1} < q_{k - 2} < ... < q_{1} \leq n 1p1<p2<...<pk<qk<qk1<qk2<...<q1n。我们要求 p r e p i = s u f q i pre_{p_i} = suf_{q_i} prepi=sufqi。其中 p r e pre pre s u f suf suf 分别表示原序列的 前缀和 以及 后缀和

       首先对于任意一种序列都可以映射一种划分方式。其次,对于任意一种划分方式,如果是奇回文,那我们可以从两边一次依次把 段的端点 拿出来构成序列。如果是偶回文,那么我们让中间段的右端点为 p k p_k pk,右端点加一的位置为 q k q_k qk 就好了。

       知道了双射的性质,那么现在我们只需要求这样的 序列数量 就好了。因为序列里面的元素都是正数,所以从左往右前缀和不降。从右往左后缀和不降,所以我们可以把序列按照前缀和的值划分成一段一段的,同时也可以把序列按照后缀和划分成一段一段的。设前缀和为 s u m sum sum 的段长度为 l 1 l_1 l1,后缀和为 s u m sum sum 的段的长度为 l 2 l_2 l2。如果这两段不想交,那么在和为 s u m sum sum 的方案是 ∑ i = 0 m i n ( l 1 , l 2 ) C l 1 i × C l 2 , i \sum_{i = 0}^{min(l1, l2)}C_{l1}^{i} \times C_{l2, i} i=0min(l1,l2)Cl1i×Cl2,i。否则,如果相交,我们能发现这两段会公共覆盖不是端点的中间段,这样答案是 2 r − l 2^{r - l} 2rl

CODE:

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
typedef long long LL;
const LL mod = 998244353;
int n, T;
LL a[N], pre[N], suf[N], fac[N], inv[N];
LL C(int n, int m){return fac[n] * inv[m] % mod * inv[n - m] % mod;}
LL Pow(LL x, LL y){
	LL res = 1, k = x % mod;
	while(y){
		if(y & 1) res = res * k % mod;
		y >>= 1;
		k = k * k % mod;
	}
	return res;
}
void solve(){
	scanf("%d", &n);
	pre[0] = suf[n + 1] = 0;
	for(int i = 1; i <= n; i++){
		scanf("%lld", &a[i]);
		pre[i] = pre[i - 1] + a[i];
	}
	for(int i = n; i >= 1; i--){
		suf[i] = suf[i + 1] + a[i];
	}
	LL res = 1;
	int l = 1, r = n;
	while(l < r){
		if(pre[l] < suf[r]){l++; continue;}
		if(suf[r] < pre[l]){r--; continue;}
		int rt = l, lt = r;
		while(rt < n && pre[rt + 1] == pre[l]) rt++;
		while(lt && suf[lt - 1] == suf[r]) lt--;
		if(rt == r - 1 && lt == l + 1){
			res = res * Pow(2LL, 1LL * r - l) % mod;
			break;
		}
		if(rt == n || lt == 1){
	        res = res * Pow(2LL, 1LL * n - 1) % mod;
			break;
		}
		else{
			LL o = 0;
			for(int k = 0; k <= min(rt - l + 1, r - lt + 1); k++){
				o = (o + C(rt - l + 1, k) * C(r - lt + 1, k) % mod) % mod;
			}
			res = res * o % mod;
		}
		l = rt + 1; r = lt - 1;
	}
	printf("%lld\n", res);
}
int main(){
	fac[0] = 1LL;
	for(int i = 1; i < N; i++) fac[i] = fac[i - 1] * (1LL * i) % mod;
	inv[N - 1] = Pow(fac[N - 1], mod - 2LL) % mod;
	for(int i = N - 2; i >= 0; i--) inv[i] = inv[i + 1] * (1LL * i + 1) % mod;
	scanf("%d", &T);
	while(T--) solve();
	return 0;
}

Boboniu and String

题面

简要题意:
有点长,自己看吧

分析:

       我们考虑给的条件是什么意思。
       两个字符串“相似”的定义:两个字符串 N N N B B B 的数量分别相等。
       操作:一次删除或者增加 一个 N N N 或者一个 B B B。或者同时增加或删除一个 N N N,一个 B B B
       要求我们求出一个串 T T T,使得 T T T 变成与给定的所以 S i S_i Si 相似需要的最大操作数最小。

       发现了相似只与 数量 有关,与 顺序 无关,那么这道题就好做多了。我们把 N N N 的数量看做 横坐标,把 B B B 的数量看做 纵坐标,那么问题就转化成了:在平面上有若干个点。你需要求出一个点,满足它到所有给定点的移动步数最大的最小。其中移动方式有 6 6 6 种。
在这里插入图片描述
       有 最大的最小,我们肯定是要二分的。设二分的答案是 l l l,那么所有给定点都有一个对应区域表示区域内的点能够在 l l l 步内到达它,我们判断所有区域有没有公共部分就好了。所有点的区域可以用 线性规划 表示。设当前点坐标是 ( x 0 , y 0 ) (x_0, y_0) (x0,y0),那么对于一个能够在 l l l 步内到达它的点 ( x , y ) (x, y) (x,y) 而言,需要满足一下不等关系:

x ≤ x 0 + l x \leq x_0 + l xx0+l
x ≥ x 0 − l x \geq x_0 - l xx0l
y ≤ y 0 + l y \leq y_0 + l yy0+l
y ≥ y 0 − l y \geq y_0 - l yy0l
x − y ≤ x 0 − y 0 + l x - y \leq x_0 - y_0 + l xyx0y0+l
x − y ≥ x 0 − y 0 − l x - y \geq x_0 - y_0 - l xyx0y0l

       我们维护答案点 x x x 的范围, y y y 的范围, x − y x - y xy 的范围。最后枚举 x x x 的范围内的数,检验存不存在合法解就好了。

       时间复杂度 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)

CODE:

#include<bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
const int M = 1e6 + 10;
typedef pair< int, int > PII;
int n, x[N], y[N], lx, rx, ly, ry, lz, rz, resb, resn;// 分别是 x 的限制, y的限制, 和 x - y 的限制 
char str[M];
PII check(int l){
	lx = ly = 0;
	lz = -1e8;
	rx = ry = rz = 1e8;
	for(int i = 1; i <= n; i++){
		lx = max(lx, x[i] - l);
		rx = min(rx, x[i] + l);
		ly = max(ly, y[i] - l);
		ry = min(ry, y[i] + l);
		lz = max(lz, x[i] - y[i] - l);
		rz = min(rz, x[i] - y[i] + l);
	}
    if(rx <= 0 && ry <= 0) return make_pair(-1, -1);
	for(int i = max(lx, 0); i <= rx; i++){
		int tl = i - rz, tr = i - lz;
		tl = max(tl, ly); tr = min(tr, ry);
		if(tl <= tr){
			if(tr > 0 || i > 0) return make_pair(i, tr);
		}
	}
	return make_pair(-1, -1);
}
int main(){
	scanf("%d", &n);
	for(int i = 1; i <= n; i++){
		scanf("%s", str + 1);
		int len = strlen(str + 1);
		for(int j = 1; j <= len; j++){
			if(str[j] == 'B') x[i]++;
			else y[i]++;
		}
	}
	int l = 0, r = 2e6 + 10, mid, res = -1;
	while(l <= r){
		mid = (l + r >> 1);
		PII k = check(mid);
		if(k != make_pair(-1, -1)){
			res = mid;
			resb = k.first, resn = k.second;
			r = mid - 1;
		}
		else l = mid + 1;
	}
	printf("%d\n", res);
	for(int i = 1; i <= resb; i++) putchar('B');
	for(int i = 1; i <= resn; i++) putchar('N');
	return 0;
}

Bracket Insertion

题面

分析:
       详见这里

Conveyor

题面

分析:
       详见这里

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/126098.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一篇博客读懂单链表——Single-List

目录 一、初识单链表 单链表是如何构造的&#xff1a; 单链表如何解决顺序表中的问题&#xff1a; 二、单链表的初始定义 三、尾插和头插 3.1 新建结点CreateNode 3.2 打印SLTPrint 3.3 尾插SLTPushBack 3.4 头插SLTPushFront 四、尾删和头删 4.1 尾删SLTPopBack…

蓝牙安全管理(SM:Security Manager)规范详解

总述 配对(Pairing)分为三个阶段&#xff0c;前两个阶段是必须的&#xff0c;而第三阶段是可选的&#xff0c;三个阶段如下&#xff1a; 阶段1&#xff1a;配对功能交换(Pairing Feature Exchange) 阶段2(LE传统配对 LE legacy pairing)&#xff1a;短期密钥(STK:Short Term…

【Python大数据笔记_day04_Hadoop】

分布式和集群 分布式:多台服务器协同配合完成同一个大任务(每个服务器都只完成大任务拆分出来的单独1个子任务) 集群:多台服务器联合起来独立做相同的任务(多个服务器分担客户发来的请求) 注意:集群如果客户端请求量(任务量)多,多个服务器同时处理不同请求(不同任务),如果请求量…

为什么推荐从Linux开始了解IT技术

IT是什么&#xff0c;是干什么的呢&#xff1f; 说起物联网&#xff0c;云计算&#xff0c;大数据&#xff0c;或许大家听过。但是&#xff0c;你知道&#xff0c;像云计算的底层基座是什么呢&#xff1f;就是我们现在说的Linux操作系统。而云计算就是跑在Linux操作系统上的一个…

商越科技:渗透测试保障平台安全,推动线上采购高效运转

商越科技是数字化采购解决方案提供商&#xff0c;在同赛道企业中始终保持前列。商越科技通过自主研发的智能采购中台、SaaS应用及运营服务等为企业搭建专属的互联网采购平台&#xff0c;帮助企业实现采购数字化以及智能化转型&#xff0c;提高工作效率、降低采购成本。 打造数字…

自建网盘平台搭建(源码+教程)

为什么要自己搭建网盘&#xff0c;现在许多大厂的网盘&#xff0c;文件都添加了许多限制&#xff0c;有好多文件会遭到和谐&#xff0c;而且大部分网盘也都会限速&#xff0c;不开通VIP是很难用的&#xff01;这是一套可以运营的网盘&#xff0c;代码无加密可以进行二次开发。下…

【java】【MyBatisPlus】【四】【完】MyBatisPlus一些实战总结(枚举、翻页、sql、组合条件、自增主键、逻辑删除)

目录 一、枚举 1、数据库type字段是Integer 类型枚举 2、创建一个该字段的枚举类 TypeEnum 3、修改实体类 4、配置文件新增mybatis-plus的配置 5、检验&#xff1a; 5.1 查询显示 5.3 库里验证 二、自增主键不是id字段处理 三、逻辑删除字段不是delete字段处理 1、实…

[动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子

[动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子 文章目录 [动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子题目解析解题思路状态表示状态转移方程初始化和填表顺序返回值 代码实现总结 LCR 091. 粉刷房子 题目解析 (1) 一排房子&#xff0c;共有n个 (2) 染…

在任何机器人上实施 ROS 导航堆栈的指南

文章目录 路径规划参考 路径规划 路径规划是导航的最终目标。这允许用户向机器人给出目标姿势&#xff0c;并让它在给定的环境中自主地从当前位置导航到目标位置。这是我们迄今为止所做的一切&#xff08;地图绘制和本地化&#xff09;的汇集点。ROS 导航堆栈已经为我们完成了…

CSDN每日一题学习训练——Java版(克隆图、最接近的三数之和、求公式的值)

版本说明 当前版本号[20231109]。 版本修改说明20231109初版 目录 文章目录 版本说明目录克隆图题目解题思路代码思路参考代码 最接近的三数之和题目解题思路代码思路参考代码 求公式的值题目解题思路代码思路参考代码 克隆图 题目 给你无向 连通(https://baike.baidu.com…

Docker两个容器互相请求接口

BEGIN 环境&#xff1a;Docker-Windows-Hyperf 1. 过以下命令查看Docker中的所有网络 docker network ls这个命令会列出所有的Docker网络&#xff0c;包括其ID、名称、驱动以及作用范围 在 Docker 中&#xff0c;容器通过 Docker 网络进行相互通信&#xff1b;在 Docker 中有…

第二十七章 解读Transformer_车道线检测中的Transformer(车道线感知)

前言 近期参与到了手写AI的车道线检测的学习中去&#xff0c;以此系列笔记记录学习与思考的全过程。车道线检测系列会持续更新&#xff0c;力求完整精炼&#xff0c;引人启示。所需前期知识&#xff0c;可以结合手写AI进行系统的学习。 SE简单实现 class SELayer(nn.Module):d…

Invalid bound statement (not found)

说明&#xff1a;记录一次Mapper.xml调用数据库存储过程的错误&#xff1b; 报错信息&#xff1a;Invalid bound statement (not found)&#xff0c;Mapper的全限定类名 场景&#xff1a;我仔仔细细核对过了方法名&#xff0c;参数&#xff0c;都没有问题&#xff0c;使用插件…

基于 HarmonyOS 的 HTTPS 请求过程开发示例(ArkTS)

介绍 本篇 Codelab 基于网络模块以及 Webview 实现一次 HTTPS 请求&#xff0c;并对其过程进行抓包分析。效果如图所示&#xff1a; 相关概念 ● Webview&#xff1a;提供 Web 控制能力&#xff0c;Web 组件提供网页显示能力。 ● HTTP数据请求&#xff1a;网络管理模块&am…

开发知识点-Django

Django 1 了解简介2 Django项目结构3 url 地址 和视图函数4 路由配置5 请求及响应6 GET请求和POST请求查询字符串 7 Django设计模式及模板层8 模板层-变量和标签9 模板层-过滤器和继承继承 重写 10 url反向解析11 静态文件12 Django 应用及分布式路由创建之后 注册 一下 13 模型…

力扣每日一题 ---- 2905. 找出满足差值条件的下标 II

这道题带有绝对值差的题&#xff0c;一看就是双指针的题&#xff0c;并且还带有两个限制&#xff0c;那么我们的做法就是 固定一个条件&#xff0c;维护一个条件 本题还用到了一个贪心思路&#xff0c;会介绍到 那我们怎么固定一个条件&#xff0c;维护一个条件&#xff1f; …

基于ssm的大学生社团管理系统

基于ssm的大学生社团管理系统 摘要 基于SSM的大学生社团管理系统是一个全面、高效的社团管理平台&#xff0c;旨在帮助大学生和社团管理员更方便、更快捷地进行社团活动的组织和管理。该系统基于Spring、SpringMVC和MyBatis&#xff08;简称SSM&#xff09;开发&#xff0c;这三…

CentOS Linux 系统镜像

CentOS Linux具有以下特点&#xff1a; 稳定性&#xff1a;CentOS Linux旨在提供一个稳定、可靠的服务器环境&#xff0c;适合用于关键业务应用和生产环境。高效性&#xff1a;CentOS Linux经过优化和调整&#xff0c;可以充分发挥硬件的性能&#xff0c;提高系统的整体效率。…

selenium自动化测试入门 —— 键盘鼠标事件ActionChains

在使用 Selenium WebDriver 做自动化测试的时候&#xff0c;会经常模拟鼠标和键盘的一些行为。比如使用鼠标单击、双击、右击、拖拽等动作&#xff1b;或者键盘输入、快捷键使用、组合键使用等模拟键盘的操作。在 WebDeriver 中&#xff0c;有一个专门的类来负责实现这些测试场…

DevChat:提升编程效率的AI编程助手

一、DevChat是什么&#xff1f; DevChat是一个集成了多种主流大模型的AI编程工具&#xff0c;专注于提升程序员的编程效率。它整合了ChatGPT、Codex等热门AI大模型&#xff0c;支持自然语言编程、代码编写、代码生成、代码补全等功能。DevChat最大的优势是一站式服务&#xff…