随机化好题,但是不会证。


考虑把树看成一条链,链的每个点上缀了一棵树。

那么先随机出两个点 \(x,y\)(实际上随机一个点,另一个点固定似乎更好?),然后对于当前这棵树上的任意点 \(z\),都让他进行一次询问,答案为 \(o=Q(x,y,z)\)。

那么当 \(o=z\) 时,显然 \(z\) 在链上,否则 \(z\) 在 \(o\) 的子树中。

对于每个链上的点的子树,递归处理就可以;而链的形态,直接对链进行排序即可,\(cmp\) 函数容易想到,就是 \([Q(x,a,b)=a]\)。

排序询问次数为 \(O(l\log l)\),确定子树询问次数为 \(O(m)\),其中 \(l\) 为链长,\(m\) 为当前子树大小。由于度数很小,可以通过,而且非常优秀。

#include<bits/stdc++.h>
#include "meetings.h"
using namespace std;
int Query(int u,int v,int w);
void Bridge(int u,int v);
const int N=2005;int rt;
mt19937 rnd(20100226);
void bridge(int u,int v){
if(u>v) swap(u,v);
Bridge(u,v);
}int cmp(int x,int y){
return Query(rt,x,y)==x;
}void build(vector<int>g,int x){
int n=g.size();if(n==1) return;
if(n==2) return bridge(g[0],g[1]);
int y=g[rnd()%n];vector<int>ve,v[N];
while(y==x) y=g[rnd()%n];
ve.push_back(x),ve.push_back(y);
v[x].push_back(x),v[y].push_back(y);
for(auto nw:g){
if(nw==x||nw==y) continue;
int fa=Query(x,y,nw);
if(fa==nw) ve.push_back(nw);
v[fa].push_back(nw);
}rt=x,sort(ve.begin()+1,ve.end(),cmp);
for(int i=0;i<ve.size();i++){
if(i) bridge(ve[i-1],ve[i]);
build(v[ve[i]],ve[i]);
}
}void Solve(int n){
vector<int>g;
for(int i=0;i<n;i++)
g.push_back(i);
build(g,0);
}

[JOISC2019] 聚会 题解的更多相关文章

  1. JOISC2019 简要题解

    第18回 日本情報オリンピック 春合宿 オンラインコンテスト (JOISC2019) 官网 Day 1 試験 (Examination) description 有\(N\)个学生,每个学生有两科成绩 ...

  2. toj 4602 松鼠聚会

    题目: 草原上住着一群小松鼠,每个小松鼠都有一个家.时间长了,大家觉得应该聚一聚.但是草原非常大,松鼠们都很头疼应该在谁家聚会才最合理. 每个小松鼠的家可以用一个点x,y表示,两个点的距离定义为:点( ...

  3. 【题解】Luogu P5361 [SDOI2019]热闹又尴尬的聚会

    原题传送门 构造题. 明显p,q都越大越好 我们考虑每次取出度最小的点,加到尴尬聚会的集合中(因为把与它相邻的点全删了,不珂能出现认识的情况),把它自己和与自己相连的点从图上删掉(边也删掉),记下这个 ...

  4. 题解 BZOJ 1037 & Luogu P2592 [ZJOI2008]生日聚会

    BZOJ & Luogu 老师说是背包?并没看出来QAQ 设f[i][j][o][p]表示已经选了i个人,j个男生,男生比女生最多多o个,女生比男生最多多p个时的方案数 两种转移: <= ...

  5. 题解 [BZOJ1832][AHOI2008] 聚会

    题面 解析 首先对于其中的两个点\(x,y\)最近的点显然就是他们的\(lca\)(我们把它设为\(p1\)), 然后考虑第三个点\(z\)与\(p1\)的\(lca,p2\). 有以下几种情况: \ ...

  6. 【简】题解 AWSL090429 【聚会】

    这题直接换根dp 记录在要转移的点的子树中有多少牛 #include<bits/stdc++.h> using namespace std; #define ll long long #d ...

  7. 暑假训练round 3 题解

    今天做题运气出奇的好,除了几处小错误调试之后忘记改掉了……最后还AK了……虽然题目不难,学长也说是福利局,但是对个人的鼓励作用还是挺大的……至此暑假训练就结束了,也算没有遗憾……. 题解如下: Pro ...

  8. BZOJ3170: [Tjoi 2013]松鼠聚会

    3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 531  Solved: 249[Submit][Statu ...

  9. BZOJ 3170: [Tjoi 2013]松鼠聚会 切比雪夫距离

    3170: [Tjoi 2013]松鼠聚会 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  10. tyvj1161聚会的名单(trie树)

    背景 Background 明天就是candy的生日,candy又会邀请自己的一大堆好友来聚会了!哎!又要累坏飘飘乎居士了!! 描述 Description     明天就是candy的生日.晚上,c ...

随机推荐

  1. 记一次 .NET某差旅系统 CPU爆高分析

    一:背景 1. 讲故事 前些天训练营里的一位学员找到我,说他们的差旅后台系统出现了CPU爆高的情况,爆高之后就下不去了,自己分析了下也没找到原因,事情比较紧急,让我帮忙看下是什么回事,手里也有dump ...

  2. 从Delphi到Lazarus——Delphi转换器

    0.前言 在Lazarus中使用Delphi编写的文件是一件很简单的事情,这是因为Lazarus可以直接打开Delphi的任何文件,甚至有些文件可以不做任何修改就可以直接使用到你的Lazarus程序中 ...

  3. 鸿蒙UI开发快速入门 —— part08: 组件状态管理之@Provide/@Consume装饰器

    1.说在前面的话 在此之前,我们已经先后学习了三个装饰器:@State.@Props.@Link,它们的功能和使用场景分别是什么?暂停会议一下. 我们目前已经可以处理组件内状态(@State),也可以 ...

  4. 在app內建web server

    这几年在三家企业都使用 app 內建 web server 的技术方案.效果很好. 该方案顾名思义,就是在 app 中加入一个 embed webserver 组件.组件和app运行于同一进程空间.程 ...

  5. helm values reference other values

    https://helm.sh/docs/chart_template_guide/yaml_techniques/#yaml-anchors https://helm.sh/zh/docs/char ...

  6. Macos 安装md5sum、sha1sum、md5deep、sha1deep

    一.安装md5sum和sha1sum 方法一:brew 安装 # brew install md5sha1sum 方法二:编译安装 源码下载地址:http://www.microbrew.org/to ...

  7. Qt编写物联网管理平台48-特色功能设计

    一.前言 在物联网管理平台的实际现场应用过程中,遇到过大大小小几十个改进的需求点,这些需求点都是实际用户提出来的,一方面为了方便用户使用提高用户体验,一方面为了提升整体的整个系统的完整性,甚至有些需求 ...

  8. 11.14javaweb学习

  9. 利用Navicat向MySQL数据库中批量插入多条记录的方法

    利用Navicat向MySQL数据库中批量插入多条记录的方法: 1.执行包含多条记录的SQL脚本 当VALUES后面的值与表中的字段相比,缺少某些字段时,可采用指定相应的字段名的方式批量插入数据: I ...

  10. 基于 Admission Webhook 实现 Pod DNSConfig 自动注入

    本文主要分享如何使用 基于 Admission Webhook 实现自动修改 Pod DNSConfig,使其优先使用 NodeLocalDNS . 1.背景 上一篇部署好 NodeLocal DNS ...