#include #include #include #include #include using namespace std; const int oo=0x3f3f3f3f; const int MAX=120; const int head=0; int up[MAX*MAX],down[MAX*MAX],left[MAX*MAX],right[MAX*MAX]; int cnt[MAX],h[MAX],col[MAX*MAX]; int K,ans; int nc; void remove(const int& c){ for(int i=down[c];i!=c;i=down[i]){ left[right[i]]=left[i]; right[left[i]]=right[i]; cnt[col[i]]--; } } void resume(const int& c){ for(int i=up[c];i!=c;i=up[i]){ left[right[i]]=i; right[left[i]]=i; cnt[col[i]]++; } } int evalute(){ bool vis[MAX]={0}; int ret=0; for(int i=right[head];i!=head;i=right[i]){ if(!vis[i]){ ret++; vis[i]=true; for(int j=down[i];j!=i;j=down[j]){ for(int k=right[j];k!=j;k=right[k]){ vis[col[k]]=true; } } } } return ret; } bool dfs(const int& k){ if(k+evalute()>ans){ return false; } if(right[head]==head){ return true; } int s=oo,c=0; for(int i=right[head];i!=head;i=right[i]){ if(cnt[i]