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;
}
避坑指南:AUTOSAR FlashDriver操作DFlash模拟EEPROM时,你最容易忽略的5个细节 本文深入探讨了AUTOSAR FlashDriver在DFlash模拟EEPROM操作中最容易被忽视的五大细节问题,包括地址合法性检查、操作时序控制、并发访问冲突、电源稳定性管理和寿命管理。通过实际项目案例和工程化解决方案,帮助开发者避免常见陷阱,提升汽车电子控制单元(ECU)的可靠性和稳定性。 阅读详情

相关推荐

采用离散模型搭建永磁同步电机控制系统

永磁同步电机发电系统分为控制器和发电机,通过simulink仿真软件进行发电系统的离散系统仿真。离散搭建仿真,可以更方便的自动代码生成。通过实践经验离散模块搭建,更能加深对整个控制系统的理解。离散系统在矢量控制中经常涉及到上个开关周期的角度,电压,或者预测下个周期的角度,电流,一般都是通过延时模块实现。PWM比较值寄存器被改写后都是使能了预装载,采样后触发计算到比较值生效可以延时0.5个开关周期Ts,也可以延时1个开关周期Ts,可以通过离散系统进行仿真,大大缩短开发周期。

f1072239934的博客 2863

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

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

m0_52398496的博客 254

反无人机作战体系全解析:从低慢小探测到分层拦截

随着小型无人机在军事和民用领域的广泛使用,低慢小目标探测与拦截成为低空安全的核心挑战。传统防空体系面对成本低廉、飞行高度低、雷达特征小的无人机集群时,暴露出探测难、识别难、处置成本失衡等问题。为应对威胁,反无人机体系采用分层闭环设计,融合雷达、光电、声学与无线电侦测实现多源感知,通过电子战软杀伤与导弹、高炮、激光等硬杀伤手段协同配合,并借助自动化指控系统缩短“传感器到射手”的响应时延。该体系既可支撑战场要地防护,也能为民用低空安防提供参考。围绕分层反制逻辑,梳理探测、软硬杀伤、指控布防及实战短板,提供理解反

weixin_42533120的博客 333

[推公式]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

多思计算机组成原理实验:模型机课程设计

计算机组成原理实验教程 基于多思网络虚拟实验系统 张雯雰

Nick的博客 2万+

fastjson1.2.83反序列化漏洞

【代码】fastjson1.2.83反序列化漏洞。

Coder的博客 1万+

2022杭电第六场

杭电第六场

小菜鸡的博客 209

一文讲透3GPP TS 36.104发射链路相关指标

3GPP是制定移动通信标准的国际组织,其36.104规范对LTE基站射频性能提出详细要求。规范主要涵盖七方面:1)基站输出功率分类标准;2)LTE信道带宽计算方法;3)TD-LTE特有的发射机关断功率及时延要求;4)信号质量指标(频率误差和EVM)及其影响因素;5)邻道泄漏比(ACLR)的45dBc标准;6)带内频谱辐射模板(OBUE)的噪声限制;7)9kHz-12.75GHz频段的带外杂散辐射要求。这些技术要求保障了LTE基站的射频性能和网络质量。

weixin_49761275的博客 4526

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

Geneformer实战指南:基于Hugging Face Transformers的基因序列分类模型解析

本文详细解析了基于Hugging Face Transformers的Geneformer模型在基因序列分类任务中的应用。通过介绍模型架构、数据处理流程和实战案例,帮助生物信息学研究者掌握这一前沿技术,实现高效的基因表达数据分析与分类。

weixin_28224217的博客 582

【数据分享】12.5米分辨率DEM地形数据(分省)

该数据来源于NASA地球科学数据网站(https://nasadaacs.eos.nasa.gov/),是ALOS卫星获取的高精度地形数据。该数据由于精度高,包括全省范围的数据和省内每个城市范围的数据!

JData_Engineer的博客 2171

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

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

试问道几许 2209

LVGL 实战:倒计时翻页钟

环境:LVGL 9.x + PC 模拟器。每个数字做成上下两半的卡片,秒变时用绕中缝翻页:上半旧页折叠下去、下半新页展开上来,配合阴影遮罩做出立体感。从 02:00 倒计时到 0,闪一下再重置。界面文案用英文(默认字体无中文)。

摸鱼专家 213

2022牛客多校联赛第一场

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

Gouzhong123的博客 430

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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

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

Mysssone的博客 228

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

wuqingyigexiaoba的博客 316

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序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
上一篇: 2022暑期牛客第六场
下一篇: 2022暑期杭电第五场
TGUACM_admin
博客等级 码龄4年 7粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值