test20230830
给定一张
思路点拨
警钟长鸣:图可能不连通。
我们考虑如果一个子图就是边双那么就可以不管他,自然缩边双之后考虑树上问题。怎么补全呢?就是每一次挑选出树的直径然后将叶子连边,一直操作到不可以操作为止。时间复杂度
给定一张无向图,求每个点被封锁之后有多少个有序点对
思路点拨
分两类讨论:
-
不是割点,那么答案就是 。 -
是割点,考虑建立圆方树。我们认为 表示 节点子树内(含自己)有多少个圆点。那么答案的统计又分三类讨论: -
儿子节点的贡献:
。 -
父亲节点的贡献:
-
自己的贡献:
。
时间复杂度
建造军营
有一张
思路点拨
注意到在同一个边双联通分量内点和边可以随便选,所以考虑缩边双联通分量之后进行树形 dp 。
在 dp 之前,我们统计出每一个边双的节点个数
如果一个节点被选择了军营,并且这个它的子树外还有军营,那么他向父亲一定是需要连边的。如果一个节点被选择军营,但是他的子树外没有军营了,那么子树外的边是可以任意选的。按照常规的手段,我们定义状态
上述的状态转移无疑是十分复杂的,我们发现可以简化状态。如果一个节点的子树内不存在军营,不论字数外是否有军营,它的贡献都是固定的。他可能会向某些祖先选择关键边,我们在祖先处统计。由此,我们得到了终极的状态:
考虑节点
这种做法为什么是对的,因为对于任意一种方案,只要有军营,就会在深度最小的点处被统计恰好一次,所以正确性显然。
小蓝最近学习了一些排序算法, 其中冒泡排序让他印象深刻。
在冒泡排序中, 每次只能交换相邻的两个元素。
小蓝发现, 如果对一个字符串中的字符排序, 只允许交换相邻的两个字符, 则在所有可能的排序方案中, 冒泡排序的总交换次数是最少的。
例如, 对于字符串 lan 排序, 只需要
小蓝的幸运数字是
思路点拨
十分巧妙的贪心。
我们考虑怎么求出这个字符串的最短长度,再求出最小的字典序方案。可以发现,如果一个字符串长度为
我们在
for(int i=1;i<=26;i++)
f[i]=f[i-1]+(i-1);
for(int i=0;i<26;i++) cnt[i]=1;
for(int i=27;i<=n;i++){
int mx=0;
for(int j=0;j<26;j++)
mx=max(mx,f[i-1]+i-cnt[j]);
for(int j=25;j>=0;j--)
if(f[i-1]+i-cnt[j]==mx){
f[i]=f[i-1]+(i-1)-cnt[j];
cnt[j]++;
break;
}
}
接下来考虑构造一组最优解。我们按照刚才的思路,枚举第一个可能的字符并且修改
如果我们知道了
int get_add(int w){
int ans=0;
for(int i=0;i<w;i++) ans+=h[i];
for(int i=w+1;i<26;i++) ans+=g[i]+h[i];
return ans;
}
bool check(int pos,int m,int ans){
for(int i=pos+1;i<=m;i++){
int mx=0,max_id=0;
for(int j=0;j<26;j++){
int w=get_add(j);
if(w>mx){
mx=w;
max_id=j;
}
}
h[max_id]++;
ans+=mx;
}//这一部分和求出最短长度的函数流程差不多,每一次找到目前最优的字符,然后增加 cnt
//贪心的结论依然成立,我们希望g+h 尽量均匀,所以这么做就是正确的
memset(h,0,sizeof(h));
if(ans>=n) return 1;
return 0;
}
void solve(int m){
int ans=0;
for(int i=1;i<=m;i++){
for(int j=0;j<26;j++){
ans+=get_add(j);
g[j]++;
if(check(i,m,ans)){
cout<<(char)('a'+j);
break;
}
else{
g[j]--;
ans-=get_add(j);
}
}
//这一部分可以看到,我们是暴力枚举最优的字符然后使用 check 函数判断是否有解
}
}
上述代码中
int get_add(int w){
int ans=0;
for(int i=0;i<w;i++) ans+=h[i];
for(int i=w+1;i<26;i++) ans+=g[i]+h[i];
return ans;
}
为什么在
因为
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现