天梯赛数据结构合集

news2025/4/19 11:56:02

1.集合操作:PTA | 程序设计类实验辅助教学平台

主要是注意set的取交集操作,AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
set<int> a[60];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>m;
        for(int j=1;j<=m;j++){
            int x;cin>>x;
            a[i].insert(x);
        }
    }
    cin>>k;
    for(int i=1;i<=k;i++){
        int u,v;cin>>u>>v;
        set<int> ss;
        set_intersection(a[u].begin(), a[u].end(),
                          a[v].begin(), a[v].end(),
                          inserter(ss,ss.begin()));
        double cnt=ss.size();
        printf("%.2lf",cnt/(a[u].size()+a[v].size()-cnt)*100.0);
        cout<<"%"<<endl;
    }
}

2.map+vector:PTA | 程序设计类实验辅助教学平台

一开始以为是一道水题,但是后来发现虽然意思简单,但是实现方式还是蛮有意义的,我们可以开一个map,利用vcetor作为key,再通过for(auto &s:map)即可遍历map,得到答案。AC代码如下:

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

const int N = 10010, M = 110;
map<vector<int>, int> cnt;
vector<pair<int, vector<int> > > ans;
int n, m;

int main()
{
	scanf("%d%d", &n, &m);
	for (int i = 0; i < n; i++)
	{
		vector<int> temp;
		for (int j = 0; j < m; j++)
		{
			int x;
			scanf("%d", &x);
			temp.push_back(x);
		}
		cnt[temp]++;
	}
	for (auto &u : cnt) ans.push_back({ -u.second, u.first });
	//for (auto &[u, v] : cnt) ans.push_back({ -v, u });//C++新特性,PTA不支持
	sort(ans.begin(), ans.end());
	printf("%d\n", cnt.size());
	for (auto &u : ans)
	{
		printf("%d", -u.first);
		for (auto &v : u.second)
			printf(" %d", v);
		puts("");
	}

3.并查集:PTA | 程序设计类实验辅助教学平台

非常有意思的一道题,只要观察到一点就非常容易了,也就是最短路是2*(节点数-1)-最长链的长度,证明非常容易,只是要想注意到还是需要多画图模拟,知道了这个后那就是常规的dfs预处理+并查集维护了,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,die[200010],dep[200010],fa[200010],siz[200010],hh=0;
vector<int> edge[200010];
int find(int u){
    if(fa[u]==u) return u;
    return fa[u]=find(fa[u]);
}
void merge(int u,int v){
    if(find(u)==find(v)) return;
    siz[find(v)]+=siz[find(u)];
    fa[find(u)]=find(v);
}
void dfs(int x,int cnt){
    dep[x]=cnt;
    for(int i=0;i<edge[x].size();i++){
        dfs(edge[x][i],cnt+1);
    }
}
signed main(){
    cin>>n>>m;
    int root=-1;
    for(int i=1;i<=n;i++){
        fa[i]=i;
        siz[i]=1;
        cin>>die[i];
        if(die[i]!=-1){
            edge[die[i]].push_back(i);
        }
        if(die[i]==-1) root=i;
    }
    dfs(root,0);
    int ans=0;
    while(m--){
        int x;cin>>x;
        if(find(x)==root){
            if(m>0) cout<<ans<<endl;
            else cout<<ans;
        }
        else{
            //找到最近的
            int pos=x,cnt=0;
            hh=max(hh,dep[pos]);
            while(find(pos)!=root){
                merge(pos,root);
                pos=die[pos];
            }
            ans=2*siz[root]-2-hh;
            if(m>0) cout<<ans<<endl;
            else cout<<ans;
        }
    }
}

4.线段树:PTA | 程序设计类实验辅助教学平台

PTA目前唯一一道做到的权值线段树,配合上堆模拟即可,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
struct node{
    int ln,rn,sum;
}tr[2001000];
stack<int> S;
int n;
void build(int l,int r,int root){
    tr[root].ln=l;tr[root].rn=r;tr[root].sum=0;
    if(l==r) return;
    int mid=(l+r)/2;
    build(l,mid,root<<1);
    build(mid+1,r,root<<1|1);
}
int query(int val,int root){
    int l=tr[root].ln,r=tr[root].rn;
    int mid =l+r>>1;
    if(l==r) return l;int ans;
    if(tr[root<<1].sum>=val) ans=query(val,root<<1);
    else ans=query(val-tr[root<<1].sum,root<<1|1);
    return ans;
}
void update(int pos,int val,int root){
    int l=tr[root].ln;int r=tr[root].rn;
    if(l==r){
        tr[root].sum+=val;return;
    }
    int mid=l+r>>1;
    if(pos<=mid) update(pos,val,root<<1);
    else update(pos,val,root<<1|1);
    tr[root].sum=tr[root<<1].sum+tr[root<<1|1].sum;
}
int main(){
    cin>>n;
    build(1,1e5+10,1);
    while(n--){
        string tmp;cin>>tmp;
        if(tmp=="Push"){
             int val;
             scanf("%d",&val);
             S.push(val);
             update(val,1,1);
         }
       else if(tmp=="PeekMedian"){
            if(S.size()==0) printf("Invalid\n");
            else{
                int k=(S.size()+1)/2;
                printf("%d\n",query(k,1));
             }
         }
         else if(tmp=="Pop"){
             if(S.size()==0) printf("Invalid\n");
             else{
                 int val=S.top();
                 S.pop();
                 printf("%d\n",val);
                 update(val,-1,1);
             }
         }
    }
}

5.并查集:PTA | 程序设计类实验辅助教学平台

我们对每一个爱好开一个vcetor,存有这个爱好的人,然后遍历vector进行合并即可,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int fa[200010],n;
int siz[200010];
vector<int> like[1001];
int find(int x){
    if(x==fa[x]) return x;
    return find(fa[x]);
}
void merge(int u,int v){
    if(find(u)==find(v)) return;
    siz[find(v)]+=siz[find(u)];
    fa[find(u)]=find(v);
}
int change(string s){
    int num=0;
    for(int i=0;i<s.size()-1;i++){
        num=10*num+s[i]-'0';
    }
    return num;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=n;i++) siz[i]=1;
    for(int i=1;i<=n;i++){
        string s;cin>>s;
        int k;k=change(s);int w;
        for(int j=1;j<=k;j++){
            cin>>w;like[w].push_back(i);
        }
    }
    for(int i=1;i<=1000;i++){
        for(int j=1;j<like[i].size();j++){
            merge(like[i][j],like[i][j-1]);
        }
    }
    vector<int> ans;int cnt=0;
    for(int i=1;i<=n;i++){
        if(fa[i]==i){
            cnt++;ans.push_back(siz[i]);
        }
    }
    int www=ans.size();
    sort(ans.begin(),ans.end());
    cout<<cnt<<endl;
    for(int i=ans.size()-1;i>=1;i--) cout<<ans[i]<<" ";
    cout<<ans[0];
}

6.拓扑排序:PTA | 程序设计类实验辅助教学平台

一道比较好的拓扑排序好题,我们按照字典序关系建好图再拓扑一下即可,这里有一个比较有意思的trick是他用优先队列,保证了字典序,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int cnt,head[100010],ver[200010],nxt[200010];
void add(int u,int v){
    ver[++cnt]=v;
    nxt[cnt]=head[u];
    head[u]=cnt;
}
unordered_map<string,int> ID;
unordered_map<int,string> findbyID;
int n,strtot;
int ind[200010];
typedef pair<string,int> node;
vector<string> ans;
int main(){
    cin>>n;
    for(int i=0;i<=100000;i++) head[i]=-1;
    vector<string> pre,now;
    for(int i=1;i<=n;i++){
        string str;cin>>str;
        for(int p=0;p<str.size();p++){
            string nows;
            while(p<str.size()&&str[p]!='.') nows+=str[p++];
            if(ID[nows]==0){
                ID[nows] = ++strtot;
                findbyID[strtot] = nows;
            }
            now.push_back(nows);
        }
        if(pre.size()==now.size()){
            int p=0;
            while(pre[p]==now[p]) p++;
            add(ID[pre[p]],ID[now[p]]);
            ind[ID[now[p]]]++;
        }
        pre.swap(now);
        now.clear();
    }
    priority_queue<node, vector<node>, greater<node>> q;
    for(auto& [str, id] : ID) {
        if(!ind[id]) q.emplace(str, id);
    }
    while(!q.empty()){
        ans.push_back(q.top().first);
        int u=q.top().second;q.pop();
        for(int i=head[u];i!=-1;i=nxt[i]){
            int v=ver[i];
            ind[v]--;
            if(!ind[v]) q.push({findbyID[v],v});
        }
    }
    cout<<ans[0];
    for(int i=1;i<ans.size();i++) cout<<"."<<ans[i];
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2025Github介绍与注册(有图片讲解,保姆级)

为什么要注册Github账号 利于团队协作&#xff0c;特别是打比赛的队友 版本控制强大&#xff0c;代码安全 开源项目多&#xff0c;方便个人模仿或抄袭 方便托管&#xff0c;形成自动化工具链 教育福利&#xff0c;教育参与者暂时免费 讲解完了优势&#xff0c;下面讲注册 Gith…

RUI电视桌面中文版:下载安装教程及桌面固件包获取全攻略

在智能电视的使用过程中&#xff0c;一款出色的桌面系统能极大提升用户体验&#xff0c;RUI电视桌面中文版就是这样一个不错的选择。下面为大家详细介绍RUI电视桌面中文版的下载安装教程以及桌面固件包的获取方法。 一、桌面固件包获取 首先是获取桌面固件包。可以通过RUI官方…

OpenAI 34页最佳构建Agent实践

penAI发布O4&#xff0c;也发布34页最佳构建Agent实践&#xff0c;值得阅读。 什么是Agent&#xff1f; 传统软件使用户能够简化和自动化工作流程&#xff0c;而代理能够以高度独立的方式代表用户执行相同的工作流程。 代理是能够独立地代表您完成任务的系统。 工作流程是必…

HOOPS Exchange 与HOOPS Communicator集成:打造工业3D可视化新标杆!

一、概述 在工业3D开发、BIM建筑、数字孪生和仿真分析等高端应用场景中&#xff0c;数据格式复杂、模型体量庞大、实时交互体验要求高&#xff0c;一直是困扰开发者的难题。Tech Soft 3D旗下的HOOPS Exchange和HOOPS Communicator&#xff0c;正是解决这类问题的黄金搭档。二者…

C#进阶学习(六)单向链表和双向链表,循环链表(下)循环链表

目录 &#x1f4ca; 链表三剑客&#xff1a;特性全景对比表 一、循环链表节点类 二、循环链表的整体设计框架 三、循环列表中的重要方法&#xff1a; &#xff08;1&#xff09;头插法&#xff0c;在头结点前面插入新的节点 &#xff08;2&#xff09;尾插法实现插入元素…

Unity使用Newtonsoft.Json本地化存档

我是标题 1.依赖包2.原理&#xff1a;3.代码4.可用优化5.数据加密 1.依赖包 Newtonsoft请在PacakgeManager处下载。 参考&#xff1a;打工人小棋 2.原理&#xff1a; 把要存储的对象数据等使用JsonConvert.SerializeObject(object T)进行序列化为字符串&#xff0c;并且通过…

2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(六级)真题

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;六级&#xff09; 分数&#xff1a;100 题数&#xff1a;38 答案解析&#xff1a;https://blog.csdn.net/qq_33897084/article/details/147341458 一、单选题(共25题&#xff0c;共50分) 1. 在tkinter的…

Python 浮点数运算之谜:深入解析round(0.675, 2)等输出异常

一、问题背景&#xff1a;当浮点数运算遇见 “反直觉” 结果 在 Python 开发中&#xff0c;以下代码输出常让开发者困惑&#xff1a; print(round(0.675, 2)) # 预期0.67&#xff0c;实际0.68||预期0.68&#xff0c;实际0.67 print(0.1 0.2) # 预期0.3&…

【C#】Html转Pdf,Spire和iTextSharp结合,.net framework 4.8

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01;&#…

极狐GitLab 注册限制如何设置?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 注册限制 (BASIC SELF) 您可以对注册实施以下限制&#xff1a; 禁用新注册。新注册需要管理员批准。需要用户电子邮件确认。…

利用大模型实现地理领域文档中英文自动化翻译

一、 背景描述 在跨国性企业日常经营过程中&#xff0c;经常会遇到专业性较强的文档翻译的需求&#xff0c;例如法律文书、商务合同、技术文档等&#xff1b;以往遇到此类场景&#xff0c;企业内部往往需要指派专人投入数小时甚至数天来整理和翻译&#xff0c;效率低下&#x…

SGFormer:卫星-地面融合 3D 语义场景补全

论文介绍 题目&#xff1a;SGFormer: Satellite-Ground Fusion for 3D Semantic Scene Completion 会议&#xff1a;IEEE / CVF Computer Vision and Pattern Recognition Conference 论文&#xff1a;https://www.arxiv.org/abs/2503.16825 代码&#xff1a;https://githu…

Trinity三位一体开源程序是可解释的 AI 分析工具和 3D 可视化

一、软件介绍 文末提供源码和程序下载学习 Trinity三位一体开源程序是可解释的 AI 分析工具和 3D 可视化。Trinity 提供性能分析和 XAI 工具&#xff0c;非常适合深度学习系统或其他执行复杂分类或解码的模型。 二、软件作用和特征 Trinity 通过结合具有超维感知能力的不同交…

城市街拍暗色电影胶片风格Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍 城市街拍暗色电影胶片风格 Lr 调色&#xff0c;是借助 Adobe Lightroom 软件&#xff0c;为城市街拍的人像或场景照片赋予独特视觉风格的后期处理方式。旨在模拟电影胶片质感&#xff0c;营造出充满故事感与艺术感的暗色氛围&#xff0c;让照片仿佛截取于某部充满张力…

加密和解密(大语言模型)

看到很多对matlab的p文件加密方案感兴趣的。网络上技术资料比较少&#xff0c;所以&#xff0c;我让大语言模型提供一些概论性质的东西&#xff0c;转发出来自娱自乐。期望了解p文件加密的复杂度&#xff0c;而不是一定要尝试挑战加密算法。 但根据大语言模型提供的材料&#…

双轮驱动能源革命:能源互联网与分布式能源赋能工厂能效跃迁

在全球能源结构深度转型与“双碳”目标的双重驱动下&#xff0c;工厂作为能源消耗的主力军&#xff0c;正站在节能变革的关键节点。能源互联网与分布式能源技术的融合发展&#xff0c;为工厂节能开辟了全新路径。塔能科技凭借前沿技术与创新实践&#xff0c;深度探索能源协同优…

React 更新 state 中的数组

更新 state 中的数组 数组是另外一种可以存储在 state 中的 JavaScript 对象&#xff0c;它虽然是可变的&#xff0c;但是却应该被视为不可变。同对象一样&#xff0c;当你想要更新存储于 state 中的数组时&#xff0c;你需要创建一个新的数组&#xff08;或者创建一份已有数组…

ubantu18.04HDFS编程实践(Hadoop3.1.3)

说明&#xff1a;本文图片较多&#xff0c;耐心等待加载。&#xff08;建议用电脑&#xff09; 注意所有打开的文件都要记得保存。 第一步&#xff1a;准备工作 本文是在之前Hadoop搭建完集群环境后继续进行的&#xff0c;因此需要读者完成我之前教程的所有操作。 第二步&am…

MySQL快速入门篇---库的操作

目录 一、创建数据库 1.语法 2.示例 二、查看数据库 1.语法 三、字符集编码和校验&#xff08;排序&#xff09;规则 1.查看数据库支持的字符集编码 2.查看数据库支持的排序规则 3.查看系统默认字符集和排序规则 3.1.查看系统默认字符集 3.2.查看系统默认排序规则 ​…

【已更新完毕】2025华中杯B题数学建模网络挑战赛思路代码文章教学:校园共享单车的调度与维护问题

完整内容请看文末最后的推广群 构建校园共享单车的调度与维护问题 摘要 共享单车作为一种便捷、环保的短途出行工具&#xff0c;近年来在高校校园内得到了广泛应用。然而&#xff0c;共享单车的运营也面临一些挑战。某高校引入共享单车后&#xff0c;委托学生对运营情况进行调…