暑假模拟7
暑假模拟7
Permutations & Primes
比较简单的构造题,容易发现所选区间只有包含1才可能产生贡献,此时考虑将2,3放在两边,1放在中间,其他数字不重要。构造方法正确性显然。注意
树上游戏
Description
这一天,
分析
赛时狂调不止,心态炸裂,还没调完,最后一秒没交上。
二分答案的做法比较好想。检验一个答案是否合法,考虑一种贪心的想法,从叶子节点开始,每个 其实是我不记得了
Code
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+100;
int n,m,cnt,head[N],a,b,num;
struct edge{
int to,nxt;
}e[N<<1];
int depth[N],son[N];
bool last[N],pd[N];
int maxn[N],minn[N];
void add(int u,int v){
cnt++;
e[cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
void dfs1(int u,int f){
depth[u]=depth[f]+1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==f)continue;
dfs1(v,u);
son[u]++;
}
}
void dfs(int u,int f,int k){
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==f)continue;
dfs(v,u,k);
minn[u]=min(minn[u],minn[v]+1);
}
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==f)continue;
if(maxn[v]+minn[u]+1>k){
if(maxn[v]+1>=k){
num++;
minn[u]=0;
maxn[u]=-1;
return ;
}
}
if(u==1&&minn[u]+maxn[u]>k){
num++;
return ;
}
if(maxn[v]+minn[u]+1>k){
maxn[u]=max(maxn[u],maxn[v]+1);
}
else if(maxn[v]==-1){
maxn[u]=max(maxn[u],0);
}
}
if(maxn[u]==0&&minn[u]<=k)maxn[u]=-1;
if(u==1&&minn[u]+maxn[u]>k){
num++;
return ;
}
}
bool check(int x){
num=0;
memset(maxn,0,sizeof(maxn));
memset(minn,0x3f,sizeof(minn));
dfs(1,1,x);
if(num<=m)return 1;
else return 0;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++){
scanf("%d%d",&a,&b);
add(a,b);
add(b,a);
}
dfs1(1,1);
int l=1,r=n-1;
while(l<r){
int mid=(l+r)>>1;
if(check(mid))r=mid;
else l=mid+1;
}
cout<<l<<endl;
}
剩下部分先省略。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】