Codeforces Round #173 (Div. 2)

acm_cxlove發表於2013-03-14

轉載請註明出處,謝謝http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 

首先先大概的流水帳一下吧。。。

註冊了一個小號,準備打一打

A題很水,提交的時候熄燈了,斷網,耽誤了一下。

看了B題之後發現不會,然後看了C題

隨便YY了一下,就交了一發(竟然是對的!!!)

然後看一下D題,然後發現不是可以轉換成3堆的,然後DP一下嗎

其實是4方DP,會TLE的。然後就全場第一個過了D的pt

嚇傻了,其實我沒有仔細想一下複雜度的問題。

然後把B,E都看了一下。。。。

B題大致瞎搞了一下交了,E題是Dshawn在帝都時給我出的類似一個題

做不出E真的是辜負了Dshawn啊,不過也圍觀了Dshawn WA 9,切JJ

水一下,cha了幾個C就去睡覺了。。。


A:水題

B:注意a+g==1000以及差在500以內等奇葩條件,其實每一步貪心就行了, 肯定有解

C:大致是這樣的,如果兩個串一樣,肯定可以,如果兩個串長度不一樣,肯定不可以。

然後可以發現0 0怎麼搞還是0 0,不是0 0 怎麼搞都搞不出0 0

然後就是判斷一下兩個串中是否只有0.

cha點在於好多人忽略了兩個串都只有0的情況,這種情況是有解的

否則一個全零,另一個不是,就是無解了

D:n=1肯定是先手贏

      n=2是個威佐夫博弈

      n=3等價一個Nim博弈,好神奇的題。

      4方DP其實是可以過的,不要遞迴,寫成遞推,然後優化優化,TAT


E:把所有的字首加入到Trie中,然後列舉所有的字尾,在Trie樹中貪心查詢。

注意一下字首和字尾可能為空的情況

struct Trie{
    Trie *son[2];
    LL val;
}*root;
int n;
LL a[100005];
LL ans=0,sum=0;
Trie *NewNode(){
    Trie *tmp=new Trie;
    tmp->val=0;
    tmp->son[0]=tmp->son[1]=NULL;
    return tmp;
}
void insert(Trie *root,LL num){
    int bit[100];
    Trie *p=root;
    for(int i=0;i<=40;i++) 
        bit[i]=1&(num>>i);
    for(int i=40;i>=0;i--){
        if(p->son[bit[i]]==NULL)
            p->son[bit[i]]=NewNode();
        p=p->son[bit[i]];
    }
    p->val=num;
}
LL query(Trie *root,LL num){
    int bit[100];
    Trie *p=root;
    for(int i=0;i<=40;i++) 
        bit[i]=1&(num>>i);
    for(int i=40;i>=0;i--){
        if(p->son[bit[i]^1])
            p=p->son[bit[i]^1];
        else 
            p=p->son[bit[i]];
    }
    return num^p->val;
}
int main(){
    cin>>n;
    root=NewNode();
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum^=a[i];
        insert(root,sum);
        ans=max(ans,sum);
    }
    insert(root,0);
    sum=0;
    for(int i=n;i;i--){
        sum^=a[i];
        ans=max(ans,query(root,sum));
    }
    cout<<ans<<endl;
    return 0;
}


相關文章