Codeforces Global Round 26 A~C2

惹啊啊啊啊,这场做得我发昏,最近总感觉不在状态,但还是再在冲击1600-1800的题目.

每题都有AC代码,请留意下拉代码框。
A. Strange Splitting

---------------------------------题解---------------------------------------------------
给你一个数组,让你自己构造一个RB字符串让R位置的数组中的数字的最大值-最小值不等于B位置的数组中的数字的最大值-最小值。

已知给定数组按升序排列,我们先遍历一遍字符串,如果全部相同的话则输出NO 因为差值都是0.

否则我们就让第二个为 R 这样R数组中数字max-min=0 然后其他的都是B 这样B数组的max-min必然不是0

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        int q=0;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=2;i<=n;i++)
        {
            if(a[i]!=a[1])q=1;
        }
        if(q==0) cout<<"NO"<<endl;
        else
        {   cout<<"YES"<<endl;
           
           for(int i=1;i<=n;i++)
           {
            if(i==2) cout<<"R";
            else cout<<"B";
           }
           cout<<endl;
        }
    }
}

B. Large Addition

----------------------------------------题解-----------------------------------
这题我们要关注那些数不能被相同位数的数字凑出 比如 末尾为9的数字就不行 因为9 只能是一对末尾为 (4,5,(3,6),(2,7)--等数字凑出不符合题意

其次数字的开头必须是1 因为如果是1以上的数字 结合必须用相同的位数凑出的条件 比如2 开头就必须是 (1,1) 也无法符合条件 如果是比如1337这个四位数 只能由两个三位数进位而来

又比如 2337这个四位数 是由两个开头为1的数字相加而来不符合条件.

在遍历除了开头和结尾之外的数字 如果有0则不能符合条件 因为如果有0则说明她下面的那一位没有完成相加大于等于10这个进位条件 那他们就必然会有一个<5 (这里可能很多同学觉得有问题建议自己去找几个数字试一下)。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        string a;
        cin>>a;
        int jud=1;
      ll n=a.size();
       if(a[n-1]=='9') jud=0;
       if(a[0]!='1') jud=0;
       for(ll i=1;i<n-1;i++)
       {
        if(a[i]=='0') jud=0;
       }
       
       if(jud==1) cout<<"YES"<<endl;
       else cout<<"NO"<<endl;
    }
}

C1. Magnitude (Easy Version)

----------------------------------------题解------------------------------

有分析知道,2操作我们应该就需要用一次就够了,因为我们会通过一次2操作让他从负数变成一个较大的数,然后在不断相加,那么2操作什么时候收益最高呢,就是在他前缀和是极小值(切

是负数)的时候(注意这个理论我们下面的hard版本要用---与easy版本关系不大) 对于这个easy版本,我们只需要维护一个最大值并且同时保留一个不断采用1操作并且在当前尝试使用2操

作的值与最大值相比较就可以了,请结合代码理解

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
ll a[N];

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        ll n;
        cin>>n;
        for(ll i=1;i<=n;i++)cin>>a[i];
       ll mx=0,mn=0;
		for(ll i=1; i<=n; ++i)
		{
			mx+=a[i],mn+=a[i];
			mx=max(mx,-mn);
		}
		cout<<mx<<endl;
	}
    
}
/*
5
-1 0 -1 1 1
*/

C2. Magnitude (Hard Version)

能看到这里的都是糕手了,我会简化语言,主要分享思路。

----------------------------------------------------题解----------------------------------------------
这题我们是要找1,2操作都可以使用的部分

我们先处理简单的部分,假如说这个数组内全都是正数,那么我们是不是不论采用1,2操作都完全没区别所以假如说又n个数字,我们的答案就是2^n%Mod(以下把取模省略掉,自己做的时候别忘记)

还记得我们的1理论吗,我们要在前缀和最小的时候使用2操作,我们取完最小值之后,说明后面的操作不论是正数是负数,采用1,2操作都不会受到影响了,因为后面的所有操作的数字加起来一定是>=0的 所以我们用1,2都无所谓,这是2^(n-i)i是前缀和最小值所在的位置。 但是在凑出这个前缀和最小值的过程中 前缀和数组中的有些b[i]是大于0的,面对这些大于0的时候我们用1,2操作也都可以,因此答案为2(n-i)*2r(r是前缀和数组中大于0的个数)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
const int mod=998244353;
typedef long long ll;
ll a[N];
ll b[N];
ll c[N];
int main()
{
    int t;
    cin>>t;
    c[0]=1;
    for(int i=1;i<N;i++)c[i]=c[i-1]*2%mod;
    
    while(t--)
    {
        ll n;
        cin>>n;
        ll cnt=0; 
        for(ll i=1;i<=n;i++)cin>>a[i];
       ll mx=0,mn=1e18;
       b[0]=0;
       ll n1=0;
       ll jud=0;
		for(ll i=1; i<=n;i++)
		{
			b[i]=b[i-1]+a[i];
			mn=min(b[i],mn);
			if(b[i]<0) jud=1;
		}
		if(jud==0)
		{   cout<<c[n]<<'\n';
		}
		else
		{  ll q1=0;
			for(ll i=1;i<=n;i++)
			{
				if(b[i]==mn) mx=(mx+c[n-i+cnt])%mod;
				else if(b[i]>=0) cnt++;
			}
			cout<<mx<<'\n';
		}
		
	//	cout<<cnt<<endl;
	
	}
    
}

**/////////////////keep hard ,be the best///////////////////////////////////**
posted @   marisa3  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示