用户工具

站点工具


2020-2021:teams:legal_string:jxm2001:contest:cf_raif_div._1_div._2

这是本文档旧的修订版!


Codeforces Raif Round 1 (Div. 1 + Div. 2)

E. Carrots for Rabbits

题意

给定 $n$ 个数 $a_i$,要求数列 $b$ 满足

  1. $\sum_{j=1}^{k_i} b_{i,j}=a_i$
  2. $\sum_{i=1}^n k_i=k$
  3. $k_i,b_{i,j}\in I^{+}$

要求最小化 $\sum b_{i,j}^2$。

题解

考虑函数 $f(i,j)$ 表示将 $a_i$ 分成 $j$ 份时的答案,显然均分为最佳策略。

考虑维护 $f(1,k_1),f(2,k_2)\cdots f(n,k_n)$,初始时 $k_i=1$。

每次操作选择一个 $i$,使得 $f(i,k_i)\to f(i,k_i+1)$,显然选择减小值最大的数最佳,可以优先队列维护。

共进行 $k$ 次操作(包括初始 $n$ 次入队操作),时间复杂度 $O(k\log n)$。

查看代码

查看代码

LL f(int a,int b){
	return 1LL*(a/b)*(a/b)*(b-a%b)+1LL*(a/b+1)*(a/b+1)*(a%b);
}
struct node{
	int a,k;
	LL d;
	node(int a=0,int k=0){
		this->a=a;
		this->k=k;
		d=f(a,k)-f(a,k+1);
	}
	bool operator < (const node &b)const{
		return d<b.d;
	}
};
priority_queue<node> q;
int main()
{
	int n=read_int(),k=read_int();
	LL ans=0;
	_for(i,0,n){
		int a=read_int();
		q.push(node(a,1));
		ans+=1LL*a*a;
	}
	while(n<k){
		node temp=q.top();q.pop();
		ans-=temp.d;
		q.push(node(temp.a,temp.k+1));
		n++;
	}
	enter(ans);
	return 0;
}

G2. Lucky Numbers (Hard Version)

题意

题解

2020-2021/teams/legal_string/jxm2001/contest/cf_raif_div._1_div._2.1603175816.txt.gz · 最后更改: 2020/10/20 14:36 由 jxm2001