StarSilk 题单笔记-2600
Three Days Grace
如果想到一个很复杂/正确性可疑的贪心,那就应该考虑一下 DP 了。
一个经典套路是递减枚举最小值,维护最小化的最大值,就是双指针。
考虑 是数 在当前最小值约束下拆分后最小化的最大值。
首先,当最小值从 时,只有 的倍数 值可能会被更新。
更具体地说,此时我们需要处理的是如下的转移:
if (y>=x*x) dp[y]=min(dp[y],dp[y/x]);
显然这样的转移个数是调和级数的。
答案就是对每个 处的 取 。
怎么求 呢?
我们对 中数对应的 值打上 tag,每次转移时如果影响到 中的数就挪一下 tag,并把右指针左移到第一个有 tag 的位置就好。(利用双指针的单调性)
Code
void R()
{
int n,m,mn,mx,ans=1e9;
cin>>n>>m;
mx=m;
vector<int> a(n),dp(m+1),vis(m+1),fl(m+1);
iota(dp.begin(),dp.end(),0);
for (int &x:a)
{
cin>>x;
fl[x]=vis[x]=1;
}
mn=*min_element(a.begin(),a.end());
for (int i=m;i>=1;i--)
{
for (i64 j=1ll*i*i;j<=m;j+=i)
{
if (vis[j]) fl[dp[j]]--;
dp[j]=min(dp[j],dp[j/i]);
if (vis[j]) fl[dp[j]]++;
}
while (!fl[mx]) mx--;
if (i<=mn) ans=min(ans,mx-i);
}
cout<<ans<<'\n';
return;
}
i*i
可能爆 int
,切记切记。
Latin Square
我们可以把矩阵 看成 个三元组信息:,于是各个操作分别变成加减某维或交换某维。
于是我们 模拟操作,记录下三维在操作后是谁,然后 还原即可。
感觉实现还是很有趣的
void R()
{
int n,m;
string s;
cin>>n>>m;
vector<vector<int>> mat(n,vector<int>(n)),opt(mat);
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
{
cin>>mat[i][j];
mat[i][j]--;
}
cin>>s;
array<int,3> from={0,1,2},val={0,0,0};
for (int i=0;i<m;i++)
{
if (s[i]=='U') val[0]--;
else if (s[i]=='D') val[0]++;
else if (s[i]=='L') val[1]--;
else if (s[i]=='R') val[1]++;
else if (s[i]=='I')
{
swap(from[1],from[2]);
swap(val[1],val[2]);
}
else
{
swap(from[0],from[2]);
swap(val[0],val[2]);
}
}
for (int i=0;i<n;i++)
for (int j=0;j<n;j++)
{
auto solve=[&](int op)->int
{
if (op==0) return i;
if (op==1) return j;
return mat[i][j];
};
auto get=[&](int id)->int
{
return ((solve(from[id])+val[id])%n+n)%n;
};
opt[get(0)][get(1)]=get(2);
}
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
cout<<opt[i][j]+1;
if (j+1!=n) cout<<' ';
}
cout<<'\n';
}
cout<<'\n';
return;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!