csp-s模拟6

news/2024/9/29 11:24:18

A. 一般图最小匹配

\(m\) 小于 \(\frac{n}{2}\) 所以对原数组排序后做差分,差分后的数不能选相邻的,设 \(f_{i,j,0/1}\) 表示前 \(i\) 个,选了 \(j\) 个,第 \(i\) 个选没选

直接 \(dp\) 求最小值就行

点击查看代码
#include<bits/stdc++.h>
const int maxn=5001;
using namespace std;
int n,m,a[maxn],d[maxn];
long long f[maxn][2501][2];int main()
{freopen("match.in","r",stdin);freopen("match.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+1+n);n--;for(int i=1;i<=n;i++)d[i]=a[i+1]-a[i];for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) f[i][j][0]=f[i][j][1]=1e15;f[1][1][1]=d[1],f[1][0][0]=0;for(int i=2;i<=n;i++){for(int j=0;j<=m;j++){f[i][j][0]=min(f[i][j][0],min(f[i-1][j][0],f[i-1][j][1]));if(j!=0)f[i][j][1]=min(f[i][j][1],f[i-1][j-1][0]+d[i]);
//			cout<<i<<" "<<j<<" "<<f[i][j][1]<<" "<<f[i][j][0]<<endl;}}cout<<min(f[n][m][0],f[n][m][1]);return 0;
}
/*
4 1
2 4 7 38 3
9 2 3 12 11 7 6 5
*/

B. 重定向

大型分讨,我思路是考虑 \(1\) 和第一个 \(0\),然后再向下细分是否考虑第一个使字典序变小的数,细节很多,5.8k代码,不建议观看

点击查看代码
#include<bits/stdc++.h>
#define int long long
const int maxn=1e6+10;
using namespace std;
int t,n,a[maxn],d[maxn],cnt,tem[maxn];
bool vis[maxn];signed main()
{
//	freopen("test.in","r",stdin);
//	freopen("ans.out","w",stdout);freopen("repeat.in","r",stdin);freopen("repeat.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>t;while(t--){int flag=0,flag2=0;cin>>n;fill(vis,vis+1+n,0);fill(d,d+1+n,0);for(int i=1;i<=n;i++){cin>>a[i];if(a[i]==0) flag2=1;vis[a[i]]=1;if(a[i]==1) flag=1;} if(!flag2){for(int i=1;i<=n;i++){if(a[i]>a[i+1]){a[i]=0;flag2=1;break;}}for(int i=1;i<=n-(flag2==0);i++)if(a[i]) cout<<a[i]<<" ";cout<<'\n';continue;}cnt=0;for(int i=1;i<=n;i++) if(!vis[i]) d[++cnt]=i;if(flag){
//			cout<<"!";for(int i=1;i<=n;i++){if(a[i]==1){flag=0;break;}if(a[i]==0)break;}if(flag){for(int i=1;a[i]!=0;i++){if(a[i]>d[1]||(a[i]>a[i+1]&&a[i+1])) {flag=0;break;}}if(flag){
//					cout<<"!";cnt=-1;for(int i=1;i<=n;i++) if(a[i]==1) a[i]=-1;d[0]=1;for(int i=1;i<=n;i++){if(a[i]==0) a[i]=d[++cnt];}for(int i=1;i<=n;i++){if(a[i]!=-1) cout<<a[i]<<" ";}cout<<'\n';	}else{
//					cout<<"!";int temp=0;for(int i=1;a[i]!=0;i++){if(a[i]>d[1]&&a[i]>d[0]||(a[i]>a[i+1]&&a[i+1])){
//							d[0]=a[i];tem[++temp]=i;
//							break;}}
//					cout<<temp<<endl;if(!temp){int s=0;for(int i=1;i<=n;i++)if(!a[i]) a[i]=-d[++s];for(int i=1;i<n;i++) if(abs(a[i])>abs(a[i+1])){d[0]=abs(a[i]);a[i]=0;sort(d,d+1+cnt);break;}int num=unique(d,d+1+cnt)-d-1;cnt=num;cnt=-1;if(!d[0])cnt++,a[n]=0;for(int i=1;i<=n;i++)if(a[i]<0) a[i]=d[++cnt];for(int i=1;i<=n;i++){if(a[i])cout<<a[i]<<" ";}cout<<'\n';}else{for(int i=1;i<=temp;i++)if(a[tem[i]]>a[tem[i]+1]){
//								cout<<tem[i]<<" "<<tem[i]+1<<endl;temp=tem[i];d[0]=a[tem[i]];break;}a[temp]=-1;sort(d,d+1+cnt);int num=unique(d,d+1+cnt)-d-1;cnt=num;cnt=-1;for(int i=1;i<=n;i++){if(a[i]==0) a[i]=d[++cnt];}for(int i=1;i<=n;i++){if(a[i]!=-1)cout<<a[i]<<" ";}cout<<'\n';	}}}else{
//				cout<<"!";int s=0;for(int i=1;i<=n;i++)if(!a[i]) a[i]=-d[++s];for(int i=1;i<n;i++) if(abs(a[i])>abs(a[i+1])){s=i;break;}int minn=1e9,sum=0; for(int i=1;i<=n;i++) if(a[i]<0) a[i]=0;for(int i=s+(s==0);i<=n;i++){if(a[i])minn=min(minn,a[i]);}while(!a[s])s++;for(int i=1;i<s;i++) {if(!a[i])sum++;if(minn<d[sum]) break;if(a[i]>minn){sum=0;break;}}
//				cout<<minn<<endl;if(minn<d[sum]&&a[1]==1){
//					cout<<"!";
//					cout<<sum<<endl;for(int i=1;i<=n;i++){if(a[i]==minn) {d[0]=a[i];a[i]=-1;sort(d,d+cnt+1);break;}}cnt=-1;for(int i=1;i<=n;i++){if(!a[i])a[i]=d[++cnt];}for(int i=1;i<=n;i++){if(a[i]!=-1)cout<<a[i]<<" ";}cout<<'\n';}else{int s=0;for(int i=1;i<=n;i++)if(!a[i]) a[i]=-d[++s];for(int i=1;i<n;i++) if(abs(a[i])>abs(a[i+1])){d[0]=abs(a[i]);a[i]=0;sort(d,d+1+cnt);break;}int num=unique(d,d+1+cnt)-d-1;cnt=num;cnt=-1;if(!d[0])cnt++,a[n]=0;for(int i=1;i<=n;i++)if(a[i]<0) a[i]=d[++cnt];for(int i=1;i<=n;i++){if(a[i])cout<<a[i]<<" ";}cout<<'\n';}}}else{
//			cout<<"!";int s=0;for(int i=1;i<=n;i++)if(!a[i]) a[i]=-d[++s];for(int i=1;i<n;i++) if(abs(a[i])>abs(a[i+1])){s=i;break;}int minn=1e9,sum=0; for(int i=1;i<=n;i++) if(a[i]<0) a[i]=0;for(int i=s+(s==0);i<=n;i++){if(a[i])minn=min(minn,a[i]);}while(!a[s])s++;for(int i=1;i<s;i++) {if(a[i]==minn) break;if(!a[i])sum++;if(minn<d[sum]) break;if(a[i]>d[sum+1]){sum=0;break;}}
//			cout<<minn<<" "<<sum<<endl;if(minn<d[sum]&&a[1]==0){
//				cout<<"!";for(int i=1;i<=n;i++){if(a[i]==minn) {d[0]=a[i];a[i]=-1;sort(d,d+cnt+1);break;}}cnt=-1;for(int i=1;i<=n;i++){if(!a[i])a[i]=d[++cnt];}for(int i=1;i<=n;i++){if(a[i]!=-1)cout<<a[i]<<" ";}cout<<'\n';}else{
//				cout<<"!";int s=0;for(int i=1;i<=n;i++)if(!a[i]) a[i]=-d[++s];for(int i=1;i<n;i++) if(abs(a[i])>abs(a[i+1])){d[0]=abs(a[i]);a[i]=0;sort(d,d+1+cnt);break;}int num=unique(d,d+1+cnt)-d-1;cnt=num;cnt=-1;if(!d[0])cnt++,a[n]=0;for(int i=1;i<=n;i++)if(a[i]<0) a[i]=d[++cnt];for(int i=1;i<=n;i++){if(a[i])cout<<a[i]<<" ";}cout<<'\n';}}}return 0;
}
/*
3
2
1 0 
2
0 1 
1
11
9 7 5 11 0 3 4 6 8 1 2   */

C. 斯坦纳树

牛牛方法错误当且仅当存在一个点不是关键点但他连了大于等于三个关键点的边,这样会导致有的边按牛牛方法求被重复算

倒着删点,如果这个点有大于等于三条边,那他就会导致做法错误,然后把与他相连的边删了,如果有一个之前被删的会导致

错误的点在这个点被删后不会导致错误了,就把他删去,答案为1但且仅当不存在这样被删去的会导致错误的点,边权为零的

用并查集维护连通块

点击查看代码
#include<bits/stdc++.h>
const int maxn=3e5+10;
using namespace std;
int n,head[maxn],nxt[maxn<<1],to[maxn<<1],tot,p[maxn],fa[maxn],size[maxn],in[maxn];
int x[maxn],y[maxn],z[maxn],cnt,sum,son[maxn],ans[maxn];
bool vis[maxn];
set<int>q[maxn]; 
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}void del(int x)
{	if(q[x].size()<=2&&!size[x]){sum--;int temp=0;for(auto i:q[x]) son[++temp]=i;q[x].clear();for(int i=1;i<=temp;i++){q[son[i]].erase(x);for(int j=i+1;j<=temp;j++){q[son[i]].insert(son[j]);q[son[j]].insert(son[i]);	}}for(int i=1;i<=temp;i++) del(son[i]);}
}int main()
{freopen("tree.in","r",stdin);freopen("tree.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<n;i++){int a,b,c;cin>>a>>b>>c;if(!c){a=find(a),b=find(b);if(a>b) swap(a,b);fa[b]=a;continue;}x[++cnt]=a,y[cnt]=b;}for(int i=1;i<n;i++) q[find(x[i])].insert(find(y[i])),q[find(y[i])].insert(find(x[i]));for(int i=1;i<=n;i++){cin>>p[i];p[i]=find(p[i]);size[p[i]]++;}for(int i=n;i>=1;i--){ans[i]=!sum;size[p[i]]--;if(!size[p[i]]) sum++,del(p[i]);}for(int i=1;i<=n;i++) cout<<ans[i];return 0;
}
/*
10
5 9 0
6 9 6
7 6 9
1 7 5
10 1 2
8 10 0
4 10 5
3 4 9
2 5 4
4 5 3 7 8 9 6 2 1 105
1 2 3
1 5 0
2 3 2
2 4 3
1 3 4 2 5
*/

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

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

相关文章

GaussDB数据库特性-物化视图简介

一、前言 随着企业数据量的不断增长和业务需求的复杂性增加,选择一个高效、可靠且智能的数据存储和管理解决方案变得越来越重要。GaussDB是一种先进的关系型数据库管理系统,为企业提供了强大的数据处理能力,其物化视图(Materialized Views)功能在数据查询和管理方面具有重…

微软账号注册

注册地址 https://signup.live.com/signup 少侠,我看你气度不凡天赋异禀,骨骼精奇,这么帅,来了就帮推荐一把吧 我的最近更新 最新发布文章、框架、咨询等,来看看吧

解决:PC微信弹窗《当前客户端版本过低,请前往应用商店升级到最新版本客户端后再登录》

目录1. 背景 2. 利用cheat Engine直接修改内存 3. 利用Python代码直接修改内存1. 背景虽然人类都是喜新厌旧的,但也不是什么东西都是新的好。今天换了台服务器,发现正常使用微信,弹窗提醒说版本太低了,根本不给登录。没办法啊,机器人只兼容这个版本的,只能到处找解决方案…

黑马PM-内容项目-需求收集管理

什么是需求需求如何收集 常见需求收集方式竞品分析用户访谈实地调研需求管理

浅浅记录学习情况叭

Basic Concepts对于一个给定的网络G=(V,E),其中V为网络的节点集,E为网络的边集. Trace(迹): 将G划分为q个社区,我们用一个qxq的对称矩阵e来表示该划分,e中的每个元素表示连接社区i与社区j的边在G的全部边中所占的比例显然有∑i,jeij=1。矩阵e的迹Tr(e)表示连接社区内部节点的边…

sentinel-transport-SPI-HeartbeatSenderInitFunc

说明 我们引入以下依赖<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId><version>1.8.6</version> </dependency>配置环境变量-Dcsp.sentinel.dashboard.server=loca…

这些年出版的书籍——归档整理

随着出版的书籍越来越多,收到的各种邮件也越来越频繁,遂于百忙之中,抽空整理一下书籍相关的资料和信息。《ASP.NET MVC企业级实战》出版日期:2017年3月目录:https://www.cnblogs.com/jiekzou/p/5625762.html随书源码:因某些原因,原百度云盘下载地址已被封,qq群文件里面…

黑马PM-内容项目-内容产品模型

内容产品概述内容产品设计模型