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; }
标签:int,sum,cin,long,集训,freopen,Day From: https://www.cnblogs.com/wjk53233/p/17588768.html