給定乙個圖,每次加一些邊,或者刪掉一些後來加上去的邊,定義乙個環的價值為環上所有的邊的異或和,重複走的邊重複算。每次詢問這個時刻圖中的所有經過1號點的環的最大價值。
首先考慮對於乙個靜態的圖如何求解圖中所有經過1號點的環的最大價值,發現這個經過1號點就是唬人的,圖中任意乙個環都可以經過1號點再走回來。
於是題目變成了求解圖中環的最大價值,可以將圖中所有的簡單環給拎出來放到線性基裡面求最大價值,不難發現這是對的。
然後題目轉化為了如何求圖中所有的簡單環,一般我們可以直接對圖dfs找環,這個題目可以隨便建出一顆生成樹,任何一條非樹邊都對應了乙個簡單環,於是我們每次只需要在樹上加邊刪邊即可。
但是線性基不支援刪除啊,線段樹分治就好了。
/************************************====
* author : ylsoi
* time : 2019.4.3
* problem : luogu3733
* e-mail : [email protected]
* ***********************************=*/
#include#define rep(i,a,b) for(int i=a,i##_end_=b;i<=i##_end_;++i)
#define drep(i,a,b) for(int i=a,i##_end_=b;i>=i##_end_;--i)
#define debug(x) cout<<#x<<"="<,int>
typedef long long ll;
using namespace std;
void file()
templatevoid read(t &_)
string proc()
const int maxn=1000+10;
int n,m,q,tot;
struct edgee[maxn];
vectorg[maxn];
vectorlis;
bitsetdis[maxn];
void read_bitset(bitset&x)
void output(bitset&x,char ch='\n')
drep(i,p,0)putchar(x[i]+48);
putchar(ch);
}int fa[maxn];
int find(int x)
void dfs_init(int u,int fh)
void insert(bitsetx)
x^=b[i];
} }bitsetquery()
}t[21];
void init()
else lis.push_back(e[i]);
} dfs_init(n,0);
}#define mid ((l+r)>>1)
#define lc (o<<1)
#define rc (o<<1|1)
#define lson lc,l,mid
#define rson rc,mid+1,r
vector>t[maxn<<2];
void insert(int o,int l,int r,int l,int r,bitset&x)
}void divide(int o,int l,int r,int dep)
else
}vectortl[maxn];
void work()
rep(i,1,q));
} else if(opt[1]=='h'));
} else
} rep(i,1,cnt)rep(j,0,tl[i].size()-1)
divide(1,1,q+1,0);
}int main()
HAOI2017 八縱八橫
題目傳送門 分析 乙個熟練的oi選手 錯亂 會發現詢問其實就是在圖上找一些環使得異或和最大 感性分析 鏈結這些環的路徑會因為被經過了偶數次而異或起來被抵消掉 考慮求圖上的一顆生成樹,因為原圖上的高速路不會被取消,圖一定連通 否則可以用lct維護 有乙個結論 圖上任意乙個環都可以用若干個生成樹上一條路...
HAOI2017 新型城市化
題目 發現題目給了一張補圖,求的是最大團 而且隱隱約約告訴我們這張補圖是乙個二分圖 於是非常自然聯想到最大團等於補圖最大獨立集 最大獨立集又等於總點數 最小點覆蓋 最小點覆蓋 最大匹配 使得最大團增加就需要使得最大匹配減小 於是我們終於讀懂題目了,就是求二分圖匹配的必須邊 直接在殘量網路裡跑 tar...
VS2017學習C 基礎八(向量)
chapter08a04向量vector.cpp 動態陣列,可以在執行階段設定長度 具有陣列的快速索引方式 可以插入和刪除元素 include pch.h include include include using namespace std int main 向陣列中插入數字 vecdouble....