#include<cstdio>#include<iostream>#define RI register int#define CI const int&usingnamespace std;
int t,n,m,a,b;
intmain(){
for (scanf("%d",&t);t;--t)
{
scanf("%d%d%d%d",&n,&m,&a,&b);
if (n%2==1&&m%2==1) { puts("No"); continue; }
if (n>m) swap(n,m);
if (n==1&&m==2) { puts("Yes"); continue; }
if (a==1&&b==1) { puts("Yes"); continue; }
if (a==0&&b==0) { puts("No"); continue; }
if (a==0)
{
if (n==1) puts("No"); elseputs("Yes");
} else {
if (n==1) puts("Yes"); elseputs("No");
}
}
return0;
}
3|0安
签到题,祁神开场写的,我题目都没看
#include<bits/stdc++.h>usingnamespace std;
constint N = 1e5+5;
int n, A[N], B[N];
voidsolve(){
cin >> n;
for (int i=1; i<=n; ++i) cin >> A[i];
for (int i=1; i<=n; ++i) cin >> B[i];
int cnt1=0, cnt2=0;
for (int i=1; i<=n; ++i){
if (A[i]>B[i]) ++cnt1;
elseif (A[i]==B[i]) ++cnt2;
}
cout << cnt1 + (cnt2+1)/2 << '\n';
}
signedmain(){
ios::sync_with_stdio(0); cin.tie(0);
int t; cin >> t; while (t--) solve();
return0;
}
#include<cstdio>#include<iostream>#include<vector>#define RI register int#define CI const int&usingnamespace std;
typedeflonglong LL;
constint N=45;
int n,m,x,y,ans; LL g[N]; vector <int> v[N];
inlinevoidDFS(CI now,const LL& pre=0,CI len=1){
ans=max(ans,len);
for (auto to:v[now]) if (((pre>>to)&1)==0&&(g[to]&pre)==0) DFS(to,pre|(1LL<<now),len+1);
}
intmain(){
RI i; for (scanf("%d%d",&n,&m),i=1;i<=m;++i)
{
scanf("%d%d",&x,&y); --x; --y;
v[x].push_back(y); v[y].push_back(x);
g[x]|=(1LL<<y); g[y]|=(1LL<<x);
}
for (i=0;i<n;++i) DFS(i);
returnprintf("%d",ans),0;
}
6|0相
祁神正在绝赞补题中,我直接开摆了
7|0思
神秘 DP 题,完全没想到这样设状态
令 fl,r,c 表示已知答案在 al∼ar 之间,且在 l 左侧的询问次数减去在 r 右侧的询问次数为 c 的最小代价
之所以这么设状态是因为我们考虑在最后得知询问结果时得到 x 对应的系数,在计算贡献时左右各一次询问会相互抵消,因此只要知道差值就能计算贡献了
转移的时候考虑枚举 y∈(ak,ak+1],最优的转移点显然就是让贡献尽量平均的点
但直接这么做复杂度是 O(n3×|c|) 的,通过观察可以发现 fl,r,c 的决策点一定在 fl,r−1,c 的决策点的右侧,因此可以用 two pointers 优化
同时根据题解中的分析,c 的值小于 logn级别,因此最后总复杂度为 O(n2logn)
#include<cstdio>#include<iostream>#define int long long#define RI register int#define CI const int&usingnamespace std;
constint N=1005,INF=1e18;
int n,a[N],f[N][N][85];
signedmain(){
RI i,j,k; for (scanf("%lld",&n),i=1;i<=n;++i) scanf("%lld",&a[i]);
for (i=1;i<=n;++i) for (j=1;j<=n;++j) for (k=0;k<=80;++k) f[i][j][k]=INF;
for (i=1;i<=n;++i) for (j=-40;j<=40;++j) f[i][i][j+40]=a[i]*j;
for (RI l=n;l>=1;--l) for (k=1;k<80;++k)
{
int p=l+1; for (RI r=l+1;r<=n;++r)
{
while (p<=r)
{
int L=f[l][p-1][k-1],R=f[p][r][k+1];
if (L==INF||R==INF) break;
int val=(R-L+1)/2;
if (val>a[p]) val=a[p];
if (val<=a[p-1]) val=a[p-1]+1;
int tmp=max(L+val,R-val);
if (tmp<f[l][r][k]) f[l][r][k]=tmp,++p; elsebreak;
}
--p;
}
}
returnprintf("%lld",f[1][n][40]),0;
}
8|0知
由于贡献只能往前移动不能往后,因此考虑从前往后把数一个个加进去
设当前加入了 ai,a1∼ai−1 中的最小值为 M,显然若 ai>M 则从 ai 换一个 1 给 M 一定不会让答案变劣
暴力重复以上过程,复杂度 O(n2×ai)
#include<cstdio>#include<iostream>#define RI register int#define CI const int&usingnamespace std;
constint N=105,mod=998244353;
int t,n,a[N];
intmain(){
for (scanf("%d",&t);t;--t)
{
RI i,j; for (scanf("%d",&n),i=1;i<=n;++i) scanf("%d",&a[i]);
for (i=2;i<=n;++i)
{
for (;;)
{
int mn=101,pos=-1;
for (j=1;j<i;++j) if (a[j]<mn) mn=a[j],pos=j;
if (a[i]<=mn) break;
++a[pos]; --a[i];
}
}
int ans=1; for (i=1;i<=n;++i) ans=1LL*ans*a[i]%mod;
printf("%d\n",ans);
}
return0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现