CXXP#1 非官方 TJ
2026-02-22 11:08:16
发布于:浙江
本次比赛偏简单,感觉不到 J 组难度
T1:一个格的价
按题意分类讨论三个等级即可,注意时间转换。
难度红。
T2:一个戏的游
先将每个技能的冷却和伤害记下来,然后依次读入要强化的技能的下标,并按 讨论即可。
如此之纯真模拟,为何有人会用 AI
难度橙。
T3:一个宫的迷
本题有多种做法,由想到此做法的难易排序
题外话:为什么这题没人用 AI,因为 AI 宕机了
Solution 1:
考验对基础的 bfs 的掌握性。
先读入迷宫,记录起点和终点,然后从起点开始 bfs,每次枚举向上下左右前后的状态是否可行 ,可行则插入队列末端。当状态到达终点时直接输出 。
:判掉出界、走到墙壁的情况,并在走到此处时打一个标记,若已经有标记则 continue。
证明:由于 bfs 中的状态走的次数越小,必定排在更前面,所以再走到这个点时,方案一定不优。
:由上 bfs 的性质可得。
复杂度:最坏经过每个点,最坏复杂度 ,可过此题。
此做法难度橙~黄。
Solution 2:
我会图论!
注意到这是一个单源最短路问题,首先将每个可到点与周围可到的点连一条双向边,然后就是单源最短路板子了,由于出题人应该没想到这种做法,所以 dijkstra 和 spfa 应该都是可行的。
堆优化 dijkstra 理论最坏复杂度 。spfa 理论最坏复杂度 ,这里 是常数。
此做法难度黄。
Solution 3:
空间想象力太差怎么办?拍扁不就好了吗?
对于每两层之间,我们记录他们之间联通的点,然后对于每一层,将这层与下面一层的点和这层与上面一层的点中数量较少的数量记为 ,跑 次 dijkstra 或 spfa。(也可以跑 floyd。最后将这些点的边存下来,再跑一次 dijkstra 或 spfa 即可。(注意起始点和终点要与他自己这一层的点连边。
最坏复杂度
此做法难度黄。
T4:一个法的书
我们定义对于一序列,它的逆序对数为 。
注意到最小交换次数即为此序列的逆序对,且若该序列中有相同数,则排完后可以随意换, 即可。若没有,则交换完后必定还要换回来,故要求 且 。
若
我们发现,当 为奇数时,序列的相对顺序不变,当 为偶数时,只有负数才可能会变,且只需要取绝对值即可。
故我们直接对于每个操作暴力求即可。
若
此时我们发现,暴力求会超时,故我们需要简化。由上面的讨论可得,只有原序列和取绝对值后的序列两种情况。故对原序列和取绝对值的序列各求一次逆序对即可。
逆序对不会请右转至逆序对。
难度黄~绿。
因为找不到赛时记录了,所以代码先不放,等蒟蒻有时间再写T4存在问题,其他三个先贴上来
Code
#include<bits/stdc++.h>
using namespace std;
char S;
int x;
int main(){
cin>>S>>x;
double y=x/1000.0;
if(S=='A')printf("%.2lf",y*60);
else if(S=='B')printf("%.2lf",y*45);
else printf("%.2lf",y*30);
}
#include<bits/stdc++.h>
using namespace std;
constexpr int N=105;
int i,n,m,c[N],d[N];
double ans;
int main(){
cin>>n>>m;
for(i=1;i<=n;++i)cin>>c[i]>>d[i];
for(i=1;i<=m;++i){
int t,s,u;
cin>>t>>s>>u;
if(t==1)d[u]+=s;
else{
double wil=1.0*d[u]*(1+1.0*s/100);
d[u]=(int)wil;
}
}
for(i=1;i<=n;++i)ans+=1.0*d[i]/c[i];
cout<<(int)ans;
}
#include<bits/stdc++.h>
using namespace std;
constexpr int N=21;
int i,j,k,n,ax,ay,az,bx,by,bz,ans=1e9;
char c[N][N][N];
bool vis[N][N][N];
constexpr int dx[]={0,0,-1,1,0,0},
dy[]={-1,1,0,0,0,0},
dz[]={0,0,0,0,-1,1};
struct Node{int x,y,z,step;};
queue<Node>q;
inline bool ok(int x,int y,int z){return x>=1&&x<=n&&y>=1&&y<=n&&z>=1&&z<=n&&!vis[x][y][z]&&c[z][x][y]!='#';}
int main(){
cin>>n;
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
for(k=1;k<=n;++k){
cin>>c[i][j][k];
if(c[i][j][k]=='S')ax=j,ay=k,az=i;
else if(c[i][j][k]=='E')bx=j,by=k,bz=i;
}
q.push({ax,ay,az,0});
while(!q.empty()){
Node u=q.front();q.pop();
int x=u.x,y=u.y,z=u.z,st=u.step;
if(x==bx&&y==by&&z==bz){
cout<<st;
return 0;
}
for(int ppl=0;ppl<6;++ppl){
int ux=x+dx[ppl],uy=y+dy[ppl],uz=z+dz[ppl];
if(!ok(ux,uy,uz))continue;
vis[ux][uy][uz]=1;
q.push({ux,uy,uz,st+1});
}
}
cout<<-1;
}
全部评论 10
你说得对,但是赛时记录可以点开比赛页面,选择“题目列表”,每一行最右侧的“竞赛状态”下面的点一下就有代码了
2026-02-20 来自 浙江
1其实这次比赛挺唐的,我和 CXXP 的联合比赛就不会这么唐了(全是【数据删除】题)
2026-02-19 来自 北京
1【数据删除】是一个算法
2026-02-19 来自 北京
0疑似杀oi人一个
2026-02-20 来自 福建
0确实四道题三道模拟、
2026-02-22 来自 湖北
0
你牛大了
2026-02-19 来自 广东
1hyw
2026-02-19 来自 浙江
0T3 后面几种都是我口胡的,还没写(也不想写,感觉石山
2026-02-19 来自 浙江
0拜蓝勾大佬2026-02-19 来自 浙江
0
这个证明部分可以在前面加一个“>”
2026-02-22 来自 浙江
0虽然我不知道 ppl 看到你的代码会怎么想,但是我还是友善的帮你贴出来了
2026-02-22 来自 湖北
0- 有待提高
- 代码贴出来,不行的话我帮你贴
#include<bits/stdc++.h> using namespace std; char S; int x; int main(){ cin>>S>>x; double y=x/1000.0; if(S=='A')printf("%.2lf",y*60); else if(S=='B')printf("%.2lf",y*45); else printf("%.2lf",y*30); } #include<bits/stdc++.h> using namespace std; constexpr int N=105; int i,n,m,c[N],d[N]; double ans; int main(){ cin>>n>>m; for(i=1;i<=n;++i)cin>>c[i]>>d[i]; for(i=1;i<=m;++i){ int t,s,u; cin>>t>>s>>u; if(t==1)d[u]+=s; else{ double wil=1.0*d[u]*(1+1.0*s/100); d[u]=(int)wil; } } for(i=1;i<=n;++i)ans+=1.0*d[i]/c[i]; cout<<(int)ans; } #include<bits/stdc++.h> using namespace std; constexpr int N=21; int i,j,k,n,ax,ay,az,bx,by,bz,ans=1e9; char c[N][N][N]; bool vis[N][N][N]; constexpr int dx[]={0,0,-1,1,0,0}, dy[]={-1,1,0,0,0,0}, dz[]={0,0,0,0,-1,1}; struct Node{int x,y,z,step;}; queue<Node>q; inline bool ok(int x,int y,int z){return x>=1&&x<=n&&y>=1&&y<=n&&z>=1&&z<=n&&!vis[x][y][z]&&c[z][x][y]!='#';} int main(){ cin>>n; for(i=1;i<=n;++i) for(j=1;j<=n;++j) for(k=1;k<=n;++k){ cin>>c[i][j][k]; if(c[i][j][k]=='S')ax=j,ay=k,az=i; else if(c[i][j][k]=='E')bx=j,by=k,bz=i; } q.push({ax,ay,az,0}); while(!q.empty()){ Node u=q.front();q.pop(); int x=u.x,y=u.y,z=u.z,st=u.step; if(x==bx&&y==by&&z==bz){ cout<<st; return 0; } for(int ppl=0;ppl<6;++ppl){ int ux=x+dx[ppl],uy=y+dy[ppl],uz=z+dz[ppl]; if(!ok(ux,uy,uz))continue; vis[ux][uy][uz]=1; q.push({ux,uy,uz,st+1}); } } cout<<-1; }2026-02-22 来自 湖北
0#include<bits/stdc++.h> #define int long long using namespace std; constexpr int N=1e5+5; struct bit_tree{int num,tre;}tr[N],t[N]; int i,j,ans[N],now[N],chg[N],n,ned,k,m,fi,wh[N]; inline int lowbit(int i){return i&(-i);} inline void insert(int i,int x){while(i<=n)ans[i]+=x,i+=lowbit(i);} inline bool cmp(bit_tree a,bit_tree b){return a.tre==b.tre?a.num<b.num:a.tre<b.tre;} inline int sum(int x){int res=0;for(;x;x-=lowbit(x))res+=ans[x];return res;} signed main(){ cin.tie(nullptr)->ios::sync_with_stdio(false); cin>>n>>k>>m; for(i=1;i<=n;++i)cin>>tr[i].tre,tr[i].num=i; for(i=1;i<=n;++i)t[i].tre=tr[i].tre,t[i].num=i; sort(t+1,t+n+1,cmp); bool flag=false,flag1=false; if(t[1].tre==t[n].tre)flag1=true; for(i=1;i<=n;++i){ chg[t[i].num]=i; if(i>1&&t[i].tre==t[i-1].tre)flag=true; } for(i=1;i<=n;++i)insert(chg[i],1),ned+=i-sum(chg[i]); if(k<ned||(!flag&&(k-ned)&1))cout<<"No\n"; else cout<<"Yes\n",fi=1; bool flag2=true; for(i=1;i<=m;++i){ cin>>wh[i]; if(wh[i]%2==0)flag2=false; } for(j=1;j<=m;++j){ int w; w=wh[j]; if(flag1)cout<<"Yes\n"; else if(n>5&&(w%2==1||t[1].tre>=0)&&(n<=5||m<=5||w<=5||t[1].tre>=0||flag2)){ if(fi==1)cout<<"Yes\n"; else cout<<"No\n"; } else{ ned=0;flag=false; memset(ans,0,sizeof ans); for(i=1;i<=n;++i)t[i].tre=tr[i].tre*(w%2==0&&tr[i].tre<0?-1:1),t[i].num=i; sort(t+1,t+n+1,cmp); for(i=1;i<=n;++i){ chg[t[i].num]=i; if(i>1&&t[i].tre==t[i-1].tre)flag=true; } for(i=1;i<=n;++i)insert(chg[i],1),ned+=i-sum(chg[i]); if(k<ned||(!flag&&(k-ned)&1))cout<<"No\n"; else cout<<"Yes\n"; } } }2026-02-22 来自 湖北
0?你的权限还在啊
2026-02-22 来自 浙江
0行,但我 T4 其实赛事做法存在问题
2026-02-22 来自 浙江
0
这个 V 没加
2026-02-20 来自 浙江
0哇,注意力惊人 \bx
2026-02-21 来自 浙江
1
%%% 但是感觉字体稍大了一点
2026-02-19 来自 浙江
0感觉排版太好看了
2026-02-19 来自 北京
0%%%
2026-02-19 来自 北京
0
































有帮助,赞一个