深入解析: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)满足1\leq i<j<k<l\leq n,a_i\bigoplus a_j\bigoplus a_k\bigoplus a_l = 0,其中\bigoplus表示按位异或。

分析

没啥可分析的。既然四元组不好整,那就劈开,分两边,加个cnt数组统计一下,没了……

正解

#include 
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 决定前往比特国来一次自驾游,一边旅行一边欣赏风景。

比特国有n个城市,编号1,2,...,n,由m条单向的公路连接。第i条公路从a_i个城市出发,前往b_i个城市,路程是d_i米。

小 Z 决定从S号城市出发,最终到达T号城市(保证S\neq T),并且你的车子初始速度v1米每秒。

全国共有p(0\leq p\leq n)个维修站,第i个位于x_i个城市,小 Z 可以停留在这花c_i秒的时间将车升级,使得车速翻倍。小 Z 可以在某个维修站将车升级多次,但每次升级都会花c_i秒的时间。例如,假设小 Z 当前的车速为v,并且恰好在第x_i个城市,那么他可以在第i个维修站花3c_i的时间将车升级三次,使得车速变为2 \times 2 \times 2 \times v = 8v

假设小 Z 的车速是v米每秒,那么安全通过一条长度为d米的公路所需的时间为\lceil \frac{d}{v} \rceil秒(\lceil x \rceil代表最小的不小于x的整数)。然而,有些公路是平整的,而另一些则是坑坑洼洼的。每当小 Z 通过一条坑坑洼洼的路,车的所有升级都会损耗,通过这条路之后车速会立即变回1米每秒(但在通过这条路的过程中车速不会改变)。

现在小 Z 想知道,他到达T号城市最少需要花多少秒?

输入格式

trip.in文件读入数据。

第一行四个整数n,m,S,T,代表城市个数,道路条数,起点城市编号,终点城市编号。

接下来 m 行,每行三个整数a_i,b_i,d_i和一个字符ch(只会是 G 或 B),描述第 i 条道路从第a_i个城市出发,前往第b_i个城市,路程是d_i 米,路况是ch。如果ch是 G 代表这条公路是平整的,否则是坑坑洼洼的。

接下来一行一个整数 p,代表维修站的个数。

接下来 p 行,每行两个整数x_i,c_i,代表第 i 个维修站在第x_i个城市,升级一次需要花c_i秒。

输出格式

输出到trip.out文件。

输出一个整数,代表小 Z 到达 T 号城市所需的最少秒数。如果小 Z 无法到达 T 号城市,输出-1

分析

简单的分层图板子,最多评绿,上午封装了一车结构体,吃吐了,放弃了。没啥可说的,代码能力稀碎,再不引起重视,NOIP让你坐下!

正解

#include
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 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

题面

分析

f_{i,j,k}表示现在在(i,j)位置,已经走了k步,从前面状态转移。马和象好整,车记录一下每行和每列的和即可快速查找。将可以转移的位置建图连边,邻接矩阵快速幂即可。

he了题解qwq……不会邻接矩阵快速幂qwq……

正解

花花的code!

#include 
#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<=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<

D.distance

原题链接:题目详情 - 03-D - ZYZOJ

题面

分析

全是he的qwq……

posted on 2025-12-04 15:40  ljbguanli  阅读(0)  评论(0)    收藏  举报