其他分享
首页 > 其他分享> > Codeforces Round #701 (Div. 2)

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");
	}
}

CF1485E

标签:code,min,int,701,然后,Codeforces,Div,include,539
来源: https://www.cnblogs.com/275307894a/p/14400860.html