在MEL和WA之间徘徊,艰难地独立地AC了cowxor

在MEL和WA之间徘徊,艰难地独立地AC了cowxor


先是累加(xor,一开始真写成+了,结果查了那么久。。。。) 
然后作差,感觉类似单调DP,有一类单调DP使用平衡树的,但这个不需要用平衡树,只要用tire树。
考虑到0/1性和最坏情况下树的密集度,于是写了静态完全二叉树。。。。
于是MLE,然后降低maxa,RT,同时降低maxt,WA。
然后左右斟酌提交多次,MLE或WA。
最后卡常数,把树的前maxt-1层用bool,最后一层用int。。。。。AC了。。。。。
被改残的代码
/**//*
USER:zyn19961
TASK:cowxor
LANG:C++
*/

#include
<cstdio>
#include
<cstring>
#include
<fstream>
#include
<iostream>
#include
<algorithm> 
using namespace std;
//
#define MM(a,i) memset((a),i,sizeof(a))
#define FOR(i,l,r) for (int i=(l);i<=(r);i++)
#define DFOR(i,r,l) for (int i=(r);i>=(l);i--)
//
    typedef long long int64;
    
const int INF=~0U>>2;
    
const int maxa=(8388608+2)/2;
    
const int maxt=20;
    
const int maxn=100001;
//
    ifstream fin("cowxor.in");
    ofstream fout(
"cowxor.out");
//
    int bit[maxt+1];
    
bool tree[maxa];
    
int treen[maxa/2];
    
int aa[maxn];
    
int ans=0,ansa=1,ansb=1;
    
void insert(int i);//left:0 right:1
    void match(int i);
    
void show();
    
int main(){
        MM(bit,
0),MM(tree,0),MM(aa,0);
        
int n,t;
        fin
>>n;
        bit[
0]=1
        FOR(i,
1,maxt)bit[i]=bit[i-1]*2
        aa[
0]=0;FOR(i,1,n){
            fin
>>aa[i];
            
if(aa[i]>ans)ans=aa[i],ansa=ansb=i;
            aa[i]
^=aa[i-1];
            }

        FOR(i,
0,n){
            match(i);
            insert(i);
            }

        fout
<<ans<<" "<<ansa<<" "<<ansb<<"\n";
        fin.close();
        fout.close();
        
return 0
        }

    
void insert(int i){
        
int p=1,s=aa[i];
        DFOR(t,maxt,
0){
            tree[p]
=1;
            
if(s&bit[t])p=p*2+1;else p=p*2;
            }
tree[p]=1;
        
if(s==0)tree[p]=-1;
        
else treen[p-maxa/2]=i;
        }

    
void match(int i){
        
int anss=0,q,p=1,s=aa[i];
        DFOR(t,maxt,
0){
            q
=(s&bit[t])/bit[t];
            q
^=1;
            
if(q)if(tree[p*2+1])p=p*2+1,anss+=bit[t];
                
else p*=2;
            
else if(tree[p*2])p*=2,anss+=bit[t];
                 
else p=p*2+1;
            }

        
if(anss>ans)ans=anss,ansa=treen[p-maxa/2]+1,ansb=i;
        }

    
void show(){
        FOR(i,
0,maxt+1){
            FOR(j,
1<<i,(1<<(i+1))-1)
                printf(
"%d ",tree[j]);
                }

            printf(
"\n");
            }

        }

USACO的空间限制到底是多少????

你可能感兴趣的:(在MEL和WA之间徘徊,艰难地独立地AC了cowxor)