[loj3031]聚会
对于一棵树(初始仅包含节点0),不断加入一个不在树中的节点$u$(不需要随机),并维护这棵树
具体的,对这棵树点分治,假设当前重心$v$有$d$个子树,假设其中第$i$个子树根为$r_{i}$,子树大小为$s_{i}$,且不妨假设子树大小单调不上升(即$s_{1}\ge s_{2}\ge ...\ge s_{d}$)
初始令$i=1$,并询问$(u,r_{2i-1},r_{2i})$,并分类讨论:
1.若$u$在$r_{2i-1}$或$r_{2i}$的子树中,询问结果为$r_{2i-1}$或$r_{2i}$,递归询问结果的子树即可
2.若$u$在$r_{2i-1}$或$r_{2i}$到$v$的路径即其子树中,询问结果为$\ne u,r_{2i-1},r_{2i}$,再询问一次$(u,v,r_{2i-1})$即可
3.若$u$不为上述两种情况,询问结果为$v$,若$2i\ge d$则$u$为$v$的新儿子,否则令$i$增加1并重复此过程
(特别的,若$d$为奇数,我们认为$r_{d+1}=v$,且若为第二种情况,则一定在$r_{d}$到$v$的路径上)
下面,来考虑操作次数:
令$T(n)$为$n$个节点的子树中最大询问次数,考虑$u$结束的情况,即以下三种——
(为了方便,记$D=\min(n-1,18)$,显然$d\le D$)
1.在第一种情况下结束:假设在$i$时结束,则至多需要$T(s_{2i-1})+i$次(由于$s_{2i-1}\ge s_{2i}$)
显然有$\begin{cases}s_{i}\le \lfloor\frac{n}{2}\rfloor&(i=1)\\s_{i}\le \lfloor\frac{n-1}{i}\rfloor&(2\le i\le d)\end{cases}$,也即$T_{1}(n)=\max(T(\lfloor\frac{n}{2}\rfloor)+1,\max_{2\le i\le \lceil\frac{D}{2}\rceil}T(\lfloor\frac{n-1}{2i-1}\rfloor)+i)$
2.在第二种情况下结束:此时即询问$\lceil\frac{d}{2}\rceil+1$,即$T_{2}(n)=\lceil\frac{D}{2}\rceil+1$
3.在第三种情况下结束,此时即询问$\lceil\frac{d}{2}\rceil$次,同理即$T_{3}(n)=\lceil\frac{D}{2}\rceil$
最终$T(n)=\max(T_{1}(n),T_{2}(n),T_{3}(n))$,初始状态为$T(1)=0$(此时将$u$作为该点的儿子即可),最大询问次数为$\sum_{i=1}^{n-1}T(i)$
经过计算,可得在$n=2\times 10^{3}$时,该值为39371(官方题解给出的值是39632),可以通过


1 #include<bits/stdc++.h>
2 #include "meetings.h"
3 using namespace std;
4 #define N 2005
5 struct Edge{
6 int nex,to;
7 }edge[N<<1];
8 vector<int>v;
9 int E,rt,head[N],vis[N],sz[N],Vis[N];
10 bool cmp(int x,int y){
11 return sz[x]>sz[y];
12 }
13 void add(int x,int y){
14 edge[E].nex=head[x];
15 edge[E].to=y;
16 head[x]=E++;
17 }
18 void get_sz(int k,int fa){
19 sz[k]=1;
20 for(int i=head[k];i!=-1;i=edge[i].nex)
21 if ((!vis[edge[i].to])&&(edge[i].to!=fa)){
22 get_sz(edge[i].to,k);
23 sz[k]+=sz[edge[i].to];
24 }
25 }
26 void get_rt(int k,int fa,int s){
27 int mx=s-sz[k];
28 for(int i=head[k];i!=-1;i=edge[i].nex)
29 if ((!vis[edge[i].to])&&(edge[i].to!=fa)){
30 get_rt(edge[i].to,k,s);
31 mx=max(mx,sz[edge[i].to]);
32 }
33 if (mx<=s/2)rt=k;
34 }
35 void dfs(int k,int u){
36 get_sz(k,0);
37 get_rt(k,0,sz[k]);
38 get_sz(rt,0);
39 vis[rt]=1;
40 v.clear();
41 for(int i=head[rt];i!=-1;i=edge[i].nex)
42 if (!vis[edge[i].to])v.push_back(edge[i].to);
43 sort(v.begin(),v.end(),cmp);
44 if (v.size()&1)v.push_back(rt);
45 for(int i=0;i<v.size();i+=2){
46 int ans=Query(u,v[i],v[i+1]);
47 if (ans==rt)continue;
48 if ((ans==v[i])||(ans==v[i+1])){
49 dfs(ans,u);
50 return;
51 }
52 int p=v[i];
53 if (Query(u,rt,v[i])==rt)p=v[i+1];
54 add(ans,rt),add(ans,p);
55 for(int j=head[rt];j!=-1;j=edge[j].nex)
56 if (edge[j].to==p){
57 edge[j].to=ans;
58 break;
59 }
60 for(int j=head[p];j!=-1;j=edge[j].nex)
61 if (edge[j].to==rt){
62 edge[j].to=ans;
63 break;
64 }
65 if (ans!=u){
66 add(u,ans);
67 add(ans,u);
68 Vis[ans]=1;
69 }
70 return;
71 }
72 add(rt,u),add(u,rt);
73 }
74 void Solve(int n){
75 memset(head,-1,sizeof(head));
76 for(int i=1;i<n;i++)
77 if (!Vis[i]){
78 memset(vis,0,sizeof(vis));
79 dfs(0,i);
80 }
81 for(int i=0;i<n;i++)
82 for(int j=head[i];j!=-1;j=edge[j].nex)
83 if (i<edge[j].to)Bridge(i,edge[j].to);
84 }
[loj3031]聚会的更多相关文章
- BSD和云 – 不可错过的BSD聚会
自2012年开始,微软云计算与企业事业部和Citrix思杰,NetApp达成合作,共同开发出第一版针对Hyper-V虚拟设备驱动以及相关的用户态程序,并将此称之为集成服务 (Integration S ...
- 【BZOJ-1787&1832】Meet紧急集合&聚会 倍增LCA
1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2259 Solved: 1023[Submit] ...
- bzoj-3170 3170: [Tjoi 2013]松鼠聚会(计算几何)
题目链接: 3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MB Description 有N个小松鼠,它们的家用一个点x,y表 ...
- DHV 平常语言对话 一次聚会离场
一次聚会离场 一次聚会离场,如果顺路要计划好A女生 和B女生 或者C女闺密一起回去,然后再自己回去 如果别人说:好男人, 自己一定要谦虚说: 哪里,好男人一般都是备胎. 到家了要说: 不是说: 我:我 ...
- BZOJ3170: [Tjoi 2013]松鼠聚会
3170: [Tjoi 2013]松鼠聚会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 531 Solved: 249[Submit][Statu ...
- bzoj1832: [AHOI2008]聚会
写过的题... #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...
- BZOJ 3170: [Tjoi 2013]松鼠聚会 切比雪夫距离
3170: [Tjoi 2013]松鼠聚会 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- tyvj1161聚会的名单(trie树)
背景 Background 明天就是candy的生日,candy又会邀请自己的一大堆好友来聚会了!哎!又要累坏飘飘乎居士了!! 描述 Description 明天就是candy的生日.晚上,c ...
- BZOJ 1037 [ZJOI2008]生日聚会Party
1037: [ZJOI2008]生日聚会Party Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1583 Solved: 936[Submit][ ...
随机推荐
- Xcode相关
Xcode相关的路径 Provisioning Profiles存放路径:~/Library/MobileDevice/Provisioning Profiles 所有模拟器(包括历史模拟器):~/L ...
- 从零入门 Serverless | 使用 Spot 低成本运行 Job 任务
作者 | 代志锋(云果) 阿里云技术专家 本文整理自<Serverless 技术公开课>,点击链接即可免费听课:https://developer.aliyun.com/learning ...
- 遇到括号就是栈(bushi)
CF508E Arthur and Brackets 我在赛场上想都没想直接DP \(O(n^3)\)过了 但别人说正解是栈+贪心 讲讲DP \(bool\) \(dp[i][j]\)表示从第i对括号 ...
- 洛谷2494 [SDOI2011]保密 (分数规划+最小割)
自闭一早上 分数规划竟然还能被卡精度 首先假设我们已经知道了到每个出入口的时间(代价) 那我们应该怎么算最小的和呢? 一个比较巧妙的想法是,由于题目规定的是二分图. 我们不妨通过最小割的形式. 表示这 ...
- noip2017D1T3逛公园(拓扑图上dp,记忆化搜索)
QWQ前几天才刚刚把这个D1T3写完 看着题解理解了很久,果然我还是太菜了QAQ 题目大意就是 给你一个n个点,m条边的图,保证1能到达n,求从1到n的 (设1到n的最短路长度是d)路径长度在[d,d ...
- 后缀自动机(SAM)奶妈式教程
后缀自动机(SAM) 为了方便,我们做出如下约定: "后缀自动机" (Suffix Automaton) 在后文中简称为 SAM . 记 \(|S|\) 为字符串 \(S\) 的长 ...
- 不会SQL也能做数据分析?浅谈语义解析领域的机会与挑战
笔者按: 在第5次AI TIME PhD Debate上,笔者邀请了部分国内外语义解析领域的杰出华人学者共话语义解析的过去,现状和未来.本博客为笔者根据视频讨论总结的干货整理.对原视频感兴趣的同学可以 ...
- Windows用cmd编译运行C程序
在Windows环境下用命令行编译运行程序 浙江大学-C语言程序设计进阶 配置gcc 准备一个Dev-cpp 找到gcc.exe所在目录 Dev-Cpp\MinGW64\bin 地址栏右键将地址复制为 ...
- Linux命令(二)
1.cd命令 这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径.如: cd /root/Docements # 切换到 ...
- vue2和vue3比较
一.vue3新特性: 1.数据响应重新实现(ES6的proxy代替Es5的Object.defineProperty) 2.源码使用ts重写,更好的类型推导 3.虚拟DOM新算法(更快,更小) 4.提 ...