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
细节较多,发现有两种情况会使 \(f\) 是发散的。
-
有环。
-
一条路径上有两个自环。
注意差分约束或者 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
博弈论捏。
发现 \({1,1}\) 的情况先手必输。
然后考虑有什么性质。
如果把所有数放在数轴上的话:
对于一个个数为奇数且每个数出现次数不全为偶数的局面,我们选取最大的数然后分给其他的,都能得到一个每个数都出现偶数次的局面。
如果每个数都出现偶数次,那下一个状态一定不可能还是每个数出现偶数次。
所以如果一开始每一个数都出现偶数次,那么先手必输,否则后手必输。
注意判断 \(n\) 的奇偶。如果奇数个必赢。
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 加持,快人一步
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?