2022暑期杭电第九场

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

1003题

Fast Bubble Sort

原题链接

题目大意

定义 B ( A ) B(A) B(A)是对序列 A A A进行一次冒泡排序

冒泡排序

可以对序列进行区间左右移动 1 1 1 个单位长度(数组区间循环移位)
现在给出一个序列,对任意区间提问,求有最小可以用几次上述操作就可以做到使 P [ l . . . r ] P[l...r] P[l...r] 变为 B ( P [ l . . . r ] ) B(P[l...r]) B(P[l...r])

思路

在样例中:
P ( 3 , 7 , 9 , 2 , 6 , 4 , 5 , 8 , 10 , 1 ) = 3 , 7 , 2 , 6 , 4 , 5 , 8 , 9 , 1 , 10 P(3,7,9,2,6,4,5,8,10,1)=3,7,2,6,4,5,8,9,1,10 P(3,7,9,2,6,4,5,8,10,1)=3,7,2,6,4,5,8,9,1,10
我们发现有很大一块是在左右两侧的序列中是相同的,这一段是 2 , 6 , 4 , 5 , 8 2,6,4,5,8 2,6,4,5,8。
我们观察到左侧的序列变为右侧的序列时,这一段是向左移动了一位,然后 9 9 9就会放在这一段序列后面。
那看上去我们把数组划分成若干段,每一段都是数组向左移动一位:
3 ∣ 7 ∣ 9 , 2 , 6 , 4 , 5 , 8 ∣ 10 , 1 3|7|9,2,6,4,5,8|10,1 3∣7∣9,2,6,4,5,8∣10,1

发现

  1. 每一段的开头组成了以第一个数 3 3 3为起始点的最长上升子序列
  2. 并且我们发现每一段最开始的节点会被换到这一段的最后面,例如 9 9 9换到了 8 8 8 后,也就是这一段序列左移一位(如果这一段长度为一,那可以不用移动)
  3. 每一段的最大值是这一段的起始值,且要小于下一段的起始值

考虑到数据量比较大,这时候一般就开始思考

  1. 如何才能合并区间答案

  2. 如何才能做到把一个点添加到这段序列并且同时维护答案

发现 1 1 1 操作需要考虑太多情况,每段区间所需要记忆的变量太多了,所以排除 1 1 1 方案
于是开始思考 2 2 2 方案:
先从左往右考虑,如果在序列的右侧添加一个新的值,则会导致每一个左端点到当前点划分的情况都不相同,所以还是很难。
换思路:如果我们是从左侧添加一个新的值,就会发现从左端点到右侧任意一个端点划分的情况只是相当于把右端点更远的划分情况截断了一部分,即对于这两个序列共有的前缀,他们有一个共同的划分方法。

那或许我们应当从右到左的思考:
我们想这个数组是如何划分出来的:

  1. 如果有一个序列,左侧希望添加一个值,这个值比右边的数小,则这个数单独看作一段
  2. 否则,就会把右侧所有比他小的值与这个值一起划分成一段

把每一段的第一个值抽出来,很明显就是一个单调栈,维护了最大值(在样例中为 3 , 7 , 9 , 10 3,7,9,10 3,7,9,10 )

既然单调栈都出来了,且查询量为 1 e 5 1e5 1e5,那我们就直接不演了,直接开始考虑线段树(等)+单调栈
(这种方法主要思想:从 n n n 到 1 1 1 依次扫描左端点 l l l,维护每个右端点上的答案 a n s R [ ] ansR[] ansR[],则当 l l l 在 q l ql ql 时,如果查询 [ q l , q r ] [ql,qr] [ql,qr] 的答案,只需要查询 a n s R [ q r ] ansR[qr] ansR[qr] 上的值即可,也就是说,这种方法需要离线询问。虽然其实在线询问也可以,上述操作可持久化就行)
(这样想的原理是:单调栈上每个元素都可以对应到一段区间上去,可以把单调栈的 p u s h push push 和 p o p pop pop 操作与线段树的区间修改操作绑定,同步进行,如果 p u s h push push 就添加标记,如果 p o p pop pop 就收回标记)
我们思考添加的这个值会对右侧所有答案造成什么影响(也就是左边界 i i i 变为 i − 1 i-1 i−1 时,所有右边界上的答案 a n s R [ ] ansR[] ansR[] 会怎么变)

懒得思考,打个暴力先:

int q;
cin >> n >> q;
rep(i, 1, n) cin >> p[i];
for (int i = n; i; --i) {
    cout << "L:" << i << "\tansR[]:{ ";
    for (int j = 1; j <= n; ++j) {
        if (j < i) {
            cout << "0 ";
            continue;
        }
        int t = p[i], ans = 0, flag = 1;
        for (int k = i + 1; k <= j; ++k) {
            if (p[k] > t)
                t = p[k], flag = 1;
            else if (flag)
                ++ans, flag = 0;
        }
        cout << ans << " ";
    }
    cout << "}";
    cout << endl;
}
/*
输入:
10 0
3 7 9 2 6 4 5 8 10 1
输出:
L:10    ansR[]:{ 0 0 0 0 0 0 0 0 0 0 }
L:9     ansR[]:{ 0 0 0 0 0 0 0 0 0 1 }
L:8     ansR[]:{ 0 0 0 0 0 0 0 0 0 1 }
L:7     ansR[]:{ 0 0 0 0 0 0 0 0 0 1 }
L:6     ansR[]:{ 0 0 0 0 0 0 0 0 0 1 }
L:5     ansR[]:{ 0 0 0 0 0 1 1 1 1 2 }
L:4     ansR[]:{ 0 0 0 0 0 1 1 1 1 2 }
L:3     ansR[]:{ 0 0 0 1 1 1 1 1 1 2 }
L:2     ansR[]:{ 0 0 0 1 1 1 1 1 1 2 }
L:1     ansR[]:{ 0 0 0 1 1 1 1 1 1 2 }
*/

我们发现

  1. 如果新添加的这个点所在区间长度并不是 1 1 1,则从这个点往后所有点的答案都会加一

  2. 否则,所有 a n s R [ ] ansR[] ansR[] 都不会变动

于是我们便可以在 p u s h push push单调栈的时候同时操作一下树状数组,把 i + 1 i+1 i+1 到 n n n 的位置上的 a n s R [ ] ansR[] ansR[] 都加一
然后 p o p pop pop 单调栈时做反向操作,撤回对应区间上的贡献 1 1 1 即可
(树状数组既然要区间修改,单点查询,那就用树状数组维护前缀和就行)
这样做的正确性在于:

  1. 如果当前这一位添加到原有的序列,且这一位所在的段只有他自己,那所有包含他的区间答案数并不会改变,因为这一位不需要区间左右移动
  2. 否则,就会把一些靠左的区间删除掉,删除后,以当前这个值作为开头的那一段上除去这个值所有的答案都会加一,因为他们既然在一个区间内,那就需要把当前值换到这一段的末尾才行。如: 9 , 2 , 6 , 4 , 5 9,2,6,4,5 9,2,6,4,5, 9 , 2 , 6 , 4 9,2,6,4 9,2,6,4都需要把 9 9 9 挪到最后面,所以 5 5 5, 4 4 4 所在位置上的 a n s R ansR ansR 都会增加 1 1 1
    然后其他的区间段虽然他们自己都不用移动,或者移动次数已经算在答案里了,但是他们的答案内还缺一个把当前这个值移动到所在段最后一个位置所消耗的 1 1 1 的代价。综上所述,这种情况下需要对当前这一位的下一位开始所有的位置上答案数 a n s R ansR ansR 都 + 1 +1 +1

代码

#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (int i = a, i##end = b; i <= i##end; ++i)
#define per(i, b, a) for (int i = a, i##end = b; i >= i##end; --i)
typedef long long LL;
#define endl '\n'
const int INF = 1e9 + 7;
const int LIM = 1e5 + 10;
typedef pair<int, int> pii;
template <class T>
class fenwick {
    vector<T> c;
    int n;

   public:
    fenwick(int n) : c(n + 1), n(n) {}
    void add(int x, T val) {
        assert(0 < x);
        // assert(x <= n);
        for (; x <= n; x += x & -x) c[x] += val;
    }
    T sum(int x) {
        // assert(0 <= x && x <= n);
        T ans = 0;
        for (; x; x -= x & -x) ans += c[x];
        return ans;
    }
};
int p[LIM], n;
vector<pii> Q[LIM];
int ans[LIM];
void solve() {
    int q;
    cin >> n >> q;
    rep(i, 1, n) cin >> p[i];
    rep(i, 1, n) Q[i].clear();
    rep(i, 1, q) {
        int l, r;
        cin >> l >> r;
        Q[l].push_back({r, i});
    }
    stack<pii> MAX;
    fenwick<int> tmp(n); // 就是ansR[]
    MAX.push({INF, n + 1});
    for (int i = n; i; --i) {
        while (MAX.top().first < p[i]) {
            int l = MAX.top().second, r;
            MAX.pop();
            r = MAX.top().second;
            if (l + 1 == r) continue;
            tmp.add(l + 1, -1); // ansR[l+1...n]--(撤回标记)
        }
        if (i + 1 != MAX.top().second) tmp.add(i + 1, 1); // ansR[i+1...n]++
        MAX.push({p[i], i});
        for (auto p : Q[i]) ans[p.second] = tmp.sum(p.first);
    }
    for (int i = 1; i <= q; ++i) cout << ans[i] << endl;
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int t = 1;
    cin >> t;
    rep(i, 1, t) solve();
} 
 

好像有树上倍增的解法

1007题

Matryoshka Doll——线性DP

原题链接

题目大意

​ T T T 组样例,每组给 n 、 k 、 r n、k、r n、k、r 三个数和一个大小为 n n n 的升序数组,要求将数组分为 k k k 组,每组都是升序且相邻两元素差值不能小于 r r r。

思路

考虑DP,设f[i][j]=前i个数分成j组时的情况数
例:

4 3 3
1 2 3 4 5 6 7
1 1 1 1 1 1 2 2 2 2 
分2组
1 3 | 2 4
f[4][2]=1
分3组
1 3 | 2 | 4
1 4 | 2 | 3
2 4 | 1 | 3
f[4][3]=3
分4组
1 | 2 | 3 | 4
f[4][4]=1 

观察得i扩展时元素a[i]有两种决策:

  1. 单独成组
  2. 和前面的成组

决策1无限制, f [ i ] [ j ] + = f [ i − 1 ] [ j − 1 ] f[i][j] += f[i-1][j-1] f[i][j]+=f[i−1][j−1]。
决策2显然受到 r r r 的限制,观察前 i − 1 i-1 i−1 个数的分组情况,发现前 i − 1 i-1 i−1 个元素的所有合法答案中,和i不相容的元素必然单独分列在一些组的末尾,没有在同一组的情况。这是因为这些元素受r的限制同时又和i冲突,则其值有( a [ i ] − r , a [ i ] a[i]-r,a[i] a[i]−r,a[i] ]的范围限制,故两两冲突不能在同一组。
去除不相容的组后,元素 a [ i ] a[i] a[i] 可以接在任一组后, f [ i ] [ j ] + = f [ i − 1 ] [ j ] ∗ ( j − ( a [ 0 ]   a [ i − 1 ] f[i][j] += f[i-1][j]*(j-(a[0]~a[i-1] f[i][j]+=f[i−1][j]∗(j−(a[0] a[i−1] 中和 a [ i ] a[i] a[i] 冲突的部分));

初值: f [ 0 ] [ 0 ] = 1 初值:f[0][0]=1 初值:f[0][0]=1
最终值: f [ n ] [ k ] = n 个数分成 k 组的情况数 最终值:f[n][k]=n个数分成k组的情况数 最终值:f[n][k]=n个数分成k组的情况数
转移方程:
f [ i ] [ j ] + = f [ i − 1 ] [ j − 1 ] ∗ 1 f[i][j] += f[i-1][j-1]*1 f[i][j]+=f[i−1][j−1]∗1
f [ i ] [ j ] + = f [ i − 1 ] [ j ] ∗ ( j − ( a [ 0 ]   a [ i − 1 ] 中和 a [ i ] 冲突的部分 ) ) ; f[i][j] += f[i-1][j]*(j-(a[0]~a[i-1]中和a[i]冲突的部分)); f[i][j]+=f[i−1][j]∗(j−(a[0] a[i−1]中和a[i]冲突的部分));
伪代码:

f[0][0]=1; 
for i in 1...n
f[i][j] = f[i-1][j-1];
f[i][j] +=f[i-1][j]*(j-fal[i]);
f[i][j] %=mod;

优化:
如果理解了上面的转移方程,就会发现转移只和 j / j − 1 j/j-1 j/j−1有关,于是可以将 f [ i ] f[i] f[i] 这一维省略,优化空间。注意 f [ 0 ] f[0] f[0] 此时不能设为 1 1 1,因为只有 f [ 0 ] [ 0 ] = 1 f[0][0]=1 f[0][0]=1,于是需要稍微处理一下,发现 1 1 1 个元素时只有分 1 1 1 组的 1 1 1 种情况,故:
初值: f [ 1 ] = 1 ( f [ 1 ] [ 1 ] = 1 ) 初值:f[1]=1 (f[1][1]=1) 初值:f[1]=1(f[1][1]=1)
最终值: f [ k ] ( f [ n ] [ k ] ) 最终值:f[k] (f[n][k]) 最终值:f[k](f[n][k])
伪代码:

for j in 2...n
f[j] *= (j-fal[i]);
f[j] += f[j-1];
f[j] %=mod;

代码

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
inline int min(int a,int b)
{
	return a<b?a:b;
}
const int mod=998244353;
int arr[5005],fal[5005];
ll f[5005];
int main()
{
	int t; scanf("%d",&t);
	while(t--)
	{
		int n,k,r;
		scanf("%d%d%d",&n,&k,&r);
		memset(f,0,sizeof(*f)*(n+1)); 
		for(int i=1;i<=n;i++)
		{
			scanf("%d",arr+i);
		}
		for(int i=1,p=1;i<=n;i++)
		{
			while(arr[i]-arr[p]>=r)p++;
			fal[i]=i-p;
		}
		f[1]=1;
		for(int i=2;i<=n;i++)
		{
			for(int j=min(i,k);j;j--)
			{
				f[j] *= (j-fal[i]);
				f[j] += f[j-1];
				f[j] %=mod;
			}
		}
		printf("%lld\n",f[k]);
	}
	return 0;
}

1008题

Shortest Path in GCD Graph

题目链接

题目大意:

给出 n n n 个点,每个点的值为 1 − n 1-n 1−n 且不重复,任意两个点都有一条边,边权为两个点值的 $gcd#

每次询问会给出两个点,要求你求出这两点间的最短距离以及最短距离路径的个数

思路:

询问时,若询问的两个点互质,则为 x − > y x->y x−>y 为最短路,长度为 1 1 1

若询问的两个点不互质,则 x x x 到 y y y 最短长度为 2 2 2,因为总有 x − > 1 − > y = = 2 x->1->y==2 x−>1−>y==2,所以只要找到所有与 x , y x,y x,y同时互质的数的个数

分别求两个数的质因数并去重,利用容斥原理求出能整除这些质因数的数量,再用 n n n 减去,便得出答案

注意,若 x x x 和 y y y 的 g c d gcd gcd 为 2 2 2,则答案需要加一

代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<set>
#include<fstream>
#define int long long
using namespace std;
const int N = 1e7 + 10;
const int mod = 998244353;
int prime[N],f[N],ans;
int n, q;
bool isprime[N];
set<int> s;
vector<int> a;
void init(int n)
{
	isprime[1] = 1;
	int cnt = 0;
	for (int i = 2; i <= n; ++i)
	{
		if (!isprime[i])
		{
			prime[++cnt] = i;
			f[i] = i;
		}
		for (int j = 1; j <= cnt && prime[j] <= n / i; ++j)
		{
			isprime[prime[j] * i] = 1;
			f[prime[j] * i] = prime[j];
			if (i%prime[j] == 0) break;
		}
	}
}
int gcd(int a, int b)
{
	return b ? gcd(b, a%b) : a;
}
void zhi(int x)
{
	while (x > 1)
	{
		int t = f[x];
		if (!s.count(t)) s.insert(t);
		while (!(x%t)) x /= t;
	}
}
void dfs(int x, int s, int p,int len)
{
	if (x == len)
	{
		ans += p * (n/s);
		ans %= mod;
		return;
	}
	dfs(x + 1, s, p, len);
	if (s <= n / a[x]) dfs(x + 1, s*a[x], -p, len);
}
void suan(int x, int y,int n)
{
	s.clear(),a.clear(),ans=0;
	zhi(x),zhi(y);
	int len = s.size();
	ans = 0;
	for (auto i : s) a.push_back(i);
	dfs(0, 1, 1,len);
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	cin >> n >> q;
	init(n);
	for (int i = 1; i <= q; ++i)
	{
		int x, y;
		cin >> x >> y;
		int g = gcd(x, y);
		if (g == 1) {
			cout << 1 << ' ' << 1 << endl;
		}
		else
		{
			suan(x, y,n);
			if (g == 2) ans++;
			cout << 2 << ' ' << ans << endl;
		}
	}
	return 0;
}

1010题

Sum Plus Product

题目链接

题目大意

给定一个长度为 n n n 的数组,每次随机拿出两个数使其变成 ( a + b + a ∗ b ) (a + b + a * b) (a+b+a∗b)再放回数组,最终数组中只剩下一个数,求剩余数字的期望是多少。

思路

先探索一下三个球的情况
_ABCO_6_131YYT4Z_O_6QXX.png

发现经过操作的两个球得到的答案具有“轮换性”——任意交换两个字母,多项式不变,这就意味着交换两个球的操作次序,答案是唯一的,因此我们产生最终剩余的球的数字与先操作后操作哪个球无关的猜测。但是我们这里只做了 a a a 与 b b b, a b ab ab 与 c c c, a b c abc abc 与 d d d 这样的操作,但还有 a a a 与 b b b , c c c 与 d d d , a b ab ab 与 c d cd cd这样的方式我们没有讨论到,下面做出粗糙的证明。

大概证明:

①首先我们知道包含n个字母的多项式最多有的项数是:
C n 1 + C n 2 + C n 3 + . . . + C n n = 2 n − 1 C_{n}^{1}+C_{n}^{2}+C_{n}^{3}+...+C_{n}^{n}=2^n-1 Cn1​+Cn2​+Cn3​+...+Cnn​=2n−1

②每次两个球操作所产生新小球的每一项都不会相同(因为字母不同)

③一个含x个字母的球与一个含y个字母的球进行操作得到的新小球含多少项?

根据①两个球分别有 2 x − 1 2^x-1 2x−1, 2 y − 1 2^y-1 2y−1项

那么相加就有 2 x − 1 + 2 y − 1 2^x-1+2^y-1 2x−1+2y−1项,相乘有 ( 2 x − 1 ) ∗ ( 2 y − 1 ) (2^x-1)*(2^y-1) (2x−1)∗(2y−1)项

答案是: 2 x − 1 + 2 y − 1 + ( 2 x − 1 ) ∗ ( 2 y − 1 ) = 2 ( x + y ) − 1 2^x-1+2^y-1+(2^x-1)*(2^y-1)=2^(x+y)-1 2x−1+2y−1+(2x−1)∗(2y−1)=2(x+y)−1

正好等于①含x+y个字母的球的最大项数!并且有②,每一项都不同,那么这个球一定是一个“轮换性”的多项式!
这就说明了两个含任意数量字母的“轮换性”球进行操作,得到的新球也具有“轮换性”,那么根据归纳最终的球也具有“轮换性”,这样就证明了答案与操作目标、顺序无关。

代码就很简单了,从头操作到尾就行了。

代码

#include<bits/stdc++.h>
using namespace std;
int n,a[510];
const int mod=998244353;
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    long long ans=a[1];
    for(int i=2;i<=n;i++)
    {
        ans=(ans+a[i]+ans*a[i]%mod)%mod;
    }
    cout<<ans<<endl;
}
int main()
{
    int test;
    cin>>test; 
    while(test--)
    {
        solve();
    }
}
《UE4游戏开发》之 《查cook资源失败,问题记录》 当项目打包时,cook出错,但是从原始引擎提供的信息中,没有提示具体的那个资源出错,要查到出错资源,还是非常麻烦。 下面就材质cook出错,增加一些日志,方便查找问题做简单记录 材质cook的一个阶段,是收集MaterialShaderMap,如果在这个阶段收集的信息出错,将会在FShaderMapContent::GetOutdatedTypes函数中,因为Shaders指针指向的内存有问题而出错,通过断点发现,FShaderMapContent这个类对象指针为null,而这个类对象的来源于AllMat. 阅读详情

相关推荐

别再手动翻译PDF了!手把手教你用Zotero PDF Translate插件搞定外文文献(附最新GitHub下载链接)

本文详细介绍如何利用Zotero PDF Translate插件高效翻译外文文献,包括插件安装、配置及多引擎对比。通过划词翻译、段落翻译和全文翻译功能,显著提升科研工作效率,特别适合处理大量英文PDF文献的研究人员。

weixin_33712987的博客 772

2022杭电多校九 1003-Fast Bubble Sort(倍增+单调栈)

题目大意:首先说明一个性质,A表示一个数组,B(A)表示把这段数组进行一遍冒泡排序的下沉操作,就是把大数沉底。然后题目给我们一个长度为n的数组,给我们q个询问,每个询问包含一个l,r问我们将[l,r]区间内的数变成具有上述性质的区间至少需要几步操作,每次操作如下:选取一段区间,可以将区间的第一个数字放到这段区间的最后或者是将区间的最后一个数放到区间首部。

weixin_54562114的博客 289

3D-IC测试挑战与Tessent解决方案解析

3D-IC技术通过硅通孔(TSV)实现芯片垂直堆叠,是延续摩尔定律的关键路径。该技术面临三大核心挑战:KGD标准严苛化要求测试覆盖率达99.5%以上,存储器测试需兼容LPDDR/HBM等多种协议,逻辑堆叠需解决TSV互连的电气特性和时序验证问题。Mentor Tessent平台采用混合测试架构,结合压缩扫描测试(ATPG)和内建自测试(BIST)技术,实现100x测试数据压缩比和99.97%的TSV缺陷检出率。这些创新方案在移动SoC和高性能计算芯片中已获验证,测试时间缩短73%,缺陷逃逸率降低77%。随着

weixin_30621711的博客 376

2022杭电多校9 Matryoshka Doll

状态转移:dp[i][j]=dp[i-1][j-1]+dp[i-1][j]*(j-temp),意思是当前第i个套娃可以单独作为一组,也可以和之前的套娃共同作为一组,temp表示对于1

weixin_54562114的博客 445

设备树实践:从零构建一个嵌入式板级的设备树描述

本文详细介绍了如何从零开始为嵌入式Linux系统构建设备树(Device Tree),以i.MX6ULL处理器为例,涵盖硬件分析、设备树语法、外设配置及调试技巧。通过实践指导,帮助开发者掌握设备树编写,实现硬件与软件的高效对接,提升嵌入式开发效率。

plum99的博客 306

视网膜血管分割数据集(DRIVE数据集,STARE数据集,REFUGE数据集,CHASE_DB1数据集,DiaRetDB1数据集)

在医学图像处理领域,视网膜图像分析对于眼部疾病的早期诊断与治疗具有举足轻重的意义。随着人工智能技术的蓬勃发展,尤其是深度学习算法在图像分割任务中的广泛应用,高质量的视网膜图像数据集成为推动该领域研究进展的关键要素。这些数据集不仅是训练和优化算法模型的基石,更是衡量算法性能优劣的重要依据。本文聚焦于视网膜图像分割领域,详细介绍 DRIVE、STARE、REFUGE、CHASE_DB1 以及 DiaRetDB1 这几个具有代表性的数据集。

weixin_43518285的博客 2270

2022“杭电杯”中国大学生算法设计超级联赛(9)签到题4题

2022“杭电杯”中国大学生算法设计超级联赛(9)2022“杭电杯”中国大学生算法设计超级联赛(9)2022“杭电杯”中国大学生算法设计超级联赛(9)2022“杭电杯”中国大学生算法设计超级联赛(9)...

小哈里的博客 1624

【本地部署实战】LM Studio深度使用指南:从环境搭建到模型调优

LM Studio通过极简的操作流程和强大的生态兼容性,让本地部署大模型成为可能。随着M4芯片的发布和CUDA 12.0的优化,未来本地化AI开发将迎来新的爆发点。建议开发者关注官方Discord社区(https://discord.gg/lmstudio)获取最新模型支持信息。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 8751

2022”杭电杯“中国大学生算法设计超级联赛(9)1 3 7题解

1001题解 分治法

Shanhj的博客 603

华为OD机试双机位C卷-虚拟文件系统(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【虚拟文件系统】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【虚拟文件系统】。

qq_45776114的博客 477

运行 ui5 serve 命令行报错的处理方法

如果大家运行 ui5 serve 命令行,报如下的错误消息: ui5 不是内部或外部命令,也不是可运行的程序: 只需要执行命令行,全局安装 ui5 cli(command line interface)这个命令行工具即可: npm install --global @ui5/cli 这个 ui5 cli 的入口执行文件,实际安装在了我 Node.js 的安装目录下: 更多Jerry的原创文章,尽在:“汪子熙”: ...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1340

2022“杭电杯”中国大学生算法设计超级联赛(9)

2022“杭电杯”中国大学生算法设计超级联赛(9)

Troye的博客 471

使用Python爬取在线图书馆的图书馆藏和阅读记录

通过使用Python编写爬虫程序,我们可以从在线图书馆上获取图书馆藏和阅读记录,帮助人们更好地管理和利用图书馆资源。本文简要介绍了爬虫程序的准备工作、网页解析和数据提取、数据的保存和处理的关键步骤,并提供了一个示例代码。在实际应用中,我们需要注意遵守在线图书馆的使用规则和爬虫道德准则,确保合法、合规地进行爬取操作。以上仅为概述,实际应用的过程中可能需要根据具体需求进行适当的调整和改进。

2201_76125393的博客 729

2022杭电多校联赛第九场 题解

杭电9

weixin_51937688的博客 1226

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

2022 年杭电多校第九场补题记录

2022 年杭电多校第九场补题记录

m0_52048145的博客 1020

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

杭电多校-Matryoshka Doll-(dp+巧妙思维)

就是给你n个盒子,每个盒子有个空间,如果a盒子可以装下b盒子当且仅当a-b>=k。现在让你把这些盒子分成m组,每组比如为a b c d,那么需要b装下a,c装下b,d装下c。问你一共有多少种分法。两个组是否不同只看盒子编号不看顺序。...

m0_52398496的博客 597

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 228

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 315

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 592

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 21

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 750

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 371

408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路

2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。

m0_56226131的博客 412

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 172

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 85

算法61,判定是否为字符重排

两字符串能互为重排 ⇔。

sheshibenniaodan的博客 219
上一篇: 2022暑期牛客第七场
下一篇: 2022暑期杭电第十场
TGUACM_admin
博客等级 码龄4年 7粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值