集训Day 5

A题:

 

 B题:

 

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

 

TIPS:
1. 异或是自己的逆运算,和加法有很多类似的性质
2. 文件名!开文件!编译!测样例!
3. 加强初赛!加强初赛!加强初赛!
4. 插板法:n 个球分为 m 份,每份不能空,相当于向 n - 1 个空隙中插入 m - 1 块板子,所以方案数为 C(n - 1, m - 1),而可空的话考虑虚拟 m 个球出来先放好,最后把 m 份都减一个球即可,方案数为 C(n + m - 1, m - 1)。
5. f(n, m) = f(1, m - 1) + f(2, m - 1) + ... + f(n - 1, m - 1) 仍是组合数,f(n, m) = f(n - 1, m) + f(n - 1, m - 1)
6. 筛法:枚举底数 i,枚举多少倍 j,筛掉 i * j,O(n log n);
7. 埃氏筛:从 i 入手优化,i 只需要枚举质数;O(n log log n)
8. 欧拉筛:从 j 入手优化,j 只需要枚举质数且只需要枚举到 i 的最小质因子,O(n)
9. 欧拉筛的证明:考虑归纳法,主要用到的性质是:一个数除掉最小质因子后,最小质因子只可能变大,由此可知任意合数都会被筛到且只被筛一次
10. 最短路问题:存图考虑邻接矩阵/邻接表/前向星
11. 全源最短路:floyd,三个循环,一定是 kij 的顺序
12. 单源最短路:Bellman-Ford,松弛操作:d(v) <= d(u) + w,每轮松弛所有边,进行 n - 1

 

 

 

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

 

posted @ 2023-07-28 19:42  王浩泽  阅读(23)  评论(0编辑  收藏  举报