集训Day 5

发布时间 2023-07-28 19:49:31作者: 王浩泽

A题:

 

 B题:

 

这是集训以来感觉最好的一次,比赛开始,先看了一眼A题问题不大,直接联想到了前缀和,由于这里是异或,就将原来的求[l,r]区间内和的公式:sum[r]-sum[l-1] 改为sum[r]^sum[l-1](根据的是异或的自反性)直接A掉(get100pt),继续看B题,B题由于我基本没做对过,就只是看了几眼,写了一个暴力,但我不甘心就一直在举例子,终于发现了这题的答案与正负号的个数有关,我当时就震惊了,又举了十来个例子来验证,确认无误后直接上程序A了(get100pt)总分200AK。

A题程序:

 

#include<bits/stdc++.h>
using namespace std;
const int N=2e3+10;
long long a[N],n,sum[N],maxn=-100;
int main()
{
    freopen( "xor.in", "r", stdin );
     freopen( "xor.out", "w", stdout );
    ios::sync_with_stdio(false);
    cin>>n;
    for(long long i=1;i<=n;i++) cin>>a[i];
    sum[1]=a[1];
    for(long long i=2;i<=n;i++) sum[i]=sum[i-1]^a[i];
    for(long long i=1;i<=n;i++) maxn=max(maxn,sum[i]);
    for(long long i=2;i<=n;i++)
    {
        for(long long j=i;j<=n;j++)
        {
            maxn=max(maxn,sum[j]^sum[i-1]);
        }
    }
    cout<<maxn; 
    return 0;
}

 B题程序:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
long long n,a[N],sum=0,minn=1e9,t=0;
int main()
{
    freopen( "flip.in", "r", stdin );
     freopen( "flip.out", "w", stdout );
    ios::sync_with_stdio(false);
    cin>>n;
    if(n==1)
    {
        long long t111;
        cin>>t111;
        cout<<t111;
        return 0;
    }
    for(long long i=1;i<=n;i++)
    {
        cin>>a[i];
        sum+=abs(a[i]);
//        cout<<abs(a[i])<<" ";
        minn=min(minn,abs(a[i]));
        if(a[i]<0) t++;
    }
    if(t%2==0) cout<<sum;
    else cout<<sum-minn-minn;
    return 0;
}