Codeforces Round #757 div.2 A-D题解

Posted 欣君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #757 div.2 A-D题解相关的知识,希望对你有一定的参考价值。

视频讲解:咕了 ,推荐看dls的视频题解

A. Divan and a Store

题目大意

商店里有 n ( 1 ≤ n ≤ 100 ) n(1 \\leq n \\leq 100) n(1n100) 个不同的巧克力棒,第 i i i 个巧克力棒的价格为 a i a_i ai 美元。Divan只会购买价格在 [ l , r ] [l,r] [l,r] 区间内的巧克力棒,求花费不超过 k k k 美元的情况下,最多可以购买多少巧克力棒。

题解

a i a_i ai 升序排序,从小到大依次选择价格在 [ l , r ] [l,r] [l,r] 范围内的巧克力棒,直到剩余金额不够时停止。

参考代码

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

const int MAXN=110;
int a[MAXN];

int main()

	int T,n,l,r,k,ans,i;
	scanf("%d",&T);
	while(T--)
	
		scanf("%d%d%d%d",&n,&l,&r,&k);
		for(i=1;i<=n;i++)
			scanf("%d",&a[i]);
		sort(a+1,a+n+1);
		ans=0;
		for(i=1;i<=n;i++)
		
			if(a[i]<l)
				continue;
			if(a[i]>r||a[i]>k)
				break;
			k-=a[i];
			ans++;
		
		printf("%d\\n",ans);
	

B. Divan and a New Project

题目大意

计划在一条坐标轴上建造 n + 1 ( 1 ≤ n ≤ 2 ⋅ 1 0 5 ) n+1(1 \\leq n \\leq 2 \\cdot 10^5) n+1(1n2105) 个不同的建筑,每个建筑所在的坐标都是整数,且不存在两座建筑位于同一点。
设第 i i i 个建筑的坐标为 x i x_i xi ,从建筑 i i i 到建筑 j j j 需要花费 ∣ x i − x j ∣ |x_i-x_j| xixj 分钟。

建筑编号从 0 0 0 n n n ,有一名商人从第 0 0 0 号建筑物出发,依次访问其他建筑并返回 0 0 0 号建筑物。第 i i i 号建筑将访问 a i a_i ai 次,每次来回花费 2 ⋅ ∣ x 0 − x i ∣ 2\\cdot |x_0-x_i| 2x0xi 分钟。

求所有 n + 1 n+1 n+1 座建筑物的坐标,使得花费总时间最少。输出花费总时间,和任意一组合法的解。

题解

等价于求 ∑ i = 1 n 2 ⋅ a i ∣ x i − x 0 ∣ \\sum_i=1^n2\\cdot a_i|x_i-x_0| i=1n2aixix0 的最小值。
易得 a i a_i ai 越大,需要 ∣ x i − x 0 ∣ |x_i-x_0| xix0 越小,即离 0 0 0 号建筑越近。 因此按照 a i a_i ai 从大到小,依次放在 x 0 x_0 x0 两侧即可。

参考代码

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

const int MAXN=200200;
struct Node

	int num,id;
a[MAXN];
int x[MAXN];

bool cmp(Node n1,Node n2)

	return n1.num>n2.num;


int main()

	int T,n,i;
	ll sum;
	scanf("%d",&T);
	while(T--)
	
		scanf("%d",&n);
		for(i=1;i<=n;i++)
		
			scanf("%d",&a[i].num);
			a[i].id=i;
		
		sort(a+1,a+n+1,cmp);
		x[0]=0;
		sum=0;
		for(i=1;i<=n;i++)
		
			if(i&1)
				x[a[i].id]=(i+1)/2;
			else
				x[a[i].id]=-i/2;
			sum+=1ll*(i+1)/2*2*a[i].num;
		
		printf("%lld\\n",sum);
		for(i=0;i<=n;i++)
			printf("%d%c",x[i],i==n?'\\n':' ');
	

C. Divan and bitwise operations

题目大意

定义一个非负整数序列的舒适度为其所有子序列上元素的异或之和。
现在有一个长度为 n ( 1 ≤ n ≤ 2 ⋅ 1 0 5 ) n(1 \\leq n \\leq 2 \\cdot 10^5) n(1n2105) 的非负整数序列 a 1 , a 2 , . . . , a n ( 0 ≤ a i ≤ 2 30 − 1 ) a_1,a_2,...,a_n(0 \\leq a_i \\leq 2^30-1) a1,a2,...,an(0ai2301) ,不知道其具体值,但知道其中 m ( 1 ≤ m ≤ 2 ⋅ 1 0 5 ) m(1 \\leq m \\leq 2 \\cdot 10^5) m(1m2105) 个连续子段上元素的位或值。保证每个元素至少在其中一个子段中出现。
求原序列的舒适度,如果有多组解则输出任意一组即可。答案对 1 0 9 + 7 10^9+7 109+7 取模。

题解

本题可以构造出一组合法的原序列,再用DP求解。不过有更简单的数学方法。
对于二进制下第 d d d 位,设原序列中有 x x x 个元素在该位为 1 1 1 ,剩余 n − x n-x nx 个元素在该位为 0 0 0 。则该位对答案的贡献为
a n s d = 2 n − x ⋅ ∑ k = 0 ⌊ x − 1 2 ⌋ C x 2 k + 1 ans_d= 2^n-x \\cdot \\sum_k=0^\\lfloor \\fracx-12 \\rfloorC_x^2k+1 ansd=2nxk=02x1Cx2k+1
由二项式定理易得
( 1 + 1 ) x = C x 0 + C x 1 + . . . + C x x (1+1)^x=C_x^0+C_x^1+...+C_x^x (1+1)x=Cx0以上是关于Codeforces Round #757 div.2 A-D题解的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #757 (Div. 2)ABCD1

Codeforces Round #757 div.2 A-D题解

Codeforces Round #757 div.2 A-D题解

Codeforces Round #391 div1 757F (Dominator Tree)

Codeforces Round #705 (Div. 2)

Codeforces Round #774 (Div. 2)