首页 > 其他分享 >暑假模拟7

暑假模拟7

时间:2024-07-27 21:42:04浏览次数:17  
标签:minn Delov num npy 暑假 maxn 节点 模拟

暑假模拟7

Permutations & Primes

比较简单的构造题,容易发现所选区间只有包含1才可能产生贡献,此时考虑将2,3放在两边,1放在中间,其他数字不重要。构造方法正确性显然。注意 \(n=1,2\) 的情况。

树上游戏

Description

这一天,\(Delov\) 在和他的 \(npy\) 们在树上做游戏,他的 \(npy\) 们喜欢不同的位置,所以每个树节点上都有他的 \(npy\),她们都希望 \(Delov\) 离自己近一些,否则就会不高兴。具体来讲,\(Delov\) 所在节点离某个 \(npy\) 所在节点的树上路径长度即为该节点 \(npy\) 的不满意度。
\(Delov\) 希望能够让所有 \(npy\) 的不满意度的最大值最小,而且,作为时间管理大师, \(Delov\) 拥有分身术,也就是说,他能同时存在于 \(k\) 个节点,对 \(npy\) 来说她们会以离自己最近的 \(Delov\) 计算不满意度。

\(Delov\) 想知道所有 \(npy\) 的不满意度的最大值的最小值是多少,并把问题抛给你。

分析

赛时狂调不止,心态炸裂,还没调完,最后一秒没交上。

二分答案的做法比较好想。检验一个答案是否合法,考虑一种贪心的想法,从叶子节点开始,每个 \(Delov\) 尽可能靠上放置,但要保证最远距离不超过二分的答案,最后统计最少需要多少 \(Delov\) 即可。(代码实现细节有点多)我们记 \(maxn_u\) 为在 \(u\) 的子树中,不在 \(Delov\) 覆盖范围内的节点与 \(u\) 的最大距离, \(minn_u\) 为在 \(u\) 的子树中,\(Delov\) 与 \(u\) 的最小距离,\(DFS\) 进行转移。注意一些问题,例如判断子树内是否有 \(Delov\) ,当遍历到根节点时,注意判断距离,等等。其实是我不记得了

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;
}

剩下部分先省略。

标签:minn,Delov,num,npy,暑假,maxn,节点,模拟
From: https://www.cnblogs.com/abnormal123/p/18327523

相关文章

  • 暑假集训CSP提高模拟9
    又是挂分严重的一场T1大众点评T1交互题,注意边界处理,还有他的\(compare\)函数返回的是\(1,-1\),我以为是\(1,0\),爆零了还有特判\(N=1\)的情况点击查看代码//#include"ramen.h"////voidRamen(intN){//if(Compare(0,1)==1){//Answer(1,0);//}else{......
  • 暑假集训PVZ提高模拟9
    没关exe让这货挂了一天A.大众点评交互红题啊,交互会写,但是忘记判\(n=1\)了......
  • 暑假集训存录
    暑假集训存录推歌——BlackPink《뚜두뚜두》착한얼굴에그렇지못한태도 善良的脸蛋不屑的态度가녀린몸매속가려진volume은두배로 纤细的身体里隐藏着两倍的音量거침없이직진굳이보진않지눈치 势不可挡一直向前不必察言观色Black하면Pink우린......
  • ssy中学暑假集训向量学习笔记(应该能完结)
    今天模拟赛T4是个极其恶心的东西,用到了许多高中数学知识,md,引入前置知识。向量定义顾名思义,向量就是有方向的量,在平面直角坐标系上可以用\((a,b)\)表示,图如下:图像上即为由\(A\)指向\(B\)的一条向量。投影投影不好解释,拿图吧。\(AC\)在\(AB\)上的投影就是\(AD\)!!刚学的时候......
  • 2024暑假第四周总结
    数组容器,可以用来存储同种数据类型的多个值需要结合隐式转换考虑容器的类型和存储数据的类型保持一致数组的定义:格式一:数据类型[]数组名int[]array格式二:数据类型数组名[]intarray[]数组初始化:在内存中,为数组容器开辟空间,并将数据存入容器中的过程数组静态初......
  • CSP 模拟 6
    at场T1花间叔祖原题[ARC148A]modM考虑每个数都写成\(k\cdotmod+b\)的形式,然后将找出所有相邻两数差的\(gcd\),如果\(gcd\ne1\)的话选\(mod=2\)这样最优,否则选\(gcd\)这样答案为\(1\)。点击查看代码#include<bits/stdc++.h>#defineintlonglongtypedeflo......
  • 2024暑假集训测试13
    前言比赛链接。从来没见过交互题,T1狂CE不止心态炸了,后面的题也没打好,T2、T3简单题都不会了,所以为啥T4又放黑题。T1大众点评原题:AT_joisc2014_d。难点主要在交互,赛时琢磨了半场比赛终于搞明白是啥玩意儿了,可以将给定库当成压缩的一部分代码,可以调用里面的函数,输入......
  • 模拟赛构造题一道
    给定\(n,m\)要你求出在\(n*m\)的棋盘上最多能摆多少个象(国际象棋)。输出方案。挺无聊的。但是这是我这一个月以来模拟赛中场切的第一题。先想到一个非常显然的构造:默认\(n\leqm\)。先放\(2n\)个棋子在第一行和第\(m\)行,然后中间填个一线天出来。对了。点击查看代码......
  • 暑假集训csp提高模拟9
    赛时rank15T10,T2100,T30,T40T1,T3都会做,然后都挂了。恼了,挂200,不愧是我,唐T1大众点评「JOISC2014Day1」拉面比较简单的交互。考虑选择相邻的两组,小的单独存一个,大的单独存一个,是比较200次再将大的互相比较,小的互相比较,各200次点此查看代码#include<bits/stdc++.......
  • 暑假集训CSP提高模拟9
    暑假集训CSP提高模拟9组题人:@Delov\(T1\)P161.大众点评\(0pts\)原题:JOISC2014Day1ラーメンの食べ比べ。思路来自1037-CSP2021提高级第一轮第5题。\(2n\)次比较是好做的。不难发现在这些比较是有多余的,考虑减少多余比较。将\(n\)座拉面馆两两......