Codeforces Round #701 (Div. 2) A-D

A

https://codeforces.com/contest/1485/problem/A
本题我的做法是枚举小范围内的一些b值,再对ans取min

#include<bits/stdc++.h>   
#define ll long long      
using namespace std;
const int N = 10005;
int n,m;
int a,b;

int main(){
	int t;
	cin>>t;
	while(t--){
		cin>>a>>b;
		if(a<b){
			cout<<1<<endl;
		}
		else{
			int ans=1e9;
			for(int bb=max(2,b);bb<=b+1000;bb++){
				int tem=bb-b;
				int ta=a;
				while(ta){
					ta/=bb;
					tem++;
				}
//				if(b==1) tem+=1;
				ans=min(ans,tem);
			}
			cout<<ans<<endl;
		}
	}
	return 0;
}

B

https://codeforces.com/contest/1485/problem/B
对于一段区间的询问,除了alar的中间部分答案都是一定的,有两侧的值限制其取值范围
于是可以先预处理,再根据每次的询问O(1)计算数组两头的值,把它们一起加进答案

#include<bits/stdc++.h>    //??scc?? 
#define ll long long      
using namespace std;
const int N = 100005;
int n,q,k;
ll a[N],b[N];
ll pre[N];

int main(){
	int t=1;
//	cin>>t;
	while(t--){
		cin>>n>>q>>k;
		for(int i=1;i<=n;i++){
			scanf("%lld",&a[i]);
		}
		a[0]=0,a[n+1]=k+1;
		
		pre[0]=0;
		for(int i=1;i<=n;i++){
			b[i]=a[i+1]-a[i-1]-2;
//			cout<<i<<' '<<b[i]<<endl; /// 
			pre[i]=pre[i-1]+b[i];
		}
		
		for(int u=1,x,y;u<=q;u++){
			scanf("%d%d",&x,&y);
			printf("%lld\n",pre[y]-pre[x-1]-b[x]-b[y]+ a[x+1]-2 + k-a[y-1]-1 );
		}
	}
	return 0;
}

C

https://codeforces.com/contest/1485/problem/C
踩坑经历:当发现O(n)枚举会tle时,强行归纳规律很困难
正解是首先找出k取值的上限:k(x),又因为对于给定的k值,可以O(1)计算出pair(a,b)的个数,所以复杂度可以优化为(x)

#include<bits/stdc++.h>   
#define ll long long      
using namespace std;
const int N = 100005;
int n;
ll x,y;

int main(){
	int t;
	cin>>t;
	while(t--){
		cin>>x>>y;
		ll ans=0;
		for(int i=1;i*i<x;i++){
			if(min(y,x/i-1)<i+1) break;
			ans+=min(y,x/i-1)-i;
		}
		cout<<ans<<endl;
		
	}
	return 0;
}

D

https://codeforces.com/contest/1485/problem/D
思路1:暴力
通过观察样例可以发现,我们可以构造出bij=ka11+(i1)sr+(j1)sc这样的矩阵b
我们需要做的是枚举sr、sc、k,再遍历b中每个元素看是否满足bij%aij==0
然而超时了

思路2:构造(非常巧妙)

#include<bits/stdc++.h>   
#define ll long long      
using namespace std;
int a[505][505];
int n,m;
int p[6]={2,3,5,7,11,13};


int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			scanf("%d",&a[i][j]);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if((i+j)%2){
				printf("%d ",720720);
			}
			else {
				printf("%d ",720720+a[i][j]*a[i][j]*a[i][j]*a[i][j]);
			}
		}puts("");
	}
}
posted @   starlightlmy  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示