codeforce round 735div2 -32

本文分享了四道算法竞赛题目及其解题思路,涵盖了数组处理、位操作和字符串构造等主题。A题要求找到连续子区间使最大乘最小值最大化,通过遍历得到解答;B题寻找最大ij-k(ai|aj)k不超过100,采用暴力求解;C题求解MEX序列,使用按位贪心策略;D题构造一个字符串使得所有子串出现次数为奇数,提出了一种简单的构造方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

属于是打完多校脑子不转了,这题明明这简单的
掉大分,还好今天还一场

A 题意

选择一个连续子区间,让最大*最小值最大。

A 思路

显然是区间长为2时最大,扫一下就可以了。
想想也知道,我们选择两个时,拓展也是向两边拓展,如果有更小的,显然不拓展为好,如果有介于最大最小之间的,那么答案不会更优,假如有大于最大的,拓展后的答案也不会优于选择那个更大的数的长为二区间。

A 代码

#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<unordered_map>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib> 
#include<chrono>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
#define int long long
//#define double long double
using namespace std;
	typedef long long ll;
	const int maxn=400505;
	const int inf=0x3f3f3f3f;
	int n,m,k;
	void YES(){
		cout<<"YES"<<endl;
	}
	void NO(){
		cout<<"NO"<<endl;
	}
    int a[maxn];
	void solve(){
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        int ans=-1;
        for(int i=1;i<n;i++)
            ans=max(ans,a[i]*a[i+1]);
        cout<<ans<<endl;
	}
	signed main(){
        IOS
		#ifndef ONLINE_JUDGE
		    freopen("IO\\in.txt","r",stdin);
		    freopen("IO\\out.txt","w",stdout);
        #endif
		int tn=1;
		cin>>tn;
		while(tn--){
			solve();
		}
	} 
	
						
B 题意

找出最大ij-k(ai|aj)k最大100,ai<=n。

B 思路

啥b题,取后几百位暴力就行

B 代码

#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<unordered_map>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib> 
#include<chrono>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
#define int long long
//#define double long double
using namespace std;
	typedef long long ll;
	const int maxn=400505;
	const int inf=0x3f3f3f3f;
	int n,m,k;
	void YES(){
		cout<<"YES"<<endl;
	}
	void NO(){
		cout<<"NO"<<endl;
	}
	int arr[maxn];
	void solve(){
		cin>>n>>k;
		for(int i=1;i<=n;i++){
			cin>>arr[i];
		}
		int ans=-inf;
		int li=max(1ll,n-600);
		for(int i=n;i>=li;i--)
			for(int j=i-1;j>=li;j--){
				ans=max(ans,i*j-k*(arr[i]|arr[j]));
			}
			
		cout<<ans<<endl;
	}
	signed main(){
        IOS
		#ifndef ONLINE_JUDGE
		    freopen("IO\\in.txt","r",stdin);
		    freopen("IO\\out.txt","w",stdout);
        #endif
		int tn=1;
		cin>>tn;
		while(tn--){
			solve();
		}
	} 
	
						
C 题意

求MEX{n^ i(1<=i<=m)}

C 思路

显然是让我们找最小的i,使得i^n大于m,按位贪心就好了。

C 代码
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<unordered_map>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib> 
#include<chrono>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define int long long
//#define double long double
using namespace std;
	typedef long long ll;
	const int maxn=400505;
	const int inf=0x3f3f3f3f;
	int n,m,k;
	void YES(){
		cout<<"YES"<<endl;
	}
	void NO(){
		cout<<"NO"<<endl;
	}
	void solve(){
		cin>>n>>m;
		if(m<n){
			cout<<0<<endl;
			return ;
		}
		m++;
		int ans=0;
		bool f=0;
		bool f1=0;
		int index;
		for(int i=31;~i;i--){
			if(m&(1<<i)){
				if((n&(1<<i))==0){	
					ans|=(1<<i);
				}
			}
			else{
				if(!f){
					if(n&(1<<i)){
						f=1;
						break;
					}
				}
			}
		}
		/* for(int i=0;;i++){
			if((n^i)>m){
				cout<<i<<endl;
				return;
			}
		} */
		cout<<ans<<endl;
	}
	signed main(){
        IOS
		#ifndef ONLINE_JUDGE
		    freopen("IO\\in.txt","r",stdin);
		    freopen("IO\\out.txt","w",stdout);
        #endif
		int tn=1;
		cin>>tn;
		while(tn--){
			solve();
		}
	} 
	
						
D 题意

构造一个长为n的串,让他的每一个子串出现次数都是奇数

D 思路

啥b题,形式是aaabaaaac这种。

D 代码
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<unordered_map>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib> 
#include<chrono>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define int long long
//#define double long double
using namespace std;
	typedef long long ll;
	const int maxn=400505;
	const int inf=0x3f3f3f3f;
	int n,m,k;
	void YES(){
		cout<<"YES"<<endl;
	}
	void NO(){
		cout<<"NO"<<endl;
	}
	void solve(){
		cin>>n;
		if(n==1){
			cout<<'a'<<endl;
			return ;
		}
		if(n%2){
			cout<<string(n/2,'a')+'b'+string(n/2-1,'a')+'c'<<endl;
		}
		else{
			cout<<string(n/2,'a')+'b'+string(n/2-1,'a')<<endl;
		}
	}
	signed main(){
        IOS
		#ifndef ONLINE_JUDGE
		    freopen("IO\\in.txt","r",stdin);
		    freopen("IO\\out.txt","w",stdout);
        #endif
		int tn=1;
		cin>>tn;
		while(tn--){
			solve();
		}
	} 
	
						
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值