当前位置: 首页 > news >正文

CF1370F The Hidden Pair 解题报告:祝贺我首次切出 2700!

祝贺我首次切出 2700!

写个题解纪念。

在这里顺带推销一下我的交互题单。

令两个点分别为 \(x\)\(y\),下文所说的“链”的端点为这两个点。

考虑到一开始我们啥也不知道,先整体感知一下,查询一下所有点。那么可以得到链的长度 \(l\) 和链上的一个点 \(u\)

然后考虑到如果我们已经知道了链的一个端点,直接询问与这个点距离为 \(l\) 的所有点,返回的答案就是另一个点了。所以考虑先把一个端点求出来。

然后就是一些比较智慧的东西了,考虑如下倍增算法:令 \(r=u\)。从大到小遍历所有 \(2\) 的幂。每次查询除了在 \(u\)\(r\) 路径上的,所有与 \(r\) 距离 \(2^i\) 的点。如果返回的最小值是 \(l\),那么用返回的点更新 \(r\)。因为这个点一定在链上。倍增完就可以找到一个端点了。

考虑询问次数:\(1+10+1=12\),倍增是 \(2^9\)\(2^0\)。可以通过 Easy ver,比 Hard ver 只多一次,能不能再给力点呢?

继续压榨现在的算法。如果 \(l < 512\),倍增就只需要 \(9\) 次了。如果 \(l \ge 512\),那么肯定 \(l \ge \frac{n}{2}\)。根号分治地,链一定经过重心。然后将 \(u\) 改为树的重心执行上述倍增就行,因为每一个子树不大于 \(\frac{n}{2} \le 500 < 512\),也可以 \(9\) 次倍增。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e3 + 7;
int n, sz[N], mx[N], dep[N], cen, fa[N];
set<int> pth;
vector<int> g[N], tmp;
pair<int, int> Misaka(vector<int> c){cout << "? " << c.size() << " ";for(int x: c) cout << x << " ";cout << endl;int A, B; cin >> A >> B;return {A, B};
}
void addpth(int u, int v){pth.insert(u), pth.insert(v);if(dep[u] < dep[v]) swap(u, v);while(dep[u] > dep[v]){u = fa[u];pth.insert(u);}if(u == v) return;while(u != v){u = fa[u], v = fa[v];pth.insert(u), pth.insert(v);}
}
void find(int u, int pre, int dis, int opt){if(!dis){if((!opt) || (!pth.count(u))) tmp.push_back(u);return;}for(int v: g[u]){if(v != pre) find(v, u, dis - 1, opt);}
}
void get(int u, int pre){dep[u] = dep[pre] + 1;fa[u] = pre;sz[u] = 1, mx[u] = 0;for(int v: g[u]){if(v != pre){get(v, u);mx[u] = max(mx[u], sz[v]);sz[u] += sz[v];}}mx[u] = max(mx[u], n - sz[u]);if(cen == -1 || mx[u] < mx[cen]) cen = u;
}
void solve(){cin >> n;for(int i = 1; i <= n; i ++) g[i].clear();for(int i = 1; i < n; i ++){int u, v; cin >> u >> v;g[u].push_back(v);g[v].push_back(u);}tmp.clear();for(int i = 1; i <= n; i ++) tmp.push_back(i);int cur, len; tie(cur, len) = Misaka(tmp);cen = -1, get(1, 0);if(len >= 512) cur = cen;pth.clear(); pth.insert(cur);for(int i = (1 << 8); i; i >>= 1){tmp.clear(), find(cur, 0, i, 1);if(tmp.empty()) continue;int D, L; tie(D, L) = Misaka(tmp);if(L > len) continue;addpth(cur, D), cur = D;}tmp.clear(), find(cur, 0, len, 0);int ans, tt; tie(ans, tt) = Misaka(tmp);cout << "! " << cur << " " << ans << endl;string res; cin >> res;
}
signed main(){ios::sync_with_stdio(0), cin.tie(0);int t; cin >> t;while(t --) solve();return 0;
}
http://www.jsqmd.com/news/678378/

相关文章:

  • Bootstrap自采样:用R语言从零模拟,搞懂这个统计‘黑魔法’到底在做什么
  • 别再硬编码半径了!用Cesium的CallbackProperty实现鼠标拖拽画圆(附完整代码)
  • CMake条件判断避坑指南:从‘23a EQUAL 23’的诡异结果说起
  • 思源宋体TTF终极指南:7种字重免费商用中文排版解决方案
  • SAP OOALV隐藏按钮避坑指南:别再用`no_toolbar`了,这才是正确姿势
  • 手把手教你复现UEditor 1.4.3.3的XML上传漏洞:从XSS到SSRF的实战演练
  • 保姆级教程:用SSH远程连接你的WSL2,并配置端口转发实现外网访问(附常见错误排查)
  • 3步实现微信平板模式:免Root安卓多设备登录终极方案
  • 2026年蜂窝板防潮技术实测解析与批发价参考:吊顶包工包料/吊顶铝扣板/商铺蜂窝板吊顶/墙面蜂窝板/奶油风吊顶/选择指南 - 优质品牌商家
  • 这篇带你彻底拿捏Redis数据结构 !
  • 唯杰地图扩展包CAD图层加高性能特效发布
  • Android 7.1开机后上不了网?手把手教你排查APN加载与DcTracker拨号流程
  • 手把手教你用Xilinx SDK调试Zynq-7000的PS和PL端CAN总线(附波特率计算与宇泰CAN卡对接)
  • 番茄小说下载器完整指南:一键将在线小说转为EPUB电子书和有声读物
  • 智能图像检索利器:Chord(Qwen2.5-VL)模型部署与使用教程
  • Phi-3.5-mini-instruct开源镜像:无需license的商用级多语言LLM部署方案
  • MetaShark终极指南:5分钟打造完美Jellyfin媒体库的元数据插件
  • OpenCV圆检测实战:用HoughCircles给模糊的细胞显微图片‘数细胞’,附完整Python代码
  • 终极指南:3步掌握N_m3u8DL-RE的流媒体下载魔法
  • Simulink AUTOSAR建模:Constant Memory、Shared与Per-Instance Parameter到底怎么选?看生成代码就懂了
  • 2026年4月成都虫控防治公司排行 实用选购指南 - 优质品牌商家
  • Matlab feedback函数避坑指南:正负反馈傻傻分不清?多输入输出连接老是报错?看这篇就够了
  • 除了90DNS,用梅林路由给Switch“软改”网络环境:一次配置,全家设备生效的避坑指南
  • 张家港市科尔曼机械有限公司:灌装生产线、矿泉水生产线、饮料生产线、纯净水生产线优质供应商与行业精选推荐 - 海棠依旧大
  • 哪些降重软件在降低AIGC疑似度的同时也能有效降重复率?
  • Visual C++ Redistributable AIO终极指南:一站式解决Windows应用依赖问题的5个关键场景
  • 郑州市春园婚姻介绍所:专业婚介与婚恋服务优选,靠谱婚恋机构助力安心脱单 - 海棠依旧大
  • 金三银四突击必备:Java架构六大核心专题面试宝典!
  • NPK文件解包终极指南:如何快速提取网易NeoX游戏资源
  • SolidWorks钣金折弯实战:从‘干涉’报错到搞定铝合金面板固定口的完整流程