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