[BZOJ3569]DZY Loves Chinese II(随机化+线性基)
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
[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 }