用户工具

站点工具


2020-2021:teams:wangzai_milk:20200808比赛记录

这是本文档旧的修订版!


2020牛客暑期多校训练营(第九场)

比赛情况

题号 A B C D E F G H I J K L
状态 O - - - O O - - O - O -

O 在比赛中通过 Ø 赛后通过 ! 尝试了但是失败了 - 没有尝试

比赛时间

2020-08-08 12:00-17:00

题解

F - Groundhog Looking Dowdy

我们考虑把所有衣服放到一起,然后把衣服按照邋遢值排序,然后做一个类似滑动窗口的东西,每次滑动保证窗口内有m天及以上可以穿的衣服,然后用当前的最大值和最小值相减一下更新答案即可。

点击以显示 ⇲

点击以隐藏 ⇱

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
struct Node {
	int val,bel;
}clo[N<<1];
bool cmp(const Node &x,const Node &y) { return x.val < y.val; }
int buk[N],cnt,n,m;
int main()
{
	scanf("%d%d",&n,&m);
	int ki;
	for (int i = 1;i<= n;i++) {
		scanf("%d",&ki);
		for (int j = 1;j<= ki;j++) {
			cnt++;
			scanf("%d",&clo[cnt].val);
			clo[cnt].bel = i;
		}
	}
	sort(clo+1,clo+cnt+1,cmp);
	for (int i = 1;i<= n;i++)buk[i] = 0;
	int tail = 0;
	int ans = 1e9+5;
	int cntbel = 0;
	for (int i = 1;i<= cnt;i++) {
		while (tail+1<=cnt) {
			tail++;
			buk[clo[tail].bel]++;
			if (buk[clo[tail].bel] == 1)cntbel++;
			if (cntbel >= m) {ans = min(ans,clo[tail].val-clo[i].val);break;}
		}
		buk[clo[i].bel]--;
		if (buk[clo[i].bel]==0)cntbel--;
	}
	printf("%d\n",ans);
	return 0;
}


K - The Flee Plan of Groundhog

因为被追的人可以停在某个位置不动,我们知道被追的人应该会跑到一个不会在中途被追到,并且离当前位置最远的地方躲起来,所以我们可以考虑先预处理出来追的人和被追的人到树上每一个点的距离,然后遍历一下每个点,判断一下能否在中途被追上,不会的更新一下答案即可。

点击以显示 ⇲

点击以隐藏 ⇱

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
struct E {
	int nxt,to;
}e[N<<1];
int head[N],tot;
void add(int x,int y) {
	e[++tot].nxt = head[x];
	head[x] =  tot;
	e[tot].to = y;
}
int dis1[N],dis2[N],fa[N];
void dfs1(int x,int f) {
	fa[x] = f;
	if (x!=f)dis1[x] = dis1[f]+1;
	for (int i = head[x];i;i=e[i].nxt) 
		if (e[i].to!=f)
			dfs1(e[i].to,x);
}
void dfs2(int x,int f) {
	if (x!=f)dis2[x] = dis2[f]+1;
	for (int i = head[x];i;i=e[i].nxt) 
		if (e[i].to!=f)
			dfs2(e[i].to,x);
}
int main() {
	int n,t;
	scanf("%d%d",&n,&t);
	int x,y;
	for (int i = 1;i< n;i++) {
		scanf("%d%d",&x,&y);
		add(x,y);add(y,x);
	}
	dfs1(1,1);
	x = n;
	while (dis1[x] > t)
		x = fa[x];
	int ans = 0;
	dis1[x] = 0;
	dfs1(x,x);
	dis2[n] = 0;
	dfs2(n,n);
	for (int i = 1;i<= n;i++)
		if (2*dis1[i] <= dis2[i])
			ans = max(ans,((dis2[i]+1)>>1));
	printf("%d\n",ans);
	return 0;
}
2020-2021/teams/wangzai_milk/20200808比赛记录.1597319637.txt.gz · 最后更改: 2020/08/13 19:53 由 infinity37