Codeforces Round #757 div.2 A-D题解
Posted 欣君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #757 div.2 A-D题解相关的知识,希望对你有一定的参考价值。
A. Divan and a Store
题目大意
商店里有 n ( 1 ≤ n ≤ 100 ) n(1 \\leq n \\leq 100) n(1≤n≤100) 个不同的巧克力棒,第 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(1≤n≤2⋅105) 个不同的建筑,每个建筑所在的坐标都是整数,且不存在两座建筑位于同一点。
设第
i
i
i 个建筑的坐标为
x
i
x_i
xi ,从建筑
i
i
i 到建筑
j
j
j 需要花费
∣
x
i
−
x
j
∣
|x_i-x_j|
∣xi−xj∣ 分钟。
建筑编号从 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| 2⋅∣x0−xi∣ 分钟。
求所有 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=1n2⋅ai∣xi−x0∣ 的最小值。
易得
a
i
a_i
ai 越大,需要
∣
x
i
−
x
0
∣
|x_i-x_0|
∣xi−x0∣ 越小,即离
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(1≤n≤2⋅105) 的非负整数序列
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(0≤ai≤230−1) ,不知道其具体值,但知道其中
m
(
1
≤
m
≤
2
⋅
1
0
5
)
m(1 \\leq m \\leq 2 \\cdot 10^5)
m(1≤m≤2⋅105) 个连续子段上元素的位或值。保证每个元素至少在其中一个子段中出现。
求原序列的舒适度,如果有多组解则输出任意一组即可。答案对
1
0
9
+
7
10^9+7
109+7 取模。
题解
本题可以构造出一组合法的原序列,再用DP求解。不过有更简单的数学方法。 以上是关于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)
对于二进制下第
d
d
d 位,设原序列中有
x
x
x 个元素在该位为
1
1
1 ,剩余
n
−
x
n-x
n−x 个元素在该位为
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=2n−x⋅k=0∑⌊2x−1⌋Cx2k+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