2025-11-07 ZYZ28-NOIP模拟赛-Round3 hetao1733837的record
比赛链接:ZYZ28-NOIP模拟赛-Round3
比赛背景
在数字王国的深处,住着四位性格迥异的骑士。他们并非挥舞刀剑的战士,而是掌握着独特法则的守护者。XOR骑士身披流光溢彩的斗篷,手握一把名为“异或”的双刃剑。这把剑有个奇妙的特性:当它同时触及两个相同的数字时,力量会相互抵消,归于虚无;而面对不同的数字时,却能迸发出全新的能量。他守护着“平衡法则”,最擅长在错综复杂的迷宫中,找出那条独一无二的路径,让所有干扰项彼此湮灭,只留下唯一的真相。Trip骑士是位永不停歇的旅人,他的地图上标记着王国里所有城市间最隐秘的捷径。他坚信,两点之间,最短的不仅是直线,更是最优美的连接。当王国因暴雨冲毁道路而陷入混乱时,总能看见他忙碌的身影,运用“Floyd的智慧”或“Dijkstra的指引”,为每一段中断的旅程重新编织出最有效的网络。Distance骑士则是一位冷静的观测者,他的双眼能瞬间测算出万物间的“曼哈顿距离”。在他的世界里,两点间的远近,并非直线衡量,而是横平竖直的步数总和。他守护着王国的坐标网格,任何两点间的位移,在他眼中都化为 |x₁ - x₂| + |y₁ - y₂| 的绝对准则,简洁而严谨。而Chess骑士,是黑白格战场上的战略家。他的每一步都关乎王国的运势,深谙“王车易位”的时机,预判“马步奇袭”的落点。他在64格的宇宙里推演着无限可能,每一次落子,都是逻辑与远见的交响。
这四位骑士各司其职,维持着数字王国的秩序与平衡,直到“混沌侵蚀”的到来——
那是一片无声无息蔓延的黑暗,能扭曲规则,混淆路径,让距离失去意义,使棋局陷入死局。王国边境的“异或迷宫”最先告急:路径在虚实间闪烁,钥匙在真伪间变幻。XOR骑士踏入迷宫,他的剑锋划过空中,相同的幻象在剑刃下如泡沫般破灭,不同的真相在碰撞中显形。他并非与怪物搏斗,而是与混乱的逻辑本身交锋,最终,他在所有交织的可能性中,找到了那条让所有干扰项自我抵消的、唯一真实的路径,稳住了迷宫的核心。然而,混沌的触角已伸向王国的交通脉络。“千桥之城”的通道接连断裂,Trip骑士的地图瞬间作废。他没有惊慌,而是将破碎的路径视为新的拼图。他运用“动态规划”的时光沙漏,推演着每一段修复的次序;借助“优先队列”的灵雀,探寻着未被封锁的迂回之路。他计算的不是一步,而是百步之后的全局,最终为王国重新编织了一张虽曲折但畅通的生命线。与此同时,Distance骑士发现王国的空间结构正在坍缩,标准的坐标网格开始扭曲。他登上最高的观测塔,双眼化为精密的标尺。当混沌试图将两点间的定义模糊时,他高声吟诵法则:“纵有万千幻象,两点间距,永为横纵坐标差之绝对和!”他的意志加固了现实,扭曲的空间在坚定的法则面前逐渐恢复平直。最后的决战,在Chess骑士的棋盘上展开。混沌本身坐在了他的对面,每一步都散发着令人绝望的气息。Chess骑士凝视着棋局,他看到了十步、二十步之后的无数分支。他放弃了局部的缠斗,将一个个棋子视为整体布局的节点。他的“王”看似退避,实则引导;他的“车”固守要道,以静制动。他并非在赢下每一步,而是在规划整个棋局的终末形态。当混沌发动总攻的瞬间,才发现自己的攻势早已落入一个精心布置了数十回合的陷阱之中——一步看似平常的落子,激发了之前所有铺垫的连锁反应,如同推倒了第一张多米诺骨牌。混沌在绝对的计算与远见面前,彻底溃散。
晨光重现,数字王国恢复了往日的秩序。
四位骑士站在王宫之巅,眺望着他们共同守护的世界。
XOR的剑锋依旧闪烁着辩证的光芒,Trip的地图增添了新的路径,Distance的坐标轴坚不可摧,Chess的棋盘上,残局记录着那场智慧的胜利。他们明白,混沌从未真正消失,挑战必将换以新的形式归来。但只要逻辑依然清晰,路径始终连通,距离保有定义,策略存乎一心,那么,无论面对何种侵蚀,数字王国的法则就将永存。
而这,便是属于四位骑士的,永恒的童话。
呃,DeepSeek写长了qwq……
A.xor
原题链接:题目详情 - 03-A - ZYZOJ
题面
给定长为n的序列a,求有多少四元组(i,j,k,l)满足,
,其中
表示按位异或。
分析
没啥可分析的。既然四元组不好整,那就劈开,分两边,加个cnt数组统计一下,没了……
正解
#include <bits/stdc++.h>
using namespace std;
const int N = 1 << 20;
int n, a[5005];
long long cnt[N];
int main(){freopen("xor.in", "r", stdin);freopen("xor.out", "w", stdout);cin >> n;for (int i = 1; i <= n; i++){cin >> a[i];}long long ans = 0;for (int k = 1; k <= n; k++){for (int l = k + 1; l <= n; l++){int tmp = a[k] ^ a[l];ans += cnt[tmp];}for (int i = 1; i < k; i++){int tmp = a[i] ^ a[k];cnt[tmp]++;}}cout << ans;return 0;
}
B.trip
原题链接:题目详情 - 03-B - ZYZOJ
题面
题目描述
小 Z 决定前往比特国来一次自驾游,一边旅行一边欣赏风景。
比特国有个城市,编号
,由
条单向的公路连接。第
条公路从
个城市出发,前往
个城市,路程是
米。
小 Z 决定从号城市出发,最终到达
号城市(保证
),并且你的车子初始速度
为
米每秒。
全国共有个维修站,第
个位于
个城市,小 Z 可以停留在这花
秒的时间将车升级,使得车速翻倍。小 Z 可以在某个维修站将车升级多次,但每次升级都会花
秒的时间。例如,假设小 Z 当前的车速为
,并且恰好在第
个城市,那么他可以在第
个维修站花
的时间将车升级三次,使得车速变为
。
假设小 Z 的车速是米每秒,那么安全通过一条长度为
米的公路所需的时间为
秒(
代表最小的不小于
的整数)。然而,有些公路是平整的,而另一些则是坑坑洼洼的。每当小 Z 通过一条坑坑洼洼的路,车的所有升级都会损耗,通过这条路之后车速会立即变回
米每秒(但在通过这条路的过程中车速不会改变)。
现在小 Z 想知道,他到达号城市最少需要花多少秒?
输入格式
从文件读入数据。
第一行四个整数,代表城市个数,道路条数,起点城市编号,终点城市编号。
接下来 m 行,每行三个整数和一个字符
(只会是 G 或 B),描述第 i 条道路从第
个城市出发,前往第
个城市,路程是
米,路况是
。如果
是 G 代表这条公路是平整的,否则是坑坑洼洼的。
接下来一行一个整数 p,代表维修站的个数。
接下来 p 行,每行两个整数,代表第 i 个维修站在第
个城市,升级一次需要花
秒。
输出格式
输出到文件。
输出一个整数,代表小 Z 到达 T 号城市所需的最少秒数。如果小 Z 无法到达 T 号城市,输出。
分析
简单的分层图板子,最多评绿,上午封装了一车结构体,吃吐了,放弃了。没啥可说的,代码能力稀碎,再不引起重视,NOIP让你坐下!
正解
#include<bits/stdc++.h>
using namespace std;
struct edge{int to, nxt;long long w;
}e[2000010];
int head[420010], cnt = 1;
void addedge(int x, int y, long long w){e[cnt] = {y, head[x], w};head[x] = cnt++;
}
int n, m, S, T, adt;
struct node{int x;long long v;bool operator<(const node&_Q) const{return v > _Q.v;}
};
priority_queue<node> q;
long long d[420010];
bool vis[420010];
void dijkstra(){memset(d, 0x3f, sizeof d);q.push({S, 0});d[S] = 0;while (!q.empty()){node fr = q.top();q.pop();int x = fr.x;if (vis[x]) continue;vis[x] = 1;for (int i = head[x]; i; i = e[i].nxt){int y = e[i].to;if (d[y] > d[x] + e[i].w){d[y] = d[x] + e[i].w;q.push({y, d[y]});}}}
}
int main(){freopen("trip.in","r",stdin);freopen("trip.out","w",stdout);ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> n >> m >> S >> T;for (int i = 1; i <= m; i++){int x, y, w;cin >> x >> y >> w;char c;cin >> c;if (c == 'G') for (int j = 0; j <= 20; j++) addedge(j * n + x, j * n + y, (w + (1 << j) - 1) / (1 << j));else for (int j = 0; j <= 20; j++) addedge(j * n + x, y, (w + (1 << j) - 1) / (1 << j));}cin >> adt;for (int i = 1; i <= adt; i++){int x;long long w;cin >> x >> w;for (int j = 0; j < 20; j++) addedge(j * n + x, (j + 1) * n + x, w);}dijkstra();long long ans=0x3f3f3f3f3f3f3f3f;for (int j = 0; j <= 20; j++) ans = min(ans, d[j * n + T]);if (ans == 0x3f3f3f3f3f3f3f3f) cout << -1;else cout << ans;return 0;
}
好吧,he的AeeE5x的。
C.chess
原题链接:题目详情 - 03-C - ZYZOJ
题面

分析
设表示现在在
位置,已经走了k步,从前面状态转移。马和象好整,车记录一下每行和每列的和即可快速查找。将可以转移的位置建图连边,邻接矩阵快速幂即可。
he了题解qwq……不会邻接矩阵快速幂qwq……
正解
花花的code!
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=110,mod=19260817;
int q,a[8][2]={{-2,-1},{-1,-2},{2,1},{1,2},{-2,1},{1,-2},{-1,2},{2,-1}},b[4][2]={{2,-2},{-2,2},{2,2},{-2,-2}},w[N][N],v[N],n,m;
int id(int x,int y){return (x-1)*m+y;
}
int ksm(int x,int y){int sum=1;while(y){if(y&1) sum=sum*x%mod;x=x*x%mod;y>>=1;}return sum;
}
void mul(){int c[N][N]; for(int i=1;i<=n*m;i++) for(int j=1;j<=n*m;j++) c[i][j]=0;for(int k=1;k<=n*m;k++) for(int i=1;i<=n*m;i++) for(int j=1;j<=n*m;j++) c[i][j]=(c[i][j]+w[i][k]*w[k][j]%mod)%mod;for(int i=1;i<=n*m;i++) for(int j=1;j<=n*m;j++) w[i][j]=c[i][j];
}
void upd(){int a[N];for(int i=1;i<=n*m;i++) a[i]=0;for(int i=1;i<=n*m;i++) for(int j=1;j<=n*m;j++) a[i]=(a[i]+v[j]*w[j][i]%mod)%mod;for(int i=1;i<=n*m;i++) v[i]=a[i];
}
void ksm(int y){while(y){if(y&1) upd();mul();y>>=1;}
}
signed main(){freopen("chess.in","r",stdin);freopen("chess.out","w",stdout);ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>q;while(q--){for(int i=1;i<=n*m;i++) for(int j=1;j<=n*m;j++) w[i][j]=0;for(int i=1;i<=n*m;i++) v[i]=0;int op,x,y,t;cin>>op>>n>>m>>x>>y>>t;if(op==0){cout<<ksm(n+m-2,t)<<"\n"; continue;}else if(op==1){for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){for(int k=0;k<8;k++){int v=i+a[k][0],u=j+a[k][1];if(v>=1&&v<=n&&u>=1&&u<=m) w[id(i,j)][id(v,u)]=1; }}}} else{for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){for(int k=0;k<4;k++){int v=i+b[k][0],u=j+b[k][1];if(v>=1&&v<=n&&u>=1&&u<=m) w[id(i,j)][id(v,u)]=1;}}}}v[id(x,y)]=1;ksm(t);int ans=0;for(int i=1;i<=n*m;i++) ans=(ans+v[i])%mod;cout<<ans<<"\n"; }return 0;
}
D.distance
原题链接:题目详情 - 03-D - ZYZOJ
题面

分析

全是he的qwq……
