小清新思维题

CF521D shop

Problem

在这里插入图片描述

Solution

首先如果确定了执行的操作,执行顺序一定为赋值、加、乘。赋值操作只保留最大的,并可以转化为加法。每个数的加法操作按从大到小顺序排序后可以转化为乘法。最后将所有乘法操作从大到小排序选前𝑚个即可。

先考虑没有赋值操作,此时的想法就是把加法转为乘法,加法肯定是先选大的再选小的,

那么每个加法的使用前提都是前一个加法已经被使用过了。

因此对于每个加法,它的使用前提都是固定的,即对于每个加法操作,都是把某个值为 x x x的数变为一个值为 y y y的数,于是加法就可以转化为乘法了。

有赋值操作也是一样的,赋值肯定只会用一次,且只用最大的那个。。

考虑两种情况,如果根本没用到这个赋值,那显然没问题。

如果用到这个赋值,那么会发现先赋值和后赋值虽然每次乘的数不一样,但是最后的结果是一样的(都是加了个前缀和)。

这样可以把它看成一个普通加法再转化成乘法。



牛客挑战赛73 E S 老师的礼物

Problem

在这里插入图片描述

Solution

i i i a i a_i ai连边, a [ a i ] > i 或 a i = i a[a_i]>i 或 a_i=i a[ai]>iai=i显然不合法;

在这里插入图片描述
在这里插入图片描述





CF516D Drazil and Morning Exercise

Problem

在这里插入图片描述

Solution

首先一个结论:每个点在树中距离最远的点一定是直径中的一个点。

这样简单处理处 f i f_i fi,有一个trick:只需要把 f i f_i fi从大到小加入,然后two-pointers,维护当前是否联通,联通即将ans对两个指针位置差取max.



CF505E Mr. Kitayuta vs. Bamboos

Problem

在这里插入图片描述

Solution

显然可以先二分答案。

先抛开每天砍几次的限制,二分最大的那棵的高度之后,我们可以得知每棵柱子总计要被砍多少长度,进而求出总次数,先把这个判掉,如果总次数之和大于 m k mk mk,显然不行。

在这里插入图片描述
p p p就砍 p p p,因此这样把每个竹子在第几轮操作处理好,然后像这样判断(注意是从后往前):

	sum = 0;
	for(LL i = m;i >= 1;i --){
		sum += val[i];
		if(sum > k * (m - i + 1)) return 0;
	} return 1;


CF516E Drazil and His Happy Friends

Problem

在这里插入图片描述

Solution

  • 在这里插入图片描述
  • 然后现在
    在这里插入图片描述
    于是问题变成了:
    在这里插入图片描述

湖南多校第六场 J

在这里插入图片描述
**If any node has at least 3 non-leaf neighbours, then the answer is impossible:**
在这里插入图片描述



Gym - 105143G

Problem

在这里插入图片描述

Solution

在这里插入图片描述
说一点具体实现细节吧,ax+by=k,首先得保证k是gcd(a,b)的倍数。
对于找min(n/x,m/y)的较小值,可以假设较小值是m/y,那么x应该要<=某个数,所以可以对m/y的根号个取值依次求解。

for (ll l = 1, r; l <= m; l = r + 1) {
	r = m / (m / l);    //这里[l,r]代表的就是m/l=m/(l+1)=...=m/r的一段区间。
	ll r_ = n / (m / l); // 也就是让l<=y<=r,0<=x<=r_,我们假设dy>=dx,那么肯定是让y越大,x+y就会越大
	ll q = min(((r - y) / dy), x / dx);
	ll yy = y + q * dy;
	ll xx = x - q * dx;
	if (l <= yy && yy <= r && xx >= 0 && xx <= r_)
		mx(Ans, (xx + yy) * (m / l));
}
for (ll l = 1, r; l <= n; l = r + 1) { //这里就是假设n/x是较小值,同样处理即可。
	r = n / (n / l);
	ll r_ = m / (n / l);
	ll q = min((r_ - y) / dy, (x - l) / dx);
	ll yy = y + q * dy;
	ll xx = x - q * dx;
	if (0 <= yy && yy <= r_ && l <= xx && xx <= r)
		mx(Ans, (xx + yy) * (n / l));
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值