2022暑期杭电第六场

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

1006题

Maex

题目链接

题目大意

给出一棵树,以 1 1 1 为根节点,树上的每个节点都有自己的点权 a i a_i ai​,以及一个价值 b i b_i bi​ , b i b_i bi​ 是 i i i 子树中 a a a 值集合的 M E X MEX MEX (集合中未出现的最小非负整数), a i a_i ai​ 的值可以为任意的自然数,题目保证 a i a_i ai​ 的值不同。求 b i b_i bi​ 加和的最大值。

思路

由题意可以看出,这是一道典型的树形dp问题,通过对样例的模拟可知,只有从根节点到某个叶子节点路径上的点才会对答案有所贡献,并且贡献值为该子树的节点个数。所以我们应当找到一条最长的路径来使得 b i b_i bi​ 的贡献最大。
所以我们可以用 v a l [ i ] val[i] val[i] 表示以 i i i 叶子节点的子树中得到的 b i b_i bi​ 加和最大值, c n t [ i ] cnt[i] cnt[i] 记录该节点的节点个数,最后 d f s dfs dfs 即可得到结果。

代码

#include<iostream>
#include<vector>
#define int long long
using namespace std;

const int N = 5e5+10;

vector<int> v[N];
int cnt[N];//节点个数
int val[N];//价值

void dfs(int now,int root){
    int maxm = 0;
    for(auto x:v[now]){//遍历子节点,并找到子节点中的最大值
        if(x == root)continue;
        dfs(x,now);
        cnt[now] += cnt[x] + 1;
        maxm = max(maxm,val[x]);
    }
    val[now] = maxm + cnt[now] + 1;
}


void solve(){
    int n;
    cin>>n;
    for(int i = 1;i <= n;i ++){
        v[i].clear();
        val[i] = 0;
        cnt[i] = 0;
    }
    for(int i = 1;i <= n-1;i ++){
        int x,y;
        cin>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
	dfs(1,0);
    cout<<val[1]<<endl;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin>>t;
    while(t--)solve();
    system("pause");
    return 0;
}

1007题

Shinobu loves trip

题目链接

题目大意

给定常数 a a a 和 p p p,你会进行 n n n 次旅行,每次旅行的起点是 s s s,第一天的位置在 s s s, d d d 天之后的位置是 ( s ⋅ a d )   m o d   P (s\cdot a^d)\ mod\ P (s⋅ad) mod P。有 q q q 个询问,每次询问一个位置 x x x,问你一共经过多少次 x x x。

思路

判断 x x x 是否会被经过,只需要判断是否存在 0 ≤ k ≤ d 0\le k\le d 0≤k≤d 使得 ( s ⋅ a k )   m o d   p = x (s\cdot a^k)\ mod\ p=x (s⋅ak) mod p=x,因为 p p p 是质数,所以知道 x x x 和 s s s 就能求出 a k a^k ak。

我们可以先预处理出 a 0 , a 1 , ⋯   , a d a^0,a^1,\cdots,a^d a0,a1,⋯,ad 保存在 map 中,然后判断算出来的 a k a^k ak 是否在 map 中,如果不在,则此次旅行一定不经过 x x x;否则,可以求出 k k k,判断 k k k 是否 ≤ d \le d ≤d 即可。

代码

int n, a, p, q, s[N], d[N];
LL inv[N];

LL powmod(LL a, LL b) {
    LL ans = 1;
    while (b) {
        if (b & 1) (ans *= a) %= p;
        (a *= a) %= p;
        b >>= 1;
    }
    return ans;
}

void solve() {
    scanf("%d%d%d%d", &p, &a, &n, &q);
    for (int i = 1; i <= n; i++) {
        scanf("%d%d", &s[i], &d[i]);
        if (s[i]) inv[i] = powmod(s[i], p - 2);
    }
    std::unordered_map<int, int> mp;
    int x = 1, t = 0;
    while (t <= 200000) {
        if (mp.count(x)) break;
        mp[x] = t;
        x = 1LL * x * a % p;
        t++;
    }
    while (q--) {
        int x;
        scanf("%d", &x);
        int ans = 0;
        if (!x) {
            for (int i = 1; i <= n; i++) ans += (s[i] == 0);
        } else {
            for (int i = 1; i <= n; i++)
                if (s[i]) {
                    int k = x * inv[i] % p;
                    if (mp.count(k) && mp[k] <= d[i]) ans++;
                }
        }
        printf("%d\n", ans);
    }
}

1010题

Planar graph

题目链接

题目大意:

给定一个平面图(即图中任意两条边之间不相交),该平面图有 n n n 个顶点, m m m 条边,每条边均有一个编号,编号为 1 , 2 , … , m 1,2,\dots,m 1,2,…,m 。设给定平面图中的边围成的平面区域有 k k k 个,分别标记为 1 , 2 , … , k 1,2,\dots,k 1,2,…,k 。现在,我们通过给一些边打上通道(相当于将这些边删去),使得平面区域两两之间可以相互到达。求最少需要删除多少边,输出需要删除的边的数量,同时输出所有可行方案中字典序最小的方案。

分析:

通过对图的分析,我们知道,一条边是否需要要被打通(删除),取决于该边是否在一个环上,即取决于该边是否对围成一片新的平面区域有贡献。由于我们要输出字典序最小的方案,所以,在所有的边当中,我们取边的编号最小的那个即可。

判定是否成环有多种方式,这里我们使用并查集来判定是否成环。参考例题——格子游戏。具体实现:我们先将所有的边存起来,初始时,我们将每个点作为一个单独的集合,即令 p [ i ] = i p[i] = i p[i]=i 。之后,我们从编号最大的边开始,从大到小遍历所有的边。 每遍历到一条边,若两个点不在同一个集合,我们便将两个点所在的集合合并;若在同一个集合,则说明这条边的加入刚好使得图中形成了一个新的环,这个时候,我们便将该边的编号加入到答案中。由于是倒序遍历,每次形成一个新的环时,加入的边必定是环上编号最小的边。整体代码实现还算简单。

参考代码
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N = 1e5 + 10, M = 2e5 + 10;
typedef long long ll;

struct Edge {
	int x, y;
}edge[M];

int p[N];

int find(int x) {
	if(p[x] == x) return x;
	else return p[x] = find(p[x]);
}

void solve() {
	int n, m; scanf("%d %d", &n, &m);
	for(int i = 1; i <= m; i ++ ) {
		scanf("%d %d", &edge[i].x, &edge[i].y);
	}
	for(int i = 1; i <= n; i ++ ) p[i] = i;
	vector<int> ans;
	for(int i = m; i > 0; i -- ) {
		int a = edge[i].x, b = edge[i].y;
		int x = find(a), y = find(b);
		if(x == y) ans.push_back(i);
		else p[y] = x;
	}
	sort(ans.begin(), ans.end());
	printf("%d\n", ans.size());
	for(int i = 0; i < ans.size(); i ++ ) {
		printf("%d ", ans[i]);
	}
	puts("");
}

int main() {
	int t; scanf("%d", &t);
	while(t -- ) {
		solve();
	}
	return 0;
}

1012题

Loop

题目链接

题目大意

每次操作可以将数组中的一个数向后移 n n n 位,问 k k k 次操作后字典序的最大值

分析

数据范围较大,故基本采用 O ( n ) O(n) O(n) 的做法。我们可以先把要取的数取出来,然后再一起插到后面。我们可以发现,从前往后比较两个数,当前数比后数小时,就可以把前数取出,然后再比较后数和前数的前数,直到前数比后数大为止,然后再往后比较。可以发现我们是在进行一个维护单调递减栈的操作,当新插入的数比栈顶大时,就将栈顶弹出,直到插入的数比栈顶小,或者是已经进行了 k k k 次操作为止。接下来就可以将弹出的数插入到后面,首先可以对弹出的数降序排列,然后依然是从前往后依次比较,当要插入的数比当前数大的时候,就将数插入到这个数之前,直到插入的数小于当前数为止。

代码

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

typedef long long ll;
typedef double db;

const int N=3e5+1;

int T,n,k;
int a[N],b[N],c[N],s[N];

bool cmp(int a,int b){return a>b;}

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&k);
        for(register int i=1;i<=n;i++) scanf("%d",&a[i]);
        int top=0,now=0;
        //维护单调栈
        for(register int i=1;i<=n;i++)
        {
            if(now>=k) s[++top]=a[i];//已弹出k个数
            else
            {
                while(top&&now<=k&&s[top]<a[i]) b[++now]=s[top--];
                s[++top]=a[i];
            }
        }
        //将弹出数组插入
        sort(b+1,b+now+1,cmp);
        int nows=1,nowb=1,nowc=0;
        for(register int i=1;i<=top;i++)
        {
            if(nowb>now) c[++nowc]=s[i];
            else
            {
                while(b[nowb]>s[i]) c[++nowc]=b[nowb++];
                c[++nowc]=s[i];
            }
        }
        while(nowb<=now) c[++nowc]=b[nowb++];
        
        printf("%d",c[1]);
        for(register int i=2;i<=n;i++) printf(" %d",c[i]);
        printf("\n");
    }
    return 0;
}
基于人脸识别的智能门禁系统设计 在当前的技术背景下,本文精心打造了一款前沿的视频识别门禁控制系统。在进行调试的时候使用的软件是Keil,编写完代码,生成文件后用下载器下载到单片机上,就能够进行程序的调试了,本次设计实现了预先设定的目标,达到了预期的效果。本次设计的人脸识别的门禁控制系统其硬件部分是以STM32F103C8T6为核心的单片机,采用0V2640摄像头对人员的人脸识别,采用矩阵按键对系统的操作以及密码的输入,使用蜂鸣器来作为报警模块,开门装置是电子锁控制,显示设备采用OLED液晶显示,无线模块在一番思索后选择了蓝牙模块传输。 阅读详情

相关推荐

基于STM32F103标准库与DMA的实时音频FFT频谱显示系统设计

本文详细介绍了基于STM32F103芯片与DMA技术实现实时音频FFT频谱显示系统的设计方法。通过标准库驱动和FFT算法处理音频信号,结合OLED显示屏实时绘制音乐频谱,涵盖硬件选型、核心原理、开发环境搭建及性能优化等关键步骤,为数字信号处理应用提供实用参考。

yellow的专栏 777

杭电多校-Shinobu loves trip-(预处理+同余定理)

预处理出来,每个旅行计划的起点也要预处理,因为每次求n个数的逆元的话复杂度也很高。还要注意特判的就是如果某个计划的起点是0的话,看看x是不是0。%p = x%p,这个式子,但是一想每次都跑一遍的话复杂度太高了。其实根本不用想那么多,就是一直乘a,看看能到达的城市是多少就行了。就是有p个城市,编号0~p-1。然后有n个旅行计划,每个旅行计划有个初始点,和旅行的天数。然后小A旅行的的点顺序是,每次乘以a,当然同时对p取模。1.观察到查询次数和旅行计划很少,应该是查询的时候,枚举每个旅行计划看看是否可以。...

m0_52398496的博客 254

【rt-thread实战解析】从零到一:基于STM32与LAN8720A的以太网驱动配置全流程

本文详细解析了在RT-Thread操作系统上为STM32F407配置LAN8720A以太网驱动的全流程。从硬件连接自查、CubeMX工程创建、PHY复位函数编写,到RT-Thread工程配置、LwIP协议栈集成,最后进行实际上电测试与网络调试,手把手指导开发者避开常见陷阱,实现稳定的以太网连接。

m2n3b4v5c6的博客 525

[推公式]Shinobu loves trip 2022杭电多校第6场 1007

对于每个目标地点都遍历一遍所有计划,然后根据题意写出下面这个方程,s*a^y 同余 xi(Mod P) ,实际上这个计划能否经过xi等价于上式中最小解y是否小于等于d,对公式进行变形,两侧同时乘s逆元,就变成了a^y 同余 s^-1*xi(Mop P),可以维护出来a^y在y∈[1, 200000]范围内所有的值,并存放在一个map中,这样就可以通过该值查找到最小的y了,之后在遍历的时候只需要看一下map[s^-1*xi]是否存在,如果存在再看下值是否小于等于d,满足的话就说明这个计划会经过xi。...

Cloth的博客 313

BUUCTF reverse题解汇总

BUUCTF平台刷题过程中做的一些逆向题解的总结归类

于高山之巅,方见大河奔涌;于群峰之上,更觉长风浩荡。 1万+

三相SST固态变压器详细设计案例

本案例针对400kVA、30kHz三相固态变压器(SST)开展详细设计,核心采用输入串联输出并联(ISOP)拓扑架构(模块化多电平矩阵变换器M3C简化版),重点完成高频变压器的参数计算、绕组设计、损耗分析及液冷温升验证,同时覆盖系统级架构设计、半导体损耗估算及整机效率优化,全流程基于当前电力电子技术可行性展开。

qq_32103755的博客 3299

2022杭电第六场

杭电第六场

小菜鸡的博客 209

AutoSAR配置与实践(基础篇)2.5 RTE对数据一致性的管理

SWC内部不同的Runnable访问共同全局变量,Runnable类似C文件中的函数,这些函数如果被放在不同Task上运行, 可能出现出现同一时刻多个函数共同运行的情况。可以通过为受影响的任务分配相同的优先级,为受影响的任务分配相同的内部操作系统资源,或者将OS的任务配置为非抢占性来实现。数据一致性:当多个操作同时读写同一个数据,由于任务的抢占,出现了数据被篡改的情况,造成非预期的数据结果。SWC内部变量保护,限定局变量的作用域在变量的作用域在SWC的不同runnable间。

nihaoljq2010的博客 2628

Codeforces 7A - Kalevitch and Chess 水 (*1300)

#include&lt;iostream&gt; #include&lt;cstring&gt; #include&lt;cstdio&gt; #include&lt;algorithm&gt; #include&lt;vector&gt; #include&lt;set&gt; #include&lt;map&gt; #include&lt;queue&gt; #include

STOP 399

车载软件刷写工具vFlash --- 自动化接口(Automation API)应用简介

车载软件刷写工具vFlash --- 自动化接口(Automation API)应用简介

Soly_kun的博客 361

Oracle EBS Tax 四国实现详解:印度、巴西、美国、阿根廷

印度:务必启用India Localization模块,不要尝试用标准EBTax模拟GST逻辑 巴西:必须配置NF-e接口,建议聘请本地税务顾问设置CFOP和NCM代码映射 美国:跨州业务强烈建议购买Vertex或Avalara服务,自建税率表维护成本极高 阿根廷:注意1:1:1架构限制,提前规划Legal Entity和OU结构

金牌架构师 260

【2022-08-20】美团秋招笔试五道编程题

【2022-08-20】美团秋招笔试五道编程题

试问道几许 2209

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

2022牛客多校联赛第一场

2022牛客多校联赛第一场题解

Gouzhong123的博客 430

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

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

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

Mysssone的博客 228

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

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

wuqingyigexiaoba的博客 316

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

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序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的博客 22

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的博客 86

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

两字符串能互为重排 ⇔。

sheshibenniaodan的博客 219

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

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 178

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 359

考拉兹猜想 - 7

本文通过引入虚数单位重构Collatz猜想的迭代逻辑,指出偶数减半与奇数“乘3加1”的过程在虚数坐标下等价于归结操作。关键在于:乘3加1使奇数跃升至偶数,随后持续减半,而虚数单位代表“无限减1”,实现无限向有限的转化。无论初始值如何,减半始终主导,最终归结为4-2-1循环。该视角消解了正向思维中的速度竞争疑虑,证明归结是必然结果。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值