日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

CF986C AND Graph

發布時間:2024/1/17 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF986C AND Graph 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

半年前做的一道題現在還是不會

x&y=0

意味著,x的補集的子集都是和x直接相連的

不妨令圖中的點數就是2^n

那么可以直接從x^((1<<n)-1)開始記憶化爆搜,路上遇到的都是和x直接相連的

如果遇到一個在給出集合里的數t,就從這個點額外再開一層,t^((1<<n)-1)再開始爆搜

這樣,如果兩個點直接或者間接相連,那么一定可以從任意一個點出發搜出整個連通塊,并對每個點打上標記

總共的狀態數是2^22。復雜度有保證

?

loc只是一個理解,其實不需要

#include<bits/stdc++.h> using namespace std; const int N=(1<<22)+10; int exi[N]; bool vis[N];// zuo i youwu vis bool has[N];// you i youwu vis int cnt,mx,len,up; int a[N]; int n,m; void dfs(int x,int loc){//cout<<x<<" now "<<cnt<<endl;if(loc){if(has[x]) return;has[x]=1;if(exi[x]) {vis[exi[x]]=1;dfs(a[exi[x]],0);}for(int i=0;(1<<i)<=x;i++){if(x&(1<<i)){dfs(x^(1<<i),1);}}}else{vis[exi[x]]=1;dfs(up^x,1);} } int main() {/*lg[0]=0;for(int i=1;i<=N-5;i++) lg[i]=(i>>(lg[i-1]+1))?lg[i-1]+1:lg[i-1];*/scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d",&a[i]),exi[a[i]]=i,mx=max(mx,a[i]);}for(int i=0;i<=23;i++){if((1<<i)>mx) break;len=i+1;}up=(1<<len)-1;//cout<<" up "<<up<<endl;for(int i=1;i<=m;i++){if(!vis[i]) {//cout<<"here go "<<i<<" "<<a[i]<<endl;cnt++;dfs(up^a[i],1);}}printf("%d",cnt);return 0; }

?

轉載于:https://www.cnblogs.com/Miracevin/p/10430799.html

總結

以上是生活随笔為你收集整理的CF986C AND Graph的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。