2024.9.30 模拟赛 CSP7
1.2024.7.18模拟赛12.2024.7.19模拟赛23.2024.7.20模拟赛34.2024.7.21模拟赛45.2024.7.22模拟赛56.2024.7.23 模拟赛67.2024.7.25模拟赛78.2024.7.26模拟赛89.2024.7.27模拟赛910.2024.7.28 模拟赛1011.2024.7.29模拟赛1112.2024.7.31模拟赛1213.2024.8.1 模拟赛1314.2024.8.6 模拟赛 1415.2024.8.7 模拟赛 1516.2024.8.8模拟赛1617.2024.8.10模拟赛1718.2024.8.18 模拟赛 2219.2024.8.19 模拟赛 2420.小集训21.2024.9.23 模拟赛 CSP 322.2024.9.24 模拟赛 CSP423.2024.9.25 模拟赛 多校24.2024.9.27 模拟赛 CSP525.2024.9.28 模拟赛 CSP6
26.2024.9.30 模拟赛 CSP7
27.2024.10.7 模拟赛 多校328.2024.?.?? 模拟赛 ???模拟赛
赛后看着分哗啦啦的往下掉。
T1 median
找中位数,赛时假做法 A 了,
没想到直接搜。。。
code
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5,mod = 998244353;
int n;
int a[6][N],ans,f[6][4];
unordered_map<int,bool> mp;
int dfs(int p,int l,int e,int g)
{
if(p>5) return 1;
int res=0;
if(l<2&&f[p][1]) res=(res+1ll*dfs(p+1,l+1,e,g)*f[p][1])%mod;
if(f[p][2]) res=(res+1ll*dfs(p+1,l,e+1,g)*f[p][2])%mod;
if(g<2&&f[p][3]) res=(res+1ll*dfs(p+1,l,e,g+1)*f[p][3])%mod;
return res;
}
int main()
{
freopen("median.in","r",stdin);
freopen("median.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=5;i++)
{
for(int j=1;j<=n;j++) scanf("%d",&a[i][j]);
sort(a[i]+1,a[i]+1+n);
}
for(int i=1;i<=5;i++)
{
for(int j=1;j<=n;j++)
{
int mid=a[i][j];
if(mp[mid]) continue;
mp[mid]=1;
memset(f,0,sizeof(f));
for(int k=1;k<=5;k++)
{
f[k][1]=upper_bound(a[k]+1,a[k]+1+n,mid)-a[k]-1;
f[k][3]=n-(lower_bound(a[k]+1,a[k]+1+n,mid)-a[k])+1;
f[k][2]=f[k][1]+f[k][3]-n;
f[k][1]-=f[k][2]; f[k][3]-=f[k][2];
}
int res=dfs(1,0,0,0);
ans=(ans+1ll*mid*res)%mod;
}
}
printf("%d\n",ans);
return 0;
}
T2 travel
细节较多,发现有两种情况会使
-
有环。
-
一条路径上有两个自环。
注意差分约束或者 tarjan 判环。
重学 tarjan
code
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+5;
int n,m;
int head[N],tot,du[N],zh[N];
struct E {int u,v;} e[N<<1];
inline void add(int u,int v) {e[++tot]={head[u],v}; head[u]=tot;}
queue<int> q;
bool vs[N];
bool dfs(int u,int cnt)
{
cnt++; vs[u]=1;
for(int i=head[u];i;i=e[i].u)
{
int v=e[i].v; if(!du[v]||vs[v]) continue;
if(dfs(v,cnt)) return 1;
}
return cnt>=1;
}
bool dfs1(int u,bool p)
{
vs[u]=1; if(zh[u]) p=1;
for(int i=head[u];i;i=e[i].u)
{
int v=e[i].v; if(vs[v]) continue;
if(p&&zh[v]) return 1;
if(dfs1(v,p)) return 1;
}
return 0;
}
int main()
{
freopen("travel.in","r",stdin);
freopen("travel.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y; scanf("%d%d",&x,&y);
if(x==y) zh[x]++;
else add(x,y), du[y]++;
}
for(int i=1;i<=n;i++) if(!du[i]) q.push(i);
for(int i=1;i<=n;i++)
{
if(zh[i]>=2) {printf("Yes\n"); return 0;}
}
for(int i=1;i<=n;i++) if(!vs[i])
{
if(dfs1(i,0)) {printf("Yes\n"); return 0;}
}
memset(vs,0,sizeof(vs));
while(!q.empty())
{
int u=q.front(); q.pop();
for(int i=head[u];i;i=e[i].u)
{
int v=e[i].v; du[v]--;
if(!du[v]) q.push(v);
}
}
for(int i=1;i<=n;i++) if(du[i]&&!vs[i])
{
if(dfs(i,0)) {printf("Yes\n"); return 0;}
}
printf("No\n");
return 0;
}
T3 game
博弈论捏。
发现
然后考虑有什么性质。
如果把所有数放在数轴上的话:
对于一个个数为奇数且每个数出现次数不全为偶数的局面,我们选取最大的数然后分给其他的,都能得到一个每个数都出现偶数次的局面。
如果每个数都出现偶数次,那下一个状态一定不可能还是每个数出现偶数次。
所以如果一开始每一个数都出现偶数次,那么先手必输,否则后手必输。
注意判断
code
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+5;
int T,n,a[N];
int main()
{
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
scanf("%d",&T);
while(T--)
{
int x=0,y=0;
scanf("%d\n",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+1+n);
if(n&1) {printf("Yes\n"); continue;}
bool fl=0;
for(int i=1;i<n;i+=2) if(a[i]!=a[i+1]) {printf("Yes\n"); fl=1; break;}
if(!fl) printf("No\n");
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Apifox不支持离线,Apipost可以!
· 零经验选手,Compose 一天开发一款小游戏!
· Trae 开发工具与使用技巧
· 历时 8 年,我冲上开源榜前 8 了!
· 通过 API 将Deepseek响应流式内容输出到前端