CF566E-Restoring Map【bitset】

1|0正题

题目链接:https://www.luogu.com.cn/problem/CF566E


1|1题目大意

有一棵树,但是你不知道它的形态。你现在只知道距离每个点距离不超过2的点集,但是你不知道每个点集是对应哪个点的。

现在要你求这棵树。

2n1000


1|2解题思路

考虑这样一种情况
在这里插入图片描述
那么??的交集恰好是xy,也就是所有非叶子的连边我们都可以用以上方式确定。

然后考虑怎么确定叶子的连边,对于叶子x来说,包含它的集合中最小的那个肯定是它自己的集合。

这样我们就可以确定每个叶子对应的集合了,然后考虑怎么求它的父亲。

会发现我们如果把叶子的集合中的叶子去掉,那就只剩下它的父节点和它父节点连接的其他非叶子节点。

我们再处理出一个非叶子节点连边的集合,然后一个一个比较就可以找到这个点的父亲了。

然后要特判一些情况:

  1. 没有非叶子节点:此时n=2直接特判。
  2. 只有一个非叶子节点:此时随便找一个点都可以当非叶子节点。
  3. 只有两个非叶子节点:此时叶子的集合分两种情况,分别对应不同的父节点就好了。

bitset优化即可做到O(n3ω)


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #include<bitset> #include<vector> #define mp(x,y) make_pair(x,y) using namespace std; const int N=1050; int n,k[N],f[N];; bitset<N> b[N],g[N],c,v; vector<pair<int,int> >e; int main() { scanf("%d",&n); for(int i=0;i<n;i++)f[i]=n,g[i][i]=1;k[n]=n+1; if(n==2)return puts("1 2")&0; for(int i=0;i<n;i++){ scanf("%d",&k[i]); for(int j=1,x;j<=k[i];j++){ scanf("%d",&x);x--;b[i][x]=1; f[x]=(k[i]<k[f[x]])?i:f[x]; } } for(int i=0;i<n;i++) for(int j=i+1;j<n;j++){ c=b[i]&b[j]; if(c.count()==2){ int a=c._Find_first(); int b=c._Find_next(a); e.push_back(mp(min(a,b),max(a,b))); g[a][b]=g[b][a]=v[a]=v[b]=1; } } if(v.count()==0){ for(int i=1;i<n;i++) printf("%d %d\n",i+1,1); return 0; } else if(v.count()==2){ int p=v._Find_first(); int q=v._Find_next(p); printf("%d %d\n",p+1,q+1); bool flag=0; for(int i=0;i<n;i++) if(!v[i]){ if(flag){ if(b[f[i]]==c) printf("%d %d\n",i+1,p+1); else printf("%d %d\n",i+1,q+1); } else printf("%d %d\n",i+1,p+1),c=b[f[i]],flag=1; } return 0; } for(int i=0;i<n;i++){ if(v[i])continue;b[f[i]]&=v; for(int j=0;j<n;j++) if(b[f[i]]==g[j]){e.push_back(mp(min(i,j),max(i,j)));break;} } sort(e.begin(),e.end()); for(int i=0;i<e.size();i++) if(!i||e[i]!=e[i-1])printf("%d %d\n",e[i].first+1,e[i].second+1); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/16404488.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2021-06-23 P4258-[WC2016]挑战NPC【带花树】
2021-06-23 P7099-[yLOI2020]灼【数学期望,结论】
2021-06-23 P3190-[HNOI2007]神奇游乐园【插头dp】
2021-06-23 P5056-[模板]插头dp
点击右上角即可分享
微信分享提示