Codeforces Round #701 (Div. 2) 补题 AB
作者:互联网
A. Add and Divide
分析: 暴力枚举
b
+
x
b+x
b+x的每个操作次数,只需要枚举
l
o
g
2
(
1
0
9
)
=
29
log_2(10^9)=29
log2(109)=29次
代码:
#include<bits/stdc++.h>
using namespace std;
int t,a,b;
int main(){
cin>>t;
while(t--){
int ans=1000;
cin>>a>>b;
int tmp=b;
if(tmp==1) tmp++;
for(int i=tmp;i<tmp+30;i++){
int res=0,ta=a;
while(ta>=i){
ta/=i;
res++;
}
ans=min(res+1+i-b,ans);
}
cout<<ans<<endl;
}
}
B. Replace and Keep Sorted
分析:
结论:
答
案
:
k
+
a
[
r
]
−
a
[
l
]
−
1
−
2
r
+
2
l
答案:k+a[r]-a[l]-1-2r+2l
答案:k+a[r]−a[l]−1−2r+2l
推导:
设左区间为
l
l
l,右区间为
r
r
r
对于左区间端点:
a
[
l
]
−
1
a[l]-1
a[l]−1
对于右区间端点:
k
−
a
[
r
]
k-a[r]
k−a[r]
其他点
i
i
i:
(
a
[
i
]
−
a
[
i
−
1
]
−
1
)
+
(
a
[
i
+
1
]
−
a
[
i
]
−
1
)
(a[i]-a[i-1]-1)+(a[i+1]-a[i]-1)
(a[i]−a[i−1]−1)+(a[i+1]−a[i]−1)
=
a
[
i
+
1
]
−
a
[
i
−
1
]
−
2
=a[i+1]-a[i-1]-2
=a[i+1]−a[i−1]−2
为什么不用计算左右端点的另一边?因为下一个点/上一个点还会计算差值
累加:
∑
i
=
l
+
1
r
−
1
a
[
i
+
1
]
−
a
[
i
−
1
]
−
2
\sum_{i=l+1}^{r-1}a[i+1]-a[i-1]-2
i=l+1∑r−1a[i+1]−a[i−1]−2
=
a
[
r
]
−
a
[
l
]
−
2
(
r
−
l
−
1
)
=a[r]-a[l]-2(r-l-1)
=a[r]−a[l]−2(r−l−1)
加上两个端点的值:
k
+
a
[
r
]
−
a
[
l
]
−
1
−
2
r
+
2
l
k+a[r]-a[l]-1-2r+2l
k+a[r]−a[l]−1−2r+2l
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,q,k,a[N],l,r;
int main(){
cin>>n>>q>>k;
for(int i=1;i<=n;i++) cin>>a[i];
while(q--){
cin>>l>>r;
cout<<k+a[r]-a[l]-1-2*r+2*l<<endl;
}
}
标签:tmp,AB,2r,int,701,cin,补题,端点,2l 来源: https://blog.csdn.net/messywind/article/details/113802397