Submission #215973

#TimeUsernameProblemLanguageResultExecution timeMemory
215973wendy_virgoXOR Sum (info1cup17_xorsum)C++14
100 / 100
1012 ms34364 KiB
#include <bits/stdc++.h> using namespace std; template<typename TH> void _dbg(const char* sdbg, TH h) { cerr << sdbg << " = " << h << "\n"; } template<typename TH, typename... TA> void _dbg(const char* sdbg, TH h, TA... t) { while (*sdbg != ',') cerr << *sdbg++; cerr << " = " << h << ","; _dbg(sdbg + 1, t...); } #define db(...) _dbg(#__VA_ARGS__, __VA_ARGS__) #define chkpt cerr << "--- Checkpoint here ---\n"; const int N=1e6+6; #define int64_t int int n; int64_t a[N],b[N],tmp[N],tmpB[N]; void Sub1(){ int ans=0; for(int i=1;i<=n;++i){ for(int j=i;j<=n;++j){ ans^=(a[i]+a[j]); } } cout<<ans<<'\n'; } void Sort(int pos){ vector<int> freq(2); for(int i=1;i<=n;++i){ freq[(a[i]>>pos)&(int64_t)1]++; } freq[1]+=freq[0]; for(int i=n;i>=1;--i){ int id=(a[i]>>pos)&(int64_t)1; b[freq[id]]=a[i]; tmpB[freq[id]]=tmp[i]; freq[id]--; } for(int i=1;i<=n;++i){ a[i]=b[i]; tmp[i]=tmpB[i]; } } int Check(int pos){ int res=0; vector<vector<int64_t>> vec(2); for(int i=1;i<=n;++i){ vec[(a[i]>>pos)&1].push_back(tmp[i]); } // assert(is_sorted(begin(vec[0]),end(vec[0]))); // assert(is_sorted(begin(vec[1]),end(vec[1]))); int ptr=(int)vec[0].size()-1; int ptr1=(int)vec[1].size()-1; for(int i=0;i<vec[0].size();++i){ int64_t val=((int64_t)1<<pos)-vec[0][i]; while(ptr>=0&&vec[0][ptr]>=val){ ptr--; } if(ptr+1<=i){ res^=(i-(ptr+1)+1)%2; } int64_t val1=((int64_t)1<<pos)-vec[0][i]; while(ptr1>=0&&vec[1][ptr1]>=val1){ ptr1--; } res^=(ptr1+1)%2; } ptr=(int)vec[1].size()-1; for(int i=0;i<vec[1].size();++i){ int64_t val=((int64_t)1<<pos)-vec[1][i]; while(ptr>=0&&vec[1][ptr]>=val){ ptr--; } if(ptr+1<=i){ res^=(i-(ptr+1)+1)%2; } } Sort(pos); for(int i=1;i<=n;++i){ if((a[i]>>pos)&1){ tmp[i]|=1<<pos; } } return res; } void Sub2(){ int64_t ans=0; for(int i=0;i<=30;++i){ if(Check(i)){ ans+=(int64_t)1<<i; } } cout<<ans; } void Gen(){ srand(time(0)); freopen("info1cup17_xorsum.inp","w",stdout); int n=rand()%5+1; cout<<n<<'\n'; for(int i=1;i<=n;++i){ cout<<rand()%10+1<<' '; } exit(0); } inline int ReadInt() { char c; int sign = 1; for (c = getchar(); c < '0' || c > '9'; c = getchar()) if (c == '-') sign = -sign; int res = c - '0'; for (c = getchar(); c >= '0' && c <= '9'; c = getchar()) res = res * 10 + c - '0'; return res * sign; } int32_t main() { // Gen(); // freopen("info1cup17_xorsum.inp","r",stdin); // freopen("info1cup17_xorsum.out","w",stdout); ios_base::sync_with_stdio(0); cin.tie(0); n=ReadInt(); for(int i=1;i<=n;++i){ a[i]=ReadInt(); } // Sub1(); Sub2(); return 0; }

Compilation message (stderr)

xorsum.cpp: In function 'int Check(int)':
xorsum.cpp:67:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<vec[0].size();++i){
                 ~^~~~~~~~~~~~~~
xorsum.cpp:82:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<vec[1].size();++i){
                 ~^~~~~~~~~~~~~~
xorsum.cpp: In function 'void Gen()':
xorsum.cpp:112:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
     freopen("info1cup17_xorsum.inp","w",stdout);
     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...