首页 > 其他分享 >[JOISC2019] 聚会 题解

[JOISC2019] 聚会 题解

时间:2024-12-20 16:12:47浏览次数:9  
标签:return ve int 题解 back JOISC2019 聚会 push nw

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


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

那么先随机出两个点 \(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);
}

标签:return,ve,int,题解,back,JOISC2019,聚会,push,nw
From: https://www.cnblogs.com/chang-an-22-lyh/p/18619467/joisc2019-ju_hui-tj

相关文章

  • 博弈论+ybt题解
    NIM游戏及其证明题目描述即为T1,不多赘述有向图游戏及SG函数而对于由\(n\)个有向图游戏组成的组合游戏,设它们的起点分别为\(S_1,S_2,\ldots,S_n\),则有定理:当且仅当\(\text{SG}(s_1)\oplus\text{SG}(s_2)\oplus\ldots\oplus\text{SG}(s_n)\neq0\)时,这个游戏是先手......
  • (自用)[USACO2023-JAN-Bronze] T1 LEADERS 题解
    题目描述农夫约翰有\(N(2≤N≤10^5)\)头奶牛,每一头奶牛的品种是更赛牛G或荷斯坦牛H中的一种。每一头奶牛都有一个名单,第\(i\)头奶牛的名单上记录了从第\(i\)头奶牛(即自己)到第\(E_i(i≤E_i≤N)\)头奶牛的连续所有奶牛。每一种奶牛都有且仅有一位“领导者”,对于某一头牛......
  • [CF494D] Birthday 题解
    首先\(S(u)\)显然是\(u\)的子树。假如\(u\)是定点,问题转化为区间求平方和,十分简单。于是我们用线段树维护区间平方和,支持区间加,然后离线问题,在\(u\)的位置处理即可。线段树从\(fa\)转移到\(u\)是极度简单的。时间复杂度\(O(n\logn)\)。#include<bits/stdc++.h>......
  • Luogu P10838 『FLA - I』庭中有奇树 题解 [ 绿 ] [ 二分 ] [ 双指针 ] [ 树 ]
    庭中有奇树:很多算法揉在一起的好题。转化题意因为要封锁\(m\)条路径,根据贪心思想,他一定会封锁最短的\(m\)条路径。所以我们能走的最短传送路径就是最短的第\(m+1\)条路径。这应该是本题最关键的一步转化了,几个月前降智了根本没想到这个。做法求第\(m+1\)短的路径,这个......
  • 组合数学+ybt题解
    加法原理乘法原理排列数从\(n\)个数中任取\(m\)个元素的排列的方案数,表示为\(A^m_n=\frac{n!}{(n-m)!}\)\(0!=1\)全排列\(A^n_n\)组合数从\(n\)个元素中取出\(m\)个元素的组合的个数,表示为\(\dbinom{n}{m}=\frac{A^m_n}{m!}=\frac{n!}{m!(n-m)!}\)如何理解呢?......
  • P3316 [SDOI2014] 里面还是外面 题解
    实现有些傻瓜,喜提时空双最劣解。首先要判断一个点是否在多边形内,一个比较好的方法是从这个点向上引一条射线,若和奇数条边相交就在多边形内,否则在多边形外。二维信息,考虑用树套树维护。把多边形的每一条边都扔到它\(x\)坐标范围的线段树节点里,即线段树节点\((l,r)\)里面维护......
  • 洛谷 P11337 「COI 2019」IZLET 题解
    如果每条边连接的两个点颜色都不相同,那么可以使用如下策略确定每个点的颜色:令\(c_{i,j}\)为\(i\)到\(j\)的路径上的颜色数。对于每个点\(u\),以其为根进行一次dfs,往下找直到找到一个和它颜色相同的或者一个叶子就回溯,如果遇到颜色相同的就将它们在并查集上合并。考虑如何......
  • [Yandex Cup 2024 Qual F] Zeroth Rome 题解
    前言Englishversionofthiseditorialisprovidedafterthesamplecode.题意简述本题为交互题,你需要猜\(t\)个\([0,2024]\)间的非负整数\(x_1,x_2,\ldots,x_t\),可以询问最多\(15\)次,每次询问形如“给定一个大小为\(N(1\leN\le2025)\)的集合\(S\)满足\(S\)......
  • [APC001H] Generalized Insertion Sort 题解
    将\(a_i\)视为放在结点\(i\)上面的球;称位置\(i\)对应的球为\(i\),区别于“位置\(i\)上面的球为\(a_i\)”。考虑树是一条链的时候怎么做(下称链插入方法):此时只需要将这条链上面的球按照编号从上到下排序。这是一个类似插入排序的过程,维护深度最大的的若干个球编号的相对顺......
  • [USACO24OPEN] Grass Segments G 题解
    考虑对于一个区间\([l_i,r_i]\),最少重叠长度为\(k_i\),怎样的区间\([l_j,r_j]\)可以与前者产生贡献;首先\(r_j-l_j\gek_i\),在满足这个条件的情况下需要有\(r_j\gel_i+k_i\landl_j\ler_i-k_i\),这里\(\land\)表示合取,即C++中的\(\mathrm{and}\)。正难则反,考虑用长度\(......