中国大学生程序设计竞赛(秦皇岛)正式赛东北大学秦皇岛分校(SMU Autumn 2024 Team Round 1)

news/2024/12/24 15:42:40/文章来源:https://www.cnblogs.com/Kescholar/p/18450322

中国大学生程序设计竞赛(秦皇岛)正式赛东北大学秦皇岛分校(SMU Autumn 2024 Team Round 1)

Problem A. 贵校是构造王国吗 I

思路

官方题解很清晰明了。

image

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define PII pair<int,int>
const int N=1e6+3;
void solve() {int n,k;cin>>n>>k;int dq=1;vector<PII>ans;set<PII>st;ans.push_back({1,1});st.insert({1,1});dq++;int ls=1;for (int i = 2; i <=n ; ++i) {ans.push_back({i,ls});st.insert({i,ls});dq++;ls++;ans.push_back({i,ls});st.insert({i,ls});dq++;}ans.push_back({1,n});st.insert({1,n});dq++;if(dq>k){for(auto [x,y]:ans){cout<<x<<' '<<y<<endl;}return ;}else{for (int i = 1; i <=n ; ++i) {for (int j = 1; j <=n ; ++j) {if(st.count({i,j})==0){ans.push_back({i,j});if(ans.size()==k){for(auto [x,y]:ans){cout<<x<<' '<<y<<endl;}return ;}}}}}}
signed main()
{ios::sync_with_stdio(false),cin.tie(0);int t=1;//  cin>>t;while(t--){solve();}return 0;
}

Problem D. 茶和咖啡

思路

和题解类似。不过我们是用线段树维护前缀最小的物品。

image

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define INF INT_MAX
#define N 200010
#define lc p<<1
#define rc p<<1|1
int n, w[N];
int a[N],b[N];
struct node{int l,r;PII mi;
}tr[N<<2],tr1[N<<2];
void push_up(int p){tr[p].mi=min(tr[lc].mi,tr[rc].mi);
}
void build(int p,int l,int r){tr[p]={l,r,{0,0}};if(l==r){tr[p]={l,r,{w[l]-b[l],l}};return;}int mid=(l+r)>>1;build(lc,l,mid);build(rc,mid+1,r);push_up(p);
}
void update(int p,int x,int k){if(tr[p].l==x and tr[p].r==x){tr[p].mi.first+=k;return;}int mid=tr[p].l+tr[p].r>>1;if(x<=mid)update(lc,x,k);if(x>mid)update(rc,x,k);push_up(p);
}
PII query(int p,int x,int y){if(x<=tr[p].l and tr[p].r<=y){return tr[p].mi;}int mid=tr[p].l+tr[p].r>>1;PII sum={INF,0};if(x<=mid){sum=min(sum, query(lc,x,y));}if(y>mid){sum=min( query(rc,x,y),sum);}return sum;
}void push_up1(int p){tr1[p].mi=min(tr1[lc].mi,tr1[rc].mi);
}
void build1(int p,int l,int r){tr1[p]={l,r,{0,0}};if(l==r){tr1[p]={l,r,{w[l]-b[l],l}};return;}int mid=(l+r)>>1;build1(lc,l,mid);build1(rc,mid+1,r);push_up1(p);
}
void update1(int p,int x,int k){if(tr1[p].l==x and tr1[p].r==x){tr1[p].mi.first+=k;return;}int mid=tr1[p].l+tr1[p].r>>1;if(x<=mid)update1(lc,x,k);if(x>mid)update1(rc,x,k);push_up1(p);
}
PII query1(int p,int x,int y){if(y==0)return {INF,0};if(x<=tr1[p].l and tr1[p].r<=y){return tr1[p].mi;}int mid=tr1[p].l+tr1[p].r>>1;PII sum={INT_MAX,0};if(x<=mid){sum=min(sum, query1(lc,x,y));}if(y>mid){sum=min( query1(rc,x,y),sum);}return sum;
}void solve(){int q;cin>>n>>q;for (int i = 1; i <=n ; ++i) {cin>>w[i];a[i]=b[i]=0;}build(1,1,n);for(int i=1;i<=q;i++){int x,y;cin>>x>>y;a[x]+=y;}b[n+1]=0;for(int i=n;i>=1;i--){b[i]=a[i]+b[i+1];}build1(1,1,n);int pos=n,s=0;int ans=0;for(int i=1;i<=n;i++){auto[mn,pp]=query1(1,1,pos);mn+=s;if(pos<n){auto[mn1,pp1]=query(1,pos+1,n);if(mn1<mn){mn=mn1;pp=pp1;}}if(pp<=pos){pos=pp-1;s=b[pp];} update(1,pp,INF);update1(1,pp,INF);ans+=mn;cout<<ans<<' ';}cout<<endl;
}signed main(){ios::sync_with_stdio(false);cin.tie(0);int T=1;cin>>T;while(T--){solve();}return 0;
}

Problem G. 最大路径

思路

懒得写了,题解写得很清楚,赞

image

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define PII pair<int,int>
const int N=1e6+3;
void solve() {int n,m;cin>>n>>m;int ans=0;vector<int>a(n),b(m);for (int i = 0; i <n ; ++i) {cin>>a[i];}for (int i = 0; i <m ; ++i) {cin>>b[i];}for (int i = 1; i <n ; ++i) {ans+=abs(a[i-1]-a[i]);}for (int i = 1; i <m ; ++i) {ans+=abs(b[i-1]-b[i]);}cout<<ans<<endl;}
signed main()
{ios::sync_with_stdio(false),cin.tie(0);int t=1;//  cin>>t;while(t--){solve();}return 0;
}

Problem J. 维克多词典

思路

子集 DP。

单词长度很小,可以考虑状压DP求答案。

\(dp_S\) 为为学习完 S 的集合长度的单词的最小天数,转移的时候枚举每个 S 的子集即可。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
#define int long long
#define double long double
#define LL __int128
#define PII pair<double,double>
#define PIC pair<int,char>
#define endl '\n'
typedef long long ll;
const int N = 1e4 + 10;
int a[100];
vector<int>q;
PII S[N];
vector<int>g[20];
void solve() {int n, w;cin >> n >> w;int t = 0;for (int i = 1; i <= n; i++) {int x;cin >> x;if (!a[x]) {t++;q.push_back(x);}a[x]++;}for(int i=0;i<(1<<t);i++){S[i]={1e9,1e9};g[__builtin_popcount(i)].push_back(i);}S[0]={0,0};for (int i = 0; i < t; ++i){for(auto j:g[i]){for(int k=0;k<t;k++){if ((j >> k & 1)==0) {PII x=S[j];if(a[q[k]]+x.second<=w){x.second+=a[q[k]];}else{x.first++;x.second=a[q[k]];}S[j^(1<<k)]=min(S[j^(1<<k)],x);}}}}cout<<S[(1<<t)-1].first+(S[(1<<t)-1].second>0)<<endl;}
signed main() {ios::sync_with_stdio(false);cin.tie(0);int t = 1;
//	cin>>t;while (t--) {solve();}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多校 A 层冲刺 NOIP2024 模拟赛 03

多校 A 层冲刺 NOIP2024 模拟赛 03 T1 五彩斑斓(colorful) 签到题 直接暴力枚举是 \(O(n^4)\) ,考虑使用 \(bitset\) 优化,对每个点开个 \(bitset\),预处理它所在一行它及它之前相同颜色的位置,这样就只用枚举另一个点所在列,时间复杂度为 \(O(n^3+\frac{n^4}{w})\)。 T…

在浏览器上访问媒体资源配置【文件上传】

1.根urls.py文件中 from django.contrib import admin from django.urls import path, include, re_path from django.views.static import serve from django.conf import settingsurlpatterns = [# path(admin/, admin.site.urls),path(api/shipper/, include(apps.shipper.u…

高级程序语言设计第二次作业

姓名:袁志华 班级:软件工程2班 学号:102400231 班级网址:https://edu.cnblogs.com/campus/fzu/2024C 作业网址:https://edu.cnblogs.com/campus/fzu/2024C/homework/13282 图片: 第一题: 第二题: 第三题: 第四题: 第五题: 第六题: 第七题: 第八题:程序清单: 3.1…

macOS Sequoia 15.0.1 (24A348) 正式版 ISO、IPSW、PKG 下载

macOS Sequoia 15.0.1 (24A348) 正式版 ISO、IPSW、PKG 下载macOS Sequoia 15.0.1 (24A348) 正式版 ISO、IPSW、PKG 下载 iPhone 镜像、Safari 浏览器重大更新和 Apple Intelligence 等众多全新功能令 Mac 使用体验再升级 请访问原文链接:https://sysin.org/blog/macOS-Sequoi…

人群聚集监测预警系统

人群聚集监测预警系统采用AI视频智能分析技术,人群聚集监测预警系统通过在工地、工厂等场所已经安装监控摄像头,人群聚集监测预警系统对人员聚集情况进行实时监测,当人群聚集过于密集时,系统将自动发出警报,人群聚集监测预警系统并通过人工智能算法对人员的状态进行识别和…

智能烟火识别预警软件

智能烟火识别预警软件采用人工智能技术,智能烟火识别预警软件在工厂、工地等场所利用已经安装的摄像头,智能烟火识别预警软件对场内的烟花爆竹进行实时监测。当场内出现烟花爆竹时,智能烟火识别预警软件将自动发出警报,并通过人工智能算法通知现场管理人员进行处理。智能烟…

脱岗监测预警系统

脱岗监测预警系统可以通过对工人的位置进行实时监测,脱岗监测预警系统识别是否存在脱岗行为,并及时发出警报。脱岗监测预警系统在工作过程中,如果工人离开其工作位置,脱岗监测预警系统会自动识别并发出警报,提醒管理人员采取措施防止事故的发生。脱岗监测预警系统可以通过…

非煤矿山电子封条系统部署方案

非煤矿山电子封条系统部署方案是基于Ai视频图像识别技术,非煤矿山电子封条系统部署方案通过人工智能算法在矿山设备上安装电子封条,监控矿山矿井出入井人员、人员变化及非煤矿山生产作业状态等状况,及时发现处理非煤矿山异常动态将自动发出警报,及时通知现场管理人员进行处…

加油站员工行为监测预警系统

加油站员工行为监测预警系统可以通过对加油站员工进行实时监控,加油站员工行为监测预警系统识别是否存在不规范行为,并及时发出警报。在卸油作业过程中,加油站员工行为监测预警系统监测员工灭火器的正确放置、静电释放操作规范等作业状态,及时发出警报,提醒工作人员采取措…

矿山电子封条系统

矿山电子封条系统通过在煤矿关键地点安装摄像机以及边缘智能分析终端,矿山电子封条系统实时监测分析煤矿生产作业状态和矿井出入井人员、人数变化等情况,矿山电子封条系统利用智能化视频识别等技术及时发现煤矿异常动态,全天候不间断自动推送报警信息。相比传统的安全监管手…

硬盘咔咔异响数据恢复

当硬盘发出咔咔异响时,这通常表明硬盘可能遇到了严重的问题,如读写头故障、硬盘盘片损坏、电机或主板故障等。此时,数据恢复成为了一个关键的问题。以下是一些建议的数据恢复步骤和注意事项: 一、立即停止使用 一旦发现硬盘发出咔咔异响,应立即停止使用,避免进一步损坏硬…