当前位置: 首页 > news >正文

2025-11-03 ZYZ28-NOIP模拟赛-Round1 hetao1733837的record

比赛链接:比赛详情 - ZYZ28-NOIP模拟赛-Round1 - ZYZOJ

比赛背景:

《四重奏》

指尖落在《piano》黑白键上,
生命本就是明暗交错的乐章。
我在晨光中调音,在暮色里弹奏,
等待一个能听懂所有沉默的知音。

世界是流动的《rgb》,
红是炽热的心跳,蓝是深沉的守望,绿是蔓延的希望。
我们都在自己的色谱里寻找坐标,
直到某天,你的光折射进我的波长。

那时才明白,所有的相遇都是《rescue》,
不是谁拯救谁,而是两颗星找到了正确的轨道。
在浩瀚宇宙里,我们互为方向,
每一次靠近,都是对孤独的温柔抵抗。

从此踏上共同的《path》,
不必问终点是花海还是荒野。
脚印重叠处,时间开出永恒的花,
而路,在每一步选择中无限延伸。

T1.piano

提交链接:ZYZOJ P5998 piano

原题链接:https://www.luogu.com.cn/problem/P7799

题面

小 Z 要学习弹钢琴了,但是他不太能找准音,所以他只能使用一种特殊技巧。这里有一段“音乐”,音乐的长度为n,里面的标准音由一段数字a[i]组成。小 Z 能准确地弹出第一个标准音 (然而也是老师教的),接下来他会确定好一个k值, 此后如果要弹的标准音比上一个标准音高(数值大),小 Z 就会将自己的音升高k;如果更低,会降低k;如果相同,就不变。
问小 Z 确定一个多大的非负数 ,能使他弹对的音最多,输出最多的个数,再输出k(有多个k值时输出最小的)。
预估难度:

样例

#input1:
5
1 2 0 3 1
#output1:
3
1#input2:
7 
2 1 -6 -2 1 6 10
#output2:
5
4

分析

怎么说呢?挺失败的。考场上想到了每个数增减k是一定的,用1和-1做前缀和,取众数即可。但也就是从这里跑偏了,把每个数钦定选上,然后做了O(n^{2}),本来预估可以拿50,结果由于某些神秘原因,过了大样例没过测试数据/(ㄒoㄒ)/~~

错误点

对于映射理解不到位。

正解

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1000005;
int n, a[N];
int sum[N];
map<int, int> mp;
signed main(){freopen("piano.in", "r", stdin);freopen("piano.out", "w", stdout);cin >> n;int base = 0;for (int i = 1; i <= n; i++){cin >> a[i];if (i == 1){sum[i] = 0;}else{if (a[i] > a[i - 1])sum[i] = sum[i - 1] + 1;if (a[i] < a[i - 1])sum[i] = sum[i - 1] - 1;if (a[i] == a[i - 1])sum[i] = sum[i - 1];}if (sum[i] == 0){if (a[i] == a[1])base++;}else{if ((a[i] - a[1]) % sum[i] == 0)mp[(a[i] - a[1]) / sum[i]]++;}}int ans = 0;int maxn = 0;for (auto tmp : mp){int k = tmp.first, cnt = tmp.second;if (cnt > maxn && k >= 0){maxn = cnt;ans = k;}}cout << base + maxn << '\n' << ans;
}

T2.rgb

提交链接:ZYZOJ P5999 rgb

原题链接:https://www.luogu.com.cn/problem/P6441

题面

小Z有N支彩笔,每支笔有R_{i},G_{i},B_{i}三个属性值。第i支笔和第j支笔的Difference值等于max(\left | R_{i}-R_{j} \right |,\left |G_{i}-G_{j}\right|,\left | B_{i}-B_{j}\right| ),而Colorfulness值等于所选笔中Difference值的最大值。

小Z需要从中选出K支笔使得Colorfulness值尽可能小,输出最小的Colorfulness的值。

难度预估:

样例

#input1:
2 2
1 3 2
2 6 4
#output1:
3
#input2:
5 3
6 6 4
6 2 7
3 1 3
4 1 5
6 2 6
#output2:
2

分析

首先确定这题的算法,思想及实现。

算法自然是二分答案——最大值最小。

思想——降维,三维RGB不好想,那我换成两维会好很多。

实现——三位前缀和。

这是什么样的逻辑关系呢?

首先,n和k都是1e5级别的,强制nlogn或者n\sqrt{n},但是r[i],g[i],b[i]都是小于等于255的,可以做n^{3},所以依次为主元,做枚举。

我们考虑降维,先求max(\left | R_{i}-R_{j} \right |,\left |G_{i}-G_{j}\right|),绝对值不好看,我们钦定R_{i}\geq R_{j},G_{i}\geq G_{j},即可去掉绝对值,得出:max(R_{i}-R_{j},G_{i}-G_{j})。那么,我们把R作为横轴,G作为纵轴,即可得出一个平面直角坐标系,我们只是用第一象限。将R_{i},R_{j},G_{i},G_{j}看作四个值,即有(R_{i},G_{i})(R_{j},G_{j})。使得以这两个点为右上端点和左下端点的矩形(可以证明是正方形,因为取max只有一个)中恰好包含K个输入的R和G(举行覆盖,二维前缀和+差分)。要使得“Colorfulness值尽可能小”,那么,此矩形最长边即为我们二分的对象。

扩展到RGB,就是三维前缀和+差分(容斥)。

OK,可以写代码了。

错误点

对代码能力不足,二分答案(查找的就是答案)理解不足,高维前缀和不熟练。

正解

#include <bits/stdc++.h>
using namespace std;
const int N = 100005, M = 260;
int n, K;
int vis[M][M][M];
int sum[M][M][M];
int mx;
int calc(int x, int y, int z, int d){int res = sum[x][y][z];res -= (sum[x - d - 1][y][z] + sum[x][y - d - 1][z] + sum[x][y][z - d - 1]);res -= sum[x - d - 1][y - d - 1][z - d - 1];res += (sum[x - d - 1][y - d - 1][z] + sum[x][y - d - 1][z - d - 1] + sum[x - d - 1][y][z - d - 1]);return res;
}
bool check(int x){for (int i = x + 1; i <= mx; i++){for (int j = x + 1; j <= mx; j++){for (int k = x + 1; k <= mx; k++){if (calc(i, j, k, x) >= K){return true;}}}}return false;
}
int main(){freopen("rgb.in", "r", stdin);freopen("rgb.out", "w", stdout);cin >> n >> K;for (int i = 1; i <= n; i++){int r, g, b;cin >> r >> g >> b;r++; //防越界g++; //防越界b++; //防越界sum[r][g][b]++;mx = max({mx, r, g, b});}for (int i = 1; i <= mx; i++){for (int j = 1; j <= mx; j++){for (int k = 1; k <= mx; k++){sum[i][j][k] += sum[i][j][k - 1];		}}}for (int i = 1; i <= mx; i++){for (int j = 1; j <= mx; j++){for (int k = 1; k <= mx; k++){sum[i][j][k] += sum[i][j - 1][k];		}}}for (int i = 1; i <= mx; i++){for (int j = 1; j <= mx; j++){for (int k = 1; k <= mx; k++){sum[i][j][k] += sum[i - 1][j][k];		}}}int l = 1, r = mx;int ans;while (l <= r){int mid = (l + r) >> 1;if (check(mid)){ans = mid;r = mid - 1; }else{l = mid + 1;}}cout << ans;
}

T3.rescue

提交链接:ZYZOJ P6000 rescue

原题链接:https://www.luogu.com.cn/problem/P6419

题面

A村泛洪水,小A要拯救村民。村庄分布形如一棵树,有n座房子通过n-1条边相连。小Z准备开卡车营救村庄,每条边有一个时间权值,有一个基地(小Z初始位于基地,每次救援不必返回基地,救援结束也不必)处于某一节点。给出需要救援的房子,可以任意选择救援顺序,输出每个节点作为基地的最短用时。

分析

换根dp的模板,但我没学,所以现在去学,粘一下std。

错误点

不会换根dp

std

#include<cstdio>
#include<algorithm>
using namespace std;
const int M=5e5+5;
void qread(int &r) {//IO数据很大啊,用读入挂可能会好一点r=0;char c=0;while(c<'0'||c>'9')c=getchar();while(c>='0'&&c<='9')r=(r<<1)+(r<<3)+(c^48),c=getchar();
}
int n,m;
struct edge {int v,c,to;
} E[M<<1];
int head[M],tot;
void Link(int u,int v,int c) {E[++tot]=(edge) {v,c,head[u]};head[u]=tot;
}
bool mark[M];
long long dis[M],len,sz[M];
long long from_f[M],from_s[M];
void dfs_Init(int u,int f) {//这一次dfs预处理很多东西if(mark[u])sz[u]=1,from_s[u]=0;else sz[u]=0,from_s[u]=-2e18;for(int i=head[u]; i!=0; i=E[i].to) {int v=E[i].v,c=E[i].c;if(v==f)continue;dis[v]=dis[u]+c;//深度dfs_Init(v,u);sz[u]+=sz[v];//子树内标记点数量if(sz[v]>0)len+=c*2;//len在根为1时的初始值from_s[u]=max(from_s[u],from_s[v]+c);//子树内深度}
}
void re_dfs_Init(int u,int f) {long long fir=-2e18,sec=-2e18;//最大值First,次大值Secondfor(int i=head[u]; i!=0; i=E[i].to) {int v=E[i].v,c=E[i].c;if(v==f)continue;long long Dis=from_s[v]+c;if(Dis>fir)sec=fir,fir=Dis;else if(Dis>sec)sec=Dis;}for(int i=head[u]; i!=0; i=E[i].to) {int v=E[i].v,c=E[i].c;if(v==f)continue;long long Dis=from_s[v]+c;if(Dis==fir)from_f[v]=max(from_f[u],sec)+c;//最大值以外的最大值是次大值else from_f[v]=max(from_f[u],fir)+c;if(mark[u])from_f[v]=max(from_f[v],(long long)c);//这里注意父亲被标记的情况(实测,比较难拍出来)re_dfs_Init(v,u);}
}
long long Ans[M];
void dfs_Solve(int u,int f,long long len) {Ans[u]=len-max(from_f[u],from_s[u]);for(int i=head[u]; i!=0; i=E[i].to) {int v=E[i].v,c=E[i].c;if(v==f)continue;long long nxt_len=len;if(sz[v]==0)nxt_len+=c*2;//这里是len的O(1)递推转移else if(sz[v]==m)nxt_len-=c*2;dfs_Solve(v,u,nxt_len);}
}
void Solve() {dfs_Init(1,-1);if(!mark[1])from_f[1]=-2e18;re_dfs_Init(1,-1);dfs_Solve(1,-1,len);for(int i=1; i<=n; i++)printf("%lld\n",Ans[i]);
}
int main() {freopen("rescue.in", "r", stdin);freopen("rescue.out", "w", stdout);scanf("%d%d",&n,&m);for(int i=1; i<n; i++) {int u,v,c;qread(u),qread(v),qread(c);Link(u,v,c);Link(v,u,c);}for(int i=1; i<=m; i++) {int u;qread(u);mark[u]=true;}Solve();return 0;
}

T4.path

提交链接:ZYZOJ P6001 path

原题链接:https://www.luogu.com.cn/problem/P2934

分析

订出这题就更不可能了,但是最短树是值得一学的。现在就去!

错误点

纯不会。

整场总结

时间:2025-11-03 8:00~12:30

完成题目:0/4

预估的分:50/400

实际得分:0/400

心态:较焦虑

题号知识点难度预估用时结果得分
A.piano映射,一元一次方程1.5h爆零0
B.rgb高维前缀和,降维,维度转化0h爆零0
C.rescue换根DP0h爆零0
D.path最短路树,LCA,并查集0h爆零0

卡点分析:

A——映射及整除问题

B——不会多维转化以及二分答案check函数编写

C——不会换根DP

D——最短路不熟悉

收获

降维思想,去绝对值思想,映射思想。

薄弱

代码能力以及对于思路的细化。

改进

大模拟+随手记录思路

http://www.dtcms.com/a/566091.html

相关文章:

  • 建设网站怎样做如何利用互联网营销
  • Claude Code 原生安装教程
  • ps做游戏下载网站有哪些做网站备案都需要什么东西
  • Anaconda Prompt系统找不到指定路径
  • 聚类(Clustering)详解:让机器自己发现数据结构
  • cglib动态代理之MethodProxy
  • 网站公网安备链接怎么做网站建设需要多少资金
  • 重点专业建设网站网上接效果图平台
  • 海北网站建设队徽logo设计
  • 北京专业网站建设网站水头网站建设
  • Git hook pre-commit
  • 展示系统 网站模板广西新闻
  • Java基础语言进阶学习——2,对象创建机制与内存布局
  • 网站seo啥意思怎么做罗田县建设局网站
  • 基于yolov8的果蔬识别检测系统python源码+onnx模型+数据集+精美GUI界面
  • 网站建设合同电子版苏州网页制作报价
  • 廊坊网站建设方案策划民治做网站
  • 走路摆臂幅度大给人影响差-----坏习惯
  • TRO重磅消息 野生动物插画师Roger Hall跨境维权风暴来袭
  • ABB焊接机器人节气装置
  • Linux 孤儿进程和僵尸进程详解
  • jsp做网站用什么封装字符串餐饮加盟什么网站建设
  • 做网站挂谷歌广告赚钱吗电子商务网站模板html
  • 基于 OpenVINO 实现 SpeechT5 语音合成模型本地部署加速
  • 北京市建设工程审核在哪个网站打车软件app开发
  • 怎么做站旅游网站上泡到妞主流网站宽度
  • 【底层机制】解析Espresso测试框架的核心原理
  • 网站如何做中英文效果wordpress主题开发培训
  • PostIn零基础学习 - 快速对接口进行调试
  • 网站建设沛宣北京vi设计公司哪