1. 程式人生 > >[BZOJ3569]DZY Loves Chinese II(隨機化+線性基)

[BZOJ3569]DZY Loves Chinese II(隨機化+線性基)

limit ont cte const EDA return discuss 接下來 center

3569: DZY Loves Chinese II

Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 1515 Solved: 569
[Submit][Status][Discuss]

Description

神校XJ之學霸兮,Dzy皇考曰JC。 攝提貞於孟陬兮,惟庚寅Dzy以降。 紛Dzy既有此內美兮,又重之以修能。 遂降臨於OI界,欲以神力而淩♂辱眾生。 今Dzy有一魞歄圖,其上有N座祭壇,又有M條膴蠁邊。 時而Dzy狂WA而怒發沖冠,神力外溢,遂有K條膴蠁邊灰飛煙滅。 而後俟其日A50題則又令其復原。(可視為立即復原) 然若有祭壇無法相互到達,Dzy之神力便會大減,於是欲知其是否連通。

Input

第一行N,M 接下來M行x,y:表示M條膴蠁邊,依次編號 接下來一行Q 接下來Q行: 每行第一個數K而後K個編號c1~cK:表示K條邊,編號為c1~cK 為了體現在線,c1~cK均需異或之前回答為連通的個數

Output

對於每個詢問輸出:連通則為‘Connected’,不連通則為‘Disconnected’ (不加引號)

Sample Input

5 10
2 1
3 2
4 2
5 1
5 3
4 1
4 3
5 2
3 1
5 4
5
1 1
3 7 0 3
4 0 7 4 6
2 2 7
4 5 0 2 13

Sample Output

Connected
Connected
Connected
Connected
Disconnected

HINT

N≤100000 M≤500000 Q≤50000 1≤K≤15

數據保證沒有重邊與自環

Tip:請學會使用搜索引擎



Source

By dzydaxueba

[Submit][Status][Discuss]

BZOJ3237的強制在線版,卡掉了CDQ分治。

有一種很神的隨機化,配合線性基解決。

 1 #include<cstdio>
 2
#include<cstring> 3 #include<algorithm> 4 #include<cstdlib> 5 #define rep(i,l,r) for (int i=l; i<=r; i++) 6 #define For(i,x) for (int i=h[x],k; i; i=nxt[i]) 7 typedef long long ll; 8 using namespace std; 9 10 const int N=400010,M=1000010,SS=1000000000; 11 int n,m,Q,cnt=1,u,v,x,k,ans,h[N],nxt[M],to[M],val[N],fa[N],a[45]; 12 bool vis[N],use[M]; 13 struct E{ int x,y,v; }e[M]; 14 void add(int u,int v){ nxt[++cnt]=h[u]; h[u]=cnt; to[cnt]=v; } 15 16 void dfs(int x,int f){ 17 vis[x]=1; 18 For(i,x) if ((k=to[i])!=f && !vis[k]) use[i>>1]=1,fa[k]=x,dfs(k,x); 19 } 20 21 void dfs2(int x){ 22 For(i,x) if (fa[k=to[i]]==x) 23 dfs2(k),e[i>>1].v^=val[k],val[x]^=val[k]; 24 } 25 26 int main(){ 27 freopen("bzoj3569.in","r",stdin); 28 freopen("bzoj3569.out","w",stdout); 29 scanf("%d%d",&n,&m); srand(20020223); 30 rep(i,1,m) scanf("%d%d",&e[i].x,&e[i].y),add(e[i].x,e[i].y),add(e[i].y,e[i].x); 31 dfs(1,0); 32 rep(i,1,m) if (!use[i]) x=rand()%SS+1,e[i].v=x,val[e[i].x]^=x,val[e[i].y]^=x; 33 dfs2(1); scanf("%d",&Q); 34 while (Q--){ 35 scanf("%d",&k); memset(a,0,sizeof(a)); bool f=1; 36 rep(i,1,k){ 37 scanf("%d",&x); x^=ans; x=e[x].v; 38 for (int j=30; ~j; j--){ 39 if (!((x>>j)&1)) continue; 40 if (!a[j]) { a[j]=x; break; } 41 x^=a[j]; 42 } 43 if (!x) f=0; 44 } 45 if (!f) puts("Disconnected"); else puts("Connected"),ans++; 46 } 47 return 0; 48 }

[BZOJ3569]DZY Loves Chinese II(隨機化+線性基)