原題傳送門
序列異或最大,或者最小,都可以用線性基來算,至於線性基是什麼,可以看看線性基詳解。
因為要避免選中我們所刪除的數字,但是這樣很難做到。
所以可以逆向思維考慮一下,如果我們從後往前推,每刪除乙個數字,就是加入乙個新的數字,並且,如果它左右兩邊已經有數字了,就可以把它們並為乙個集合,否則它就是單獨乙個集合。
理解起來挺容易的。
#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覺得太簡單了,由於戰爭原因,某些城市會被飛彈銷毀掉,與之相應的道路也變得不可用。之前已經被銷毀的不...