無效位置 逆向思維 並查集 線性基

2021-10-02 01:54:16 字數 1259 閱讀 6413

原題傳送門

序列異或最大,或者最小,都可以用線性基來算,至於線性基是什麼,可以看看線性基詳解。

因為要避免選中我們所刪除的數字,但是這樣很難做到。

所以可以逆向思維考慮一下,如果我們從後往前推,每刪除乙個數字,就是加入乙個新的數字,並且,如果它左右兩邊已經有數字了,就可以把它們並為乙個集合,否則它就是單獨乙個集合。

理解起來挺容易的。

#include

#define ll long long

using

namespace std;

const

int mx=

1e5+9;

struct node

void

clear()

bool

ins(ll val)

val^

=d[i];}

}return val>0;

} ll quemax()

ll quemin()

void

rebuild()

}for

(int i=

0; i<=

60; i++)if

( d[i]

) kth[cnt++

]=d[i];}

// ll quekth(ll k)

// void merge(const node &b)

}t[mx]

;int n;

int fa[mx]

,pos[mx]

;ll val[mx]

,ans[mx]

;int

fin(

int x)

void

unite

(int x,

int y)

}int

main()

if( fa[temp+1]

)if( mxfin(temp)].

quemax()

)// 拿新生成的集合的答案,和,原來最大的答案,進行比較

mx=t[

fin(temp)].

quemax()

; ans[i]

=mx;

}for

(int i=

1; i<=n ; i++

)printf

("%lld\n"

,ans[i]);

return0;

}

逆向並查集

題目 題目.題意 有n個戰艦 0 n 1 每個戰艦有乙個戰鬥力,然後輸入乙個m表示m對戰艦聯合,然後輸入乙個q表示q次查詢。接下來q行有兩種輸入 1 query x 表示查詢和x戰艦聯合對戰艦中攻擊力最大的戰艦的編號 如果戰鬥力相同輸出小的編號 如果沒有就輸出 1.2 destroy x y 破壞x...

HDU 4496 並查集 逆向思維

給你n個點m條邊,保證已經是個連通圖,問每次按順序去掉給定的一條邊,當前的連通塊數量。與其正過來思考當前這邊會不會是橋,不如倒過來在n個點即n個連通塊下建圖,檢查其連通性,就能知道個數了 date 2017 09 21 23 26 20 filename hdu 4496 並查集 逆向思維.cpp ...

C City 逆向並查集

時間限制 1 s 記憶體限制 128 mb 如果城市a和城市b互通,城市b和城市c互通,那麼城市a和城市c也互通,a b c三個城市算乙個聚集點。先已知有n個城市和m條道路,想求的是有幾個聚集點?但小s覺得太簡單了,由於戰爭原因,某些城市會被飛彈銷毀掉,與之相應的道路也變得不可用。之前已經被銷毀的不...