用户工具

站点工具


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

这是本文档旧的修订版!


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

比赛情况

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

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

比赛时间

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

题解

A - Social Distancing

在半径 $r$ 的圆内取 $n$ 个整数点问两两距离平方的最大值。

意识到正解是打表的时候有点晚了。哦不好像不是打表,看到了这个dp做法。

$\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^n(x_i-x_j)^2+(y_i-y_j)^2=\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^nx_i^2+y_i^2+x_j^2+y_j^2-2x_ix_j-2y_iy_j=n\sum\limits_{i=1}^n(x_i^2+y_i^2)-(\sum\limits_{i=1}^nx_i)^2-(\sum\limits_{i=1}^ny_i)^2$

我们可以用 $dp[n][j][k]$ 表示 $n$ 个点 $\sum\limits_{i=1}^nx_i=j,\sum\limits_{i=1}^ny_i=k$ 时 $\sum\limits_{i=1}^n(x_i^2+y_i^2)$ 的最大值,则所求值为 $n\times dp[n][j][k]-j^2-k^2$ 。按半径由近至远加点,复杂度可以做到 $点数\times(nr)^2$ 。

点击以显示 ⇲

点击以隐藏 ⇱

#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define mp make_pair
#define fi first
#define se second
#define pb push_back
using namespace std;
int n,r,dp[10][505][505],res[10][35];
int sqr(int x){return x*x;}
struct Node{int x,y,dis;};
vector<Node>v;
int main()
{
	for(int i=-30;i<=30;i++)for(int j=-30;j<=30;j++)v.pb(Node{i,j,i*i+j*j});
	sort(v.begin(),v.end(),[&](Node o1,Node o2){return o1.dis<o2.dis;});
	for(int r=1,p=0;r<=30;r++)
	{
		while(p<v.size()&&v[p].dis<=r*r)
		{
			for(int i=0;i<8;i++)
			for(int j=-r*i;j<=r*i;j++)
			for(int k=-r*i;k<=r*i;k++)
			dp[i+1][j+v[p].x+250][k+v[p].y+250]=max(dp[i][j+250][k+250]+sqr(v[p].x)+sqr(v[p].y),dp[i+1][j+v[p].x+250][k+v[p].y+250]);
			p++;
		}
		for(int i=1;i<=8;i++)for(int j=-r*i;j<=r*i;j++)for(int k=-r*i;k<=r*i;k++)
		res[i][r]=max(res[i][r],i*dp[i][j+250][k+250]-sqr(j)-sqr(k));
	}
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int n,r;
		scanf("%d%d",&n,&r);
		printf("%d\n",res[n][r]);
	}
	return 0;
}


C - A National Pandemic

给一棵树,每个点有点权 $F(x)$ ,三种操作,给所有点加上它们到 $x$ 的距离/将某个 $F(x)$ 置为 $ 0 $ /询问 $F(x)$ 。

树链剖分可以搞,辅助一堆记录的登西。给所有点加距离即加上 $dep_x$ 和 $dep_{自己}$ ,然后需要减去 $dep_{lca}$ 这个是树剖的部分。我们从 $x$ 到根权值 $+1$ ,等到询问 $y$ 时查询 $y$ 到根的和即可。如果需要置零则查询一下,同样记录一个变量,减去当前的值。

D - Fake News

满足 $1$ 到 $n$ 的平方和是完全平方数的只有 $1$ 和 $24$ ,打表之后可以猜得到。

2020-2021/teams/wangzai_milk/20200801比赛记录.1596609152.txt.gz · 最后更改: 2020/08/05 14:32 由 zars19