給出\(n\)個點,\(m\)次動態插入一條無向邊詢問:割掉一些邊使得圖中至少兩點不連通,並且割掉的邊異或和最大。
詢問之間相互獨立
\(1\leq n\leq 500,1\leq m\leq 1000\)
邊權以二進位制形式給出,長度不超過\(1000\)
要求分隔兩個點,看起來很麻煩,其實有個結論。先定義\(w_i\)表示連線\(i\)的所有邊的異或和,如果選出了乙個點集\(u\)和外面的所有點都隔絕,那麼割就是點集\(u\)中所有點的\(w_i\)值異或和。
其實挺顯然的,因為如果兩個點集中的點\(x,y\)之間的邊被異或了兩次就抵消掉了。
那麼現在問題就變為了每次修改兩個數,求最大異或和。
然後就是帶修線性基的裸題了,有兩種方法
每次你刪除乙個元素\(x\)的時候,假設集合\(s\)中儲存了所有插入的時候異或了\(x\)的元素(包括\(x\)本身),那麼我們找出乙個最小的\(y\in s\)(異或後),讓所有\(s\)中的其他元素異或上\(y\)之後再將\(y\ xor\ c\)插入(\(c\)表示你要讓\(x\)異或的值)
此時就相當於你將之前插入\(x\)時本應該異或的數變成了異或\(x\ xor\ c\)的,選出最小的\(y\)防止對後面的元素產生影響,然後修改後讓\(y\)代替\(x\)成為新的主元插入。
加乙個\(bitset\)優化,時間複雜度\(o(\frac)\)
離線的做法是線段樹分治,乙個\(x\)的取值會被分為不同的時間段,每次將\(x\)的固定的時間段插入到線段樹的對應區間,然後分治下去的時候維護乙個撤銷線性基就好了。
時間複雜度\(o(\frac)\)(也許?)
#include#include#include#includeusing namespace std;
const int n=1010;
bitsetw[n],v[n],c,ans;
int n,m,p[n];char s[n];
void insert(int x)
} return;
}void change(int x)
if(!pos)
for(int i=0;i=0;i--)
if(!flag)puts("0");
else putchar('\n');
} return 0;
}
網路的最大流最小割定理
什麼是流 flow 在乙個有向圖中,只有出去的邊沒有進來的邊的節點叫做源 source 只有進來的邊沒有出去的邊的節點叫做匯 sink 其它的節點進來的邊和出去的邊應該是平衡的。邊上可以加權值,假設對於乙個交通圖來說,可以認為邊上的權重為一條道路上的最大流量。那麼對於圖中任意兩個節點來說,它們之間可...
網路的最大流最小割定理
什麼是流 flow 在乙個有向圖中,只有出去的邊沒有進來的邊的節點叫做源 source 只有進來的邊沒有出去的邊的節點叫做匯 sink 其它的節點進來的邊和出去的邊應該是平衡的。邊上可以加權值,假設對於乙個交通圖來說,可以認為邊上的權重為一條道路上的最大流量。那麼對於圖中任意兩個節點來說,它們之間可...
最大流最小割定理與最小割的數學模型
一.最大流最小割定理.割 對於一張網路,我們稱乙個邊集的子集為乙個割,當且僅當去掉這個邊集的子集後源點s ss無法到達匯點ttt.最小割 邊權和最小的割被稱為最小割.最大流 最小割定理 一張網路的最大流等於其最小割的邊權之和.這個東西太經典了這裡就不證了.二.輸出一種最小割的方案.先跑一遍最大流得到...