uoj#751-[UNR #6]神隐【交互】

1|0正题

题目链接:https://uoj.ac/problem/751


1|1题目大意

有一棵n个点的树,你每次可以选择一个边集,交互库会返回你所有联通块,要求这棵树。

n2000,操作次数不超过14

n131072,操作次数不超过20


1|2解题思路

一个神奇的做法,设操作次数为T,我们发现有CTT2n1,我们可以给所有边一个独特的编号ai满足其是一个T位二进制数且其中恰好有T21

这样对于一个叶子来说它就恰好在T2次询问中是一个单独的连通块,然后我们每次暴力找出叶子删掉即可。

至于一个叶子的父节点是谁,我们在一个连通块删除的只剩下一个点x时,我们考虑x的儿子,那么在过这个连通块的节点肯定都在x的子树中,此时取出还没有父节点的点,它们的父节点设为x即可。

时间复杂度:O(nlogn)


1|3code

#include"tree.h" #include<algorithm> #include<vector> #include<queue> using namespace std; const int N=1<<17,M=20; int T,cnt,a[N],g[N],ans[N],fa[N]; int r[1<<M],c[M][N],col[M][N]; vector<vector<int> >ret[M];bool v[N]; vector<pair<int,int> > e;queue<int> qe; vector<pair<int,int> > solve(int n){ T=(n<=2000)?14:20;int cnt=0,MS=1<<T; for(int i=0;i<MS;i++) if(__builtin_popcount(i)==T/2){ a[cnt]=i;r[i]=cnt++; if(cnt==n-1)break; } vector<int> q;q.resize(n-1); for(int i=0;i<T;i++){ for(int j=0;j<n-1;j++)q[j]=((a[j]>>i)&1); ret[i]=query(q); for(int j=0;j<ret[i].size();j++){ for(int k=0;k<ret[i][j].size();k++) col[i][ret[i][j][k]]=j; if(ret[i][j].size()==1)g[ret[i][j][0]]++,ans[ret[i][j][0]]|=(1<<i); c[i][j]=ret[i][j].size(); } } for(int i=0;i<n;i++) if(g[i]==T/2)qe.push(i),v[i]=1; int x; while(!qe.empty()){ x=qe.front();qe.pop();v[x]=1; for(int i=0;i<T;i++){ int z=col[i][x];c[i][z]--; if(c[i][z]==1){ int y=0,rt=-1; for(int j=0;j<ret[i][z].size();j++){ y=ret[i][z][j]; if(!v[y]){ g[y]++;ans[y]|=(1<<i); if(g[y]==T/2)qe.push(y); rt=y;break; } } if(rt==-1)continue; for(int j=0;j<ret[i][z].size();j++){ if(ret[i][z][j]==y||fa[ret[i][z][j]])continue; fa[ret[i][z][j]]=y+1; } } } } MS--;e.resize(n-1); for(int i=0;i<n;i++) if(i!=x) e[r[MS^ans[i]]]=make_pair(fa[i]-1,i); return e; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/16579609.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(60)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2021-08-12 P4022-[CTSC2012]熟悉的文章【广义SAM,dp,单调队列】
2021-08-12 2021“MINIEYE杯”中国大学生算法设计超级联赛(8)(1002,1004,1006,1009)
2021-08-12 Loj#6503-「雅礼集训 2018 Day4」Magic【分治NTT】
点击右上角即可分享
微信分享提示