Codeforces Round #701 (Div. 2)
作者:互联网
CF1485A
很不寻常的A题。
首先肯定有结论:第二个操作先做,再做第一个操作最优。
然后可以发现,操作次数不会超过一个很小的数。
所以可以枚举第二个操作的次数。然后计算即可。
这里取\(w=40\)
时间复杂度\(O(Tlog^2n)\)
code:
#include<cstdio>
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
int n,m,k,x,y,z,t,ans,tot,now;
int main(){
register int i;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);ans=1e9;
for(i=0;i<=40;i++){
tot=i;
now=n;
if(!i&&m==1) continue;
while(now) now/=m+i,tot++;
ans=min(ans,tot);
}
printf("%d\n",ans);
}
}
CF1485B
因为只能有一个位置不同考虑枚举这个不同的位置。
显然这个不同的位置\(i\)的方案数是\(a_{i+1}-a_{i-1}-1\)。
然而要特别注意一下第一个和最后一个,第一个的下界是\(1\),最后一个上界是\(k\)。
然后前缀和一下即可。
code:
#include<cstdio>
using namespace std;
long long n,m,k,x,y,z,a[100039],q[100039];
int main(){
register int i;
scanf("%lld%lld%lld",&n,&m,&k);
for(i=1;i<=n;i++) scanf("%lld",&a[i]);
for(i=2;i<n;i++) q[i]=a[i+1]-a[i-1]-2,q[i]+=q[i-1];
for(i=1;i<=m;i++){
scanf("%lld%lld",&x,&y);
if(x==y) printf("%lld\n",k-1);
else{
printf("%lld\n",a[x+1]-2+q[y-1]-q[x]+k-a[y-1]-1);
}
}
}
CF1485C
设\(⌊\frac{a}{b}⌋=a \bmod b=k\)
然后发现\(a=k(b+1)\)
所以对于一个\(b\)的取值\(i\),这里的答案为\(⌊\frac{a}{i+1}⌋\)
然而因为余数不能大于除数。
所以这个答案要与\(i-1\)取\(\min\)
发现这部分单独处理的部分不会超过\(\sqrt n\),所以可以先求出上面一部分的答案,然后对于这一部分重新算。
上一部分套整除分块板子即可。
时间复杂度\(O(T\sqrt b)\)
code:
#include<cstdio>
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
long long n,m,k,x,y,z,T,ans,tot,pus;
inline long long h(long long x,long long m){
long long res=0,j;long long i,now;
for(i=1;i<=min(x+1,m);i=j+1){
j=m/(m/i);
res+=(j-i+1)*(m/i);now=m/i;
}res-=m;
if(i>x+1) res-=now*(i-x-2);
for(i=1;i*i<=m&&i<=x;i++){
res-=m/(i+1);
res+=i-1;
}
return res;
}
int main(){
// freopen("1.in","r",stdin);
register int i;
scanf("%d",&T);
while(T--){
scanf("%lld%lld",&x,&y);
printf("%lld\n",h(y,x));
}
CF1485D
可以发现\(a_{i,j}\)很小,所以从这里入手。
对于每个\(b_{i,j}\),我们使它为\(720720\),这是\(1\)到\(16\)所有数的最小公倍数。
但是这样没法完成相邻差为\(k^4\)的任务。
考虑将矩阵黑白染色,然后对于白块的\(b_{i,j}\)加上\(a_{i,j}^4\)即可。
code:
#include<cstdio>
using namespace std;
int n,m,k,x,y,z,a[539][539],b[530][539];
int main(){
register int i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
for(j=1;j<=m;j++) scanf("%d",&a[i][j]);
}
for(i=1;i<=n;i++){
for(j=(i&1)+1;j<=m;j+=2) b[i][j]=a[i][j]*a[i][j]*a[i][j]*a[i][j];
}
for(i=1;i<=n;i++){
for(j=1;j<=m;j++) printf("%d ",b[i][j]+720720);printf("\n");
}
}
标签:code,min,int,701,然后,Codeforces,Div,include,539 来源: https://www.cnblogs.com/275307894a/p/14400860.html