2025-11-03 NOIP 模拟赛1 赛后总结

news/2025/11/3 19:41:16/文章来源:https://www.cnblogs.com/AeeE5x/p/19188024

很显然,我今年被 AC 自动机做局了。

前言

先推销一下自己写的游记。

其实今年 ST3 的 AC 自动机做法非常显然,我甚至想出来了一半。但我最后跑去想 T4 了。

与 300+pts 失之交臂。

你们不觉得 Trie 树和 Fail 指针是一对苦命鸳鸯吗。

T1 弹钢琴

题意

给定长为 \(n\) 的序列 \(a\),根据 \(k\) 构造序列 \(b\)

  • \(b_1=a_1\)
  • \(a_{i-1}<a_i\),则 \(b_i=b_{i-1}+k\)
  • \(a_{i-1}>a_i\),则 \(b_i=b_{i-1}-k\)
  • 否则 \(b_i=b_{i-1}\)

定义 \(b\) 的权值为 \(\sum_{i=1}^{n}[a_i=b_i]\)。最大化权值,求出这个值和对应的 \(k\)

赛时

考察注意力的题目,然后秒了。

题解

不难发现我们把整个序列 \(a\) 都加上同一个数,两个答案都不会变。

所以为了方便,我们把整个序列全部减去 \(a_1\)

然后不难发现,位置 \(i\) 有贡献,当且仅当 \(b_i|a_i\),且 \(\frac{a_i}{b_i}\ge 0\)

所以开个 map 维护不同的 \(k\) 值的贡献,最后扫一遍就结束了。

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define infll 0x3f3f3f3f3f3f3f3f
using namespace std;int n;
long long a[1000010];
long long b[1000010];map<long long,int> mp;int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=2;i<=n;i++) a[i]-=a[1];a[1]=0;for(int i=2;i<=n;i++){if(a[i-1]<a[i]) b[i]=b[i-1]+1;else if(a[i-1]>a[i]) b[i]=b[i-1]-1;else b[i]=b[i-1];}int baseans=0;for(int i=1;i<=n;i++){if(b[i]==0) baseans+=(a[i]==0);else if(a[i]%b[i]==0&&a[i]/b[i]>=0) mp[a[i]/b[i]]++;}int nowmax=0,ind=0;for(auto it=mp.begin();it!=mp.end();it++) if(it->second>nowmax) nowmax=it->second,ind=it->first;cout<<nowmax+baseans<<"\n"<<ind<<"\n";return 0;
}

T2 选彩笔

题意

\(n\) 个三元组 \((R_i,G_i,B_i)\)

定义 \(\operatorname{diff}(i,j)=\max(|R_i-R_j|,|G_i-G_j|,|B_i-B_j|)\)。你需要从中选取 \(k\) 个三元组,最小化其中两两之间的最大 \(\operatorname{diff}\)

求出最小的 \(\operatorname{diff}\) 值。

赛时

第一眼以为是三维偏序。

但是注意到 \(0\le V\le 255\)

所以就简单了。

题解

把每个三元组看成三维空间中的一个点,那么 \(\operatorname{diff}\) 值就是把这些点都包含在内的正方体的最小棱长。

不难注意到这个东西可以二分,所以套个三维前缀和就行了。

时间复杂度 \(O(V^3\log V)\)

但是 aoao 存在把 \(\log\) 优化掉的解法,其实就是把我的二分换成双指针。因为这个优化没什么必要,也不会卡,所以这里就不说了。

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define infll 0x3f3f3f3f3f3f3f3f
using namespace std;int n,k;
struct node{int r,g,b;}a[100010];int cnt[257][257][257];bool chk(int md){for(int x=1;x+md<=256;x++){for(int y=1;y+md<=256;y++){for(int z=1;z+md<=256;z++){int w1=cnt[x+md][y+md][z+md];int w2=cnt[x-1][y+md][z+md]+cnt[x+md][y-1][z+md]+cnt[x+md][y+md][z-1];int w3=cnt[x-1][y-1][z+md]+cnt[x-1][y+md][z-1]+cnt[x+md][y-1][z-1];int w4=cnt[x-1][y-1][z-1];if(w1-w2+w3-w4>=k) return true;}}}return false;
}int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>k;for(int i=1;i<=n;i++) cin>>a[i].r>>a[i].g>>a[i].b;for(int i=1;i<=n;i++) cnt[a[i].r+1][a[i].g+1][a[i].b+1]++;for(int x=1;x<=256;x++) for(int y=1;y<=256;y++) for(int z=1;z<=256;z++) cnt[x][y][z]+=cnt[x][y][z-1];for(int x=1;x<=256;x++) for(int y=1;y<=256;y++) for(int z=1;z<=256;z++) cnt[x][y][z]+=cnt[x][y-1][z];for(int x=1;x<=256;x++) for(int y=1;y<=256;y++) for(int z=1;z<=256;z++) cnt[x][y][z]+=cnt[x-1][y][z];int l=0,r=256;while(l<r){int mid=(l+r)>>1;if(chk(mid)) r=mid;else l=mid+1;}cout<<l<<"\n";return 0;
}

T3 洪水拯救计划

题意

给定一棵 \(n\) 个点的树,其中有 \(k\) 个点存在标记。

对于每个点,求出从这个点出发,经过所有标记点后停下(不需要回到起点,可以重复经过同一条边)的最短路径长度。

赛时

写了五个 dfs 结果大洋里全红。

糖糖了,结果一问 aoao 发现存在非常简单的 \(O(n\log n)\) 的线段树解法。

题解

不难注意到答案由三部分组成:

  • 最小的把所有标记点都包括进去的极大连通子图内所有边权的两倍。
  • 起点到极大连通子图的路径长度的两倍。
  • 距离起点最远的标记点距离。

显然答案是前两部分加起来再减去第三部分。

前两个都好处理,最难的在第三部分。

不难注意到存在很简单的 \(O(n)\) 换根 DP 做法,但很显然我不会。

所以考虑 dfs 过程:

假设我们现在在结点 \(u\),正在一条 \(u\to v\),边权为 \(w\) 的边上,那么对于在 \(v\) 子树内的标记点,距离会减少 \(w\);对于其他的标记点,距离会增加 \(w\)

我们可以记录每个标记点的 \(\operatorname{dfn}\),操作就转化成了子树加。这部分可以使用线段树维护。

进入某个点时,查询一次全局最大值,就是这个点的第三部分答案。

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define infll 0x3f3f3f3f3f3f3f3f
using namespace std;class segmenttree{public:struct node{int l,r;long long val_max,lz_add;}t[800010];void pushup(int p){t[p].val_max=max(t[p<<1].val_max,t[p<<1|1].val_max);}void pushdown(int p){if(t[p].lz_add){t[p<<1].val_max+=t[p].lz_add;t[p<<1|1].val_max+=t[p].lz_add;t[p<<1].lz_add+=t[p].lz_add;t[p<<1|1].lz_add+=t[p].lz_add;t[p].lz_add=0;}}void build(int l,int r,long long *a,int *b,int p=1){t[p]={l,r,0,0};if(l==r) t[p].val_max=a[b[l]];else{int mid=(l+r)>>1;build(l,mid,a,b,p<<1);build(mid+1,r,a,b,p<<1|1);pushup(p);}}void modify(int l,int r,long long v,int p=1){if(l<=t[p].l&&t[p].r<=r){t[p].val_max+=v;t[p].lz_add+=v;}else{int mid=(t[p].l+t[p].r)>>1;pushdown(p);if(l<=mid) modify(l,r,v,p<<1);if(r>mid) modify(l,r,v,p<<1|1);pushup(p);}}long long query(int l,int r,int p=1){if(l<=t[p].l&&t[p].r<=r) return t[p].val_max;int mid=(t[p].l+t[p].r)>>1;pushdown(p);long long res=-infll;if(l<=mid) res=max(res,query(l,r,p<<1));if(r>mid) res=max(res,query(l,r,p<<1|1));return res;}
};
segmenttree segt;struct edge{int to,nxt;long long w;}e[400010];int head[200010],cnt=2;
inline void addedge(int x,int y,long long w){e[cnt]={y,head[x],w},head[x]=cnt++;}int n,k,tp;
bool hv[200010];int subsum[200010];
long long cyclesum;
void dfs1(int x,int fa){subsum[x]=hv[x];for(int i=head[x];i;i=e[i].nxt){int y=e[i].to;if(y==fa) continue;dfs1(y,x);if(subsum[y]) cyclesum+=e[i].w*2;subsum[x]+=subsum[y];}
}long long d1[200010];
bool vis[200010];
queue<int> q;
void bfs(){memset(d1,0x3f,sizeof d1);for(int i=1;i<=n;i++) if(subsum[i]) q.push(i),d1[i]=0,vis[i]=1;while(!q.empty()){int x=q.front();q.pop();for(int i=head[x];i;i=e[i].nxt){int y=e[i].to;if(vis[y]) continue;vis[y]=1;d1[y]=d1[x]+e[i].w;q.push(y);}}
}long long dep[200010];
int dfn[200010],siz[200010],rnk[200010],dfn_cnt,subt[200010];
void dfs2(int x,int fa){if(hv[x]){siz[x]=1;dfn[x]=++dfn_cnt;rnk[dfn_cnt]=x;}for(int i=head[x];i;i=e[i].nxt){int y=e[i].to;if(y==fa) continue;dep[y]=dep[x]+e[i].w;dfs2(y,x);siz[x]+=siz[y];}if(siz[x]) subt[x]=dfn_cnt-siz[x]+1;
}long long Ans[200010];
void dfs3(int x,int fa){Ans[x]=segt.query(1,k);for(int i=head[x];i;i=e[i].nxt){int y=e[i].to;if(y==fa) continue;if(subt[y]){if(subt[y]!=1) segt.modify(1,subt[y]-1,e[i].w);segt.modify(subt[y],subt[y]+siz[y]-1,-e[i].w);if(subt[y]+siz[y]-1!=k) segt.modify(subt[y]+siz[y],k,e[i].w);}else segt.modify(1,k,e[i].w);dfs3(y,x);if(subt[y]){if(subt[y]!=1) segt.modify(1,subt[y]-1,-e[i].w);segt.modify(subt[y],subt[y]+siz[y]-1,e[i].w);if(subt[y]+siz[y]-1!=k) segt.modify(subt[y]+siz[y],k,-e[i].w);}else segt.modify(1,k,-e[i].w);}
}int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>k;for(int i=1;i<n;i++){int x,y;cin>>x>>y;int w;cin>>w;addedge(x,y,w);addedge(y,x,w);}for(int i=1;i<=k;i++) cin>>tp,hv[tp]=1;dfs1(tp,0);bfs();dfs2(tp,0);segt.build(1,k,dep,rnk);dfs3(tp,0);for(int i=1;i<=n;i++) cout<<cyclesum+d1[i]*2-Ans[i]<<"\n";return 0;
}

总结

原本还打算补一下 T4 的,但补完 T3 实在没精力接着写 T4 了。

咕咕咕。

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

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

相关文章

flex:1 什么意思

flex: 1 是 Flexbox 布局中的一个非常常用的属性,它用于 让一个元素在容器中占据剩余的空间。具体来说,flex: 1 是 flex-grow, flex-shrink, 和 flex-basis 的简写。 解释 flex: 1 的含义:flex-grow: 1:元素将会扩…

以销定采是什么?为什么越来越重要?

我这几年一直在帮制造业企业做数字化项目,其中一个变化很明显——越来越多老板开始主动提“以销定采”这个词。 有趣的是,这个词很多人挂在嘴上, 但真要问一句: “你们现在是怎么以销定采的?” 十个里有八个会愣一…

2025年优质少儿编程机构揭秘:提供国家等级测评+优质的课程体系+一站式赛考服务!

据中国教育学会最新统计数据显示,2025年中国少儿编程学员规模突破500万人,同比增长20%,但调查显示,72%的家长在选择编程学习机构时面临“课程质量参差不齐”、“教师资质难辨”、“学员案例夸大”等核心痛点。数据…

Modbus协议功能码详解学习笔记

混吃等死,小富即安,飞黄腾达,是因为各有各的缘法,未必有高下之分。1️⃣ 核心思想:通信 = 数据交互 + 行为指令 在上一篇笔记里,我们知道了:通信的本质是数据交互 —— 设备之间要交换数据。但光有“数据”还不…

议论文素材分类整理

目录 I.「名人」分类(按时代顺序)古代专题 魏晋风度 专题 唐宋八大家近代史专题 革命先烈 专题 新文化运动现代史专题 专题 改革开放歪果仁II.「名言」分类古诗文 近现代 外国III.「tag」分类家国情怀(爱国)民族英…

使用WSL挂载U盘及SD卡外设的方案

使用WSL挂载U盘及SD卡外设的方案今天在学习linux驱动开发的时候,因为使用的是WSL,导致我的内存卡识别不到,无法烧录所用程序,下面是解决方案通过指令sudo mount -t drvfs F:\ ./mnt/f(SD卡格式为FAT32),可以将对…

ESP32 I2C通信

I2C简述 两线式串行总线(SDA和SCL),半双工通信方式(支持来回通信,但每次只能一方通过) 通用函数:Wire.begin() 作为主机加入 Wire.begin(27) 只有一个参数的是作为从机加入 主机向从机发送数据 befinTransmission()开…

day06-自动出题工作流

今日内容 1 自动出题工作流 # 1 需求分析-传统出题需教师手动筛选知识点、设计题型、斟酌难度,耗时且繁琐。自动出题工作流可依据预设的知识点大纲,快速从题库中匹配对应内容,生成不同题型的题目。例如,从高中生物…

推送docker镜像到github

最近在给新生赛出题,服务器没法直接在本地build镜像,学了下怎么推送到github上然后再拉取到服务器在本地的docker上build一个镜像 docker build -t image_name .把镜像标记为ghcr.io的格式 docker tag image_name:la…

软件工程学习日志2025.11.3

软件设计模式 - 建造者模式实战 • 实验来源:石家庄铁道大学信息学院实验5 • 实验类型:模仿型实验 • 核心目标:深入理解建造者模式的原理并掌握实际应用 🔍 建造者模式核心理解 模式动机 建造者模式的核心价值在…

day05-智能换脸-12306出行建议-提取音频工作流

今日内容 1 智能换脸1.1 目标 # 1 用户上传两张人像,把其中一张人脸换到另一个人脸上----》Coze工作流-工作流、智能体---》使用代码调用---》借助于api-python代码、java,go。。。。-postman调用-后期做成软件-app,…

x./AC自动机

前置::trie , kmp AC自动机 #include <bits/stdc++.h> using namespace std; typedef long long ll;const int MAXN = 2e5 + 5; // 模式串长度之和int tr[MAXN][26], fail[MAXN], tot = 0; int e[MAXN], sum[M…

P1029 [NOIP 2001 普及组] 最大公约数和最小公倍数问题

最大公约数(即 gcd)和最小公倍数(即 lcm)的求法。该题的关键点在于,两个数的积等于它们最大公约数和它们最小公倍数的积。公式表示为 \(a \times b = \text{gcd}(a,b) \times \text{lcm}(a,b)\)。设作为答案的两个…

SQL Server 并发控制 第四篇:Snapshot Isolation (SI) 和 Read Committed Snapshot Isolation (RCSI)

乐观控制模式假定阻塞很少,快照隔离通过使用行版本控制来避免大多数锁定和阻塞。当数据被修改时,受影响行的已提交版本会被复制到 tempdb 并赋予版本号,此操作称为写时复制 (Copy on Write),并用于所有的插入、更新…

godot 描边插件

1:https://github.com/Magodra/GlowBorderEffect 2: outline.gdshader 不支持半透明:shader_type spatial; render_mode unshaded;/*Normal/Depth outline shader. Apply to nodes as a next pass shader texture.In…

对递归两层含义的理解

对递归两层含义的理解目录背景知识Definition从堆栈的角度理解递归缺点和For循环的区别总结Reference背景知识 先了解一下内存结构,但这个不是必须的。Definition 递归是一个循环结构,主要用来处理需要循环执行的任务…

怎么在现有App里融入AI对话能力

怎么在现有App里融入AI对话能力在数字化交互日益重要的今天,用户对App的智能化期望越来越高。尤其是在社交、电商、客服等领域,AI对话能力不仅能显著提升用户体验,还能有效降低运营成本。 但对于大多数开发团队而言…

DFS 序 O(1) 求 LCA

抛弃欧拉序,拥抱DFN。更新日志 2025/11/03:开工。思路 查询 \((dfn_u,dfn_v]\) 最小深度的节点的父亲即可。读者自证不难。

@pytest.fixture和setup/teardown

一.定义fixture 定义:@pytest.fixture是 Pytest 中用于定义​​测试夹具(Fixture)​​的核心装饰器,其核心作用是​​为测试用例提供可复用的资源初始化、数据准备和清理逻辑​​ 二:代替setup 和 teardownsetup =…

矿山通信如何实现全域一体化?迈威为煤矿装上了“智慧神经网络”

矿山通信如何实现全域一体化?迈威为煤矿装上了“智慧神经网络”在刚刚落幕的第二十一届中国国际煤炭采矿技术展上,全球矿业的目光再次聚焦于一个核心议题:数字化转型如何真正在矿山落地。作为这一进程的“神经中枢”…