2024.9.28 模拟赛 CSP6

news/2024/10/10 16:59:02/文章来源:https://www.cnblogs.com/ppllxx-9G/p/18448826

模拟赛

\(log\)\(log\) 不如三 \(log\)

T1 一般图最小匹配

简单 dp,水。\(O(n^2)\)

其实也是可反悔贪心的板子,可以 \(O(n\log(n))\) 做。

考虑排序后求差分数组,就变成不能选相邻的。然后就是可反悔贪心板子。

用双向链表(记录前驱后继)维护,然后放进堆里。

dp
#include<bits/stdc++.h>
using namespace std;
#define ab(x) ((x>=0)?(x):(-x))
#define mi(x,y) ((x>y)?(y):(x))
#define LL long long
const int N = 5005;
int n,m;
LL f[2][N][2],a[N];int main()
{freopen("match.in","r",stdin);freopen("match.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%lld",&a[i]);sort(a+1,a+1+n);memset(f,0x3f,sizeof(f));f[0][1][1]=ab(a[2]-a[1]); f[0][0][0]=0;for(int i=3;i<=n;i++){f[i&1][0][0]=0;for(int j=1;j<=i>>1;j++){f[i&1][j][1]=f[(i-1)&1][j-1][0]+ab(a[i]-a[i-1]);f[i&1][j][0]=mi(f[(i-1)&1][j][0],f[(i-1)&1][j][1]);}}printf("%lld\n",mi(f[n&1][m][0],f[n&1][m][1]));return 0;
}
贪心
#include<bits/stdc++.h>
using namespace std;
const int N = 5e3+5;
int n,m,pre[N],nxt[N];
long long ans,b[N],a[N];
struct A
{int id; long long d;bool operator < (const A &x) const{return d>x.d;}
};
bool vs[N];
priority_queue<A> q;
int main()
{freopen("match.in","r",stdin);freopen("match.out","w",stdout);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%lld",&a[i]);sort(a+1,a+1+n);for(int i=1;i<n;i++) b[i]=a[i+1]-a[i],q.push({i,b[i]}),pre[i]=i-1,nxt[i]=i+1;b[0]=b[n]=1e9;while(m){while(vs[q.top().id]) q.pop();int u=q.top().id; long long d=q.top().d; q.pop();m--; vs[pre[u]]=vs[nxt[u]]=1; b[u]=b[pre[u]]+b[nxt[u]]-b[u];q.push({u,b[u]});pre[u]=pre[pre[u]],nxt[u]=nxt[nxt[u]],nxt[pre[u]]=u,pre[nxt[u]]=u;ans+=d;}printf("%lld\n",ans);return 0;
}

T2 重定向

大力分讨,不停贪心。

细节处理挂 \(30 pts\)

code
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int n,T;
int l,cnt,ans[N],a[N],tot;
bool vs[N];int main()
{freopen("repeat.in","r",stdin);freopen("repeat.out","w",stdout);scanf("%d",&T);while(T--){cnt=tot=0;set<int> h,p;memset(vs,0,sizeof(vs));scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]); vs[a[i]]=1; if(a[i]!=0) h.insert(a[i]);}p.insert(100000000);for(int i=1;i<=n;i++) if(!vs[i]) p.insert(i);bool fl=0; int _1=0;for(int i=1;i<=n;i++){if(a[i]!=0&&a[i]==_1) continue;if(a[i]!=0) h.erase(a[i]);if(i+1<=n&&fl==0){if(a[i]==0){if(a[i+1]!=0){if(!_1&&!h.empty()&&(*h.begin()<a[i+1])&&(*h.begin()<*p.begin())){_1=(*h.begin());ans[++tot]=_1;fl=1; continue;}	else if(a[i+1]<*p.begin()){fl=1; continue;}					else{ans[++tot]=*p.begin(); p.erase(p.begin()); continue;}}else {if(!_1&&!h.empty()&&*p.begin()>*h.begin()){_1=(*h.begin());ans[++tot]=_1;fl=1; continue;							}else{ans[++tot]=*p.begin(); p.erase(p.begin()); continue;}}}else{if(a[i+1]!=0&&a[i+1]<a[i]) {p.insert(a[i]);fl=1; continue;}else if(a[i+1]==0&&*p.begin()<a[i]){p.insert(a[i]);fl=1; continue;}else{ans[++tot]=a[i]; continue;}			}}else if(fl==0){continue;}else{if(a[i]==0) ans[++tot]=*p.begin(), p.erase(p.begin());else ans[++tot]=a[i];}}for(int i=1;i<=tot;i++) printf("%d ",ans[i]); putchar('\n');}return 0;
}

T3 斯坦纳树

转化题意,发现如果有重边那就是不合法的,考虑什么时候会有重边。

加入的点会形成一个最小连通块,这就是我们要判断的区域。

我们可以将所有点分成三类:

  1. 已经加入的。

  2. 未被加入但在连通块中的。

  3. 不在连通块中的。

考虑一个不在连通块中的点想接入连通块,那么一定会与连通块有一个交点。

假如上图中三号点想加入连通块,那么这个交点就是二号点。

如果二号点已经被加入的话,那么三号点不会造成影响,否则一定会有重边。

所以我们就是想找到这个交点并判断它是否加入。

赛时唐氏做法,线段树维护并查集,每次区间推平维护连通块,单点查询是否是交点,是否选过。

好处就是信息全在线段树里,复杂度能多一个 \(log\) 和大常熟。

最后 \(O(qlog^3(n))\) 的复杂度(很松很松)过了(\(O(qlog(n))\)\(O(qlog^2(n))\) 没过)。

code
#include<bits/stdc++.h>
using namespace std;
const int N =3e5+5;
int n,a[N];
int head[N],tot,xx[N],yy[N],zz[N];
struct E {int u,v,w;} e[N<<1];
inline void add(int u,int v,int w) {e[++tot]={head[u],v,w}; head[u]=tot;}
bool fl=1;
int b[N];
inline int find(int x) {return x==b[x]?(x):(b[x]=find(b[x]));}
int sz[N],fa[N][30],dis[N],son[N],dfn[N],dep[N],rk[N],top[N],cnt;void dfs1(int u,int f)
{sz[u]=1; fa[u][0]=f; son[u]=-1; dep[u]=dep[f]+1;for(int i=1;i<=20;i++) fa[u][i]=fa[fa[u][i-1]][i-1];for(int i=head[u];i;i=e[i].u){int v=e[i].v; if(v==f) continue; dis[v]=dis[u]+e[i].w;dfs1(v,u); sz[u]+=sz[v];if(son[u]==-1||sz[son[u]]<sz[v]) son[u]=v;}
}
void dfs2(int u,int t)
{top[u]=t; dfn[u]=++cnt; rk[cnt]=u;// printf("%d %d\n",u,dfn[u]);if(son[u]==-1) return ;dfs2(son[u],t);for(int i=head[u];i;i=e[i].u){int v=e[i].v; if(v==fa[u][0]||v==son[u]) continue;dfs2(v,v);}
}
namespace SEG
{struct T{int l,r,cnt; bool xu,yo,za,lz;} tr[N<<2];inline void pushup(int k) {tr[k].cnt=tr[k<<1].cnt+tr[k<<1|1].cnt;}inline void pushdown(int k){if(tr[k].lz){tr[k].lz=0;tr[k<<1].lz=1; tr[k<<1].za=1;tr[k<<1|1].lz=1; tr[k<<1|1].za=1;}}void bui(int k,int l,int r){tr[k].l=l; tr[k].r=r;if(l>=r) return ; int mid=l+r>>1;bui(k<<1,l,mid); bui(k<<1|1,mid+1,r);}void mdf(int k,int p,int tp){if(tr[k].l==tr[k].r){if(tp==0)//yo{if(!tr[k].yo){tr[k].cnt-=tr[k].xu; tr[k].yo=1;} 				}else//xu{if(!tr[k].xu&&!tr[k].yo){tr[k].cnt++; tr[k].xu=1;// printf("*****\n");} 					}return;}pushdown(k);int mid=tr[k].l+tr[k].r>>1;if(p<=mid) mdf(k<<1,p,tp);else mdf(k<<1|1,p,tp);pushup(k);}void qmdf(int k,int L,int R){if(tr[k].l>=L&&tr[k].r<=R){tr[k].za=1; tr[k].lz=1; return;}pushdown(k);int mid=tr[k].l+tr[k].r>>1;if(L<=mid) qmdf(k<<1,L,R);if(R>mid) qmdf(k<<1|1,L,R);pushup(k);}bool que(int k,int p){if(tr[k].l==tr[k].r) return tr[k].za;pushdown(k);int mid=tr[k].l+tr[k].r>>1;if(p<=mid) return que(k<<1,p);else return que(k<<1|1,p);}
} using namespace SEG;void mdfpath(int x,int y)
{while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);qmdf(1,dfn[top[x]],dfn[x]);x=fa[top[x]][0];}if(dfn[x]>dfn[y]) swap(x,y);qmdf(1,dfn[x],dfn[y]);return;
}void change(int x)
{int tmp=x;mdf(1,dfn[x],0);if(que(1,dfn[x])) return;for(int i=20;i>=0;i--){if(!fa[x][i]) continue;if(que(1,dfn[fa[x][i]])) continue;else x=fa[x][i];}mdf(1,dfn[fa[x][0]],1);mdfpath(fa[x][0],tmp);
}int main()
{freopen("tree.in","r",stdin);freopen("tree.out","w",stdout);scanf("%d",&n);for(int i=1;i<=n;i++) b[i]=i;for(int i=1;i<n;i++){int x,y,z; scanf("%d%d%d",&x,&y,&z);x=find(x); y=find(y);if(z==0) b[x]=y; xx[i]=x; yy[i]=y; zz[i]=z;}for(int i=1;i<n;i++){if(zz[i]!=0) {int x=find(xx[i]),y=find(yy[i]);add(x,y,zz[i]); add(y,x,zz[i]);}}for(int i=1;i<=n;i++) scanf("%d",&a[i]);dfs1(find(a[1]),0);dfs2(find(a[1]),find(a[1]));bui(1,1,n);int v=dfn[find(a[1])];mdf(1,v,0); qmdf(1,v,v); printf("1");for(int i=2;i<=n;i++){v=find(a[i]); change(v);if(tr[1].cnt==0) printf("1");else printf("0");}return 0;
}

T4 直径

咕咕咕

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

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

相关文章

kms激活Windows

安装KMS服务个人是在软路由系统中安装的,安装请另外寻找服务器安装KMS教程 使用命令行进行激活 1.卸载当前激活的秘钥(管理员启动命令行) slmgr /upk2.安装新的秘钥 秘钥在KMS软件的日志中,自行寻找 slmgr /ipk XXXX-XXXX-XXXXXX3.设置KMS服务器地址 可以输入内网地址 slmgr /s…

hadoop伪分布式模式

1.下载,上传,解压,配置环境变量2.修改配置文件 2.1 HDFS core-site.xml <configuration><property><name>fs.defaultFS</name><value>hdfs://localhost:9000</value></property> </configuration>2.2 NameNode hdfs-site.x…

OKR与多维度绩效指标评估体系融合,有效提升员工执行

客户背景 在医药行业这个高度竞争且快速变化的领域,企业不仅需要关注短期的财务表现,更需具备长远的战略眼光和持续的创新能力。某药企为了更好地应对市场挑战,提升组织效能,决定将OKR体系与多维度绩效指标评估体系相融合,实现更加精准、全面的绩效管理。 业务痛点战略与执…

idea 使用日常问题 使用maven插件 打包没问题 但是使用 mvn命令打包失败的问题解决

由于本人环境为内网环境 maven中央仓库 无法访问 使用idea的maven插件 进行打包可以打包如上图 是可以的 但是 使用mvn命令打包 失败 mvn clean package -Dmaven.test.skip=true -DsendCredentialsOverHttp=true -DbuildVersion=yxk1010test 原因是 setting文件 配置有问题 使用…

智慧园区平台项目建设方案

随着信息技术的飞速发展,智慧园区作为智慧城市的重要组成部分,正逐渐成为推动城市可持续发展的关键力量。本文旨在探讨智慧园区平台项目的建设内容,以期为相关领域的专家学者和决策者提供参考。1. 智慧园区的定义与重要性智慧园区是指运用物联网、云计算、大数据、人工智能等…

mysql数据库--行级锁,间隙锁和临键锁详解

转载链接地址:MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁) 介绍 行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。 应用在InnoDB存储引擎中。InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录…

【土地智慧】解码土地利用的基本方针

在我们脚下的这片土地上,每一寸都蕴藏着发展的潜力与挑战。如何合理、高效、可持续地利用这片宝贵的资源,成为了时代赋予我们的重大课题。今天,我们就来深入浅出地探讨一下“土地利用的基本方针”,为你揭示土地管理的智慧密码。开篇引言:土地,生命之基土地,既是万物生长…

.Net微信服务商平台ApiV3接口

转载:https://www.cnblogs.com/xilen/p/15380183.html 开始 在开始之前建议仔细读微信官方文档,接口规则及api文档 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay-1.shtml https://pay.weixin.qq.com/wiki/doc/apiv3_partner/index.shtml 目录 整个…

VMware vCenter Server 8.0U3c 发布下载,修复 U3b 更新停止响应的问题

VMware vCenter Server 8.0U3c 发布下载,修复 U3b 更新停止响应的问题VMware vCenter Server 8.0U3c 发布下载 - 集中式管理 vSphere 环境 Server Management Software | vCenter 请访问原文链接:https://sysin.org/blog/vmware-vcenter-8-u3/ 查看最新版。原创作品,转载请保…

vue插件-less、less-loader样式管理

说明:有的项目采用的是less样式,浏览器不识别less样式,需要通过less、less-loader【安装5版本的】对less进行处理,把less样式变为css样式,浏览器才可以识别。另外引入的版本不宜过高,否则也会出现莫名奇妙的错误。安装命令如下: cnpm install --save less less-loader@5…

解决找不到文件端口问题

1.出现此问题是找不到该路径2.找到start.sh文件此为docker中访问网址路径3.找到conf文件夹下的nginx.conf文件并编辑 找到这个位置将root路径改为 root /xh/web;

字符编码发展史6 — BOM字节序标记

上一篇《字符编码发展史5 — UTF-16和UTF-32》我们讲解了UTF-16和UTF-32编码。本篇我们将继续讲解字符编码中的字节序标记(BOM)。 2.3. 第三个阶段 国际化 2.3.2. Unicode的编码方式 2.3.2.5. BOM 1. 什么是BOM? BOM是Byte Order Mark的缩写,翻译成中文是:字节序标记,主要用…