【LOJ】#3031. 「JOISC 2019 Day1」聚会
LOJ#3031. 「JOISC 2019 Day1」聚会
听说随机可过?
我想了很久想了一个不会被卡的做法,建出前\(u - 1\)个点的虚树,然后找第\(u\)个点的插入位置,就是每次找一条最长链,询问链的两个端点和u的虚树,如果u在链上那么二分找出u的位置,如果u不在链上且和链相连的点不在链上,那么建出那个点然后连上u,否则删除整条链,保留与u相连的那个点,继续这个操作
二分的代价应该最多是11,每次差不多删掉两个儿子是18/2 = 9
然而这个上限肯定跑不到,最后实测操作次数最多的数据点是21000+,有几个点19000,更多的在10000左右
还有一个2000的点跑了1998不知道发生了什么
#include "meetings.h"
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 2005
#define ba 47
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
set<int> to[2005];
bool vis[2005],finish[2005];
int dep[2005],S,T,fa[2005];
vector<int> v,line;
void getpos(int u,int fa) {
v.pb(u);
for(auto v : to[u]) {
if(vis[v]) continue;
if(v != fa) getpos(v,u);
}
}
void dfs(int u) {
for(auto v : to[u]) {
if(v != fa[u]) {
dep[v] = dep[u] + 1;
fa[v] = u;
dfs(v);
}
}
}
void getpara(int p) {
v.clear();
getpos(p,-1);
dep[p] = 0;fa[p] = -1;
dfs(p);
S = p;
for(auto t : v) {
if(dep[t] > dep[S]) S = t;
}
dep[S] = 0;fa[S] = -1;
dfs(S);
T = p;
for(auto t : v) {
if(dep[t] > dep[T]) T = t;
}
}
void pass_line(int a,int b) {
dep[a] = 0;fa[a] = -1;
dfs(a);
int p = b;
while(1) {
vis[p] = 1;
if(p == a) break;
p = fa[p];
}
}
void getline(int a,int b) {
line.clear();
dep[a] = 0;fa[a] = -1;
dfs(a);
int p = b;
while(1) {
line.pb(p);
if(p == a) break;
p = fa[p];
}
}
void build(int u) {
memset(vis,0,sizeof(vis));
finish[u] = 1;
int p = 0;
while(1) {
getpara(p);
if(S == T) {
to[S].insert(u);to[u].insert(S);break;
}
int m = Query(u,S,T);
getline(S,T);
bool f = 0;
for(auto v : line) {
if(v == m) {f = 1;break;}
}
if(!f && m != u) {
build(m);to[m].insert(u);to[u].insert(m);break;
}
if(m == S) {to[u].insert(S);to[S].insert(u);break;}
if(m == T) {to[u].insert(T);to[T].insert(u);break;}
if(m == u) {
int l = 1,r = line.size() - 1;
while(l < r) {
int mid = (l + r) >> 1;
if(Query(u,line[mid],line[0]) == u) r = mid;
else l = mid + 1;
}
int a = line[r],b = line[r - 1];
to[b].erase(a);to[a].erase(b);
to[b].insert(u);to[a].insert(u);
to[u].insert(a);to[u].insert(b);
break;
}
p = m;pass_line(S,T);vis[p] = 0;
}
}
void Solve(int N) {
to[0].insert(1);to[1].insert(0);
for(int i = 2 ; i < N ; ++i) {
if(!finish[i]) build(i);
}
for(int i = 0 ; i < N ; ++i) {
for(auto v : to[i]) {
if(v > i) Bridge(i,v);
}
}
}
【LOJ】#3031. 「JOISC 2019 Day1」聚会的更多相关文章
- 【LOJ】#3032. 「JOISC 2019 Day1」馕
LOJ#3032. 「JOISC 2019 Day1」馕 处理出每个人把馕切成N段,每一段快乐度相同,我们选择第一个排在最前的人分给他的第一段,然后再在未选取的的人中选一个第二个排在最前的切一下,并把 ...
- 【LOJ】#3030. 「JOISC 2019 Day1」考试
LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...
- @loj - 3039@ 「JOISC 2019 Day4」蛋糕拼接 3
目录 @description@ @solution@ @accepted code@ @details@ @description@ 今天是 IOI 酱的生日,所以她的哥哥 JOI 君给她预定了一个 ...
- 【LOJ】#3036. 「JOISC 2019 Day3」指定城市
LOJ#3036. 「JOISC 2019 Day3」指定城市 一个点的可以dp出来 两个点也可以dp出来 后面的就是在两个点的情况下选一条最长的链加进去,用线段树维护即可 #include < ...
- 【LOJ】#3034. 「JOISC 2019 Day2」两道料理
LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...
- 【LOJ】#3033. 「JOISC 2019 Day2」两个天线
LOJ#3033. 「JOISC 2019 Day2」两个天线 用后面的天线更新前面的天线,线段树上存历史版本的最大值 也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个, ...
- 「JOISC 2019 Day3」穿越时空 Bitaro
「JOISC 2019 Day3」穿越时空 Bitaro 题解: 不会处理时间流逝,我去看了一眼题解的图,最重要的转换就是把(X,Y)改成(X,Y-X)这样就不会斜着走了. 问题变成二维平面上 ...
- 「JOISC 2014 Day1」巴士走读
「JOISC 2014 Day1」巴士走读 将询问离线下来. 从终点出发到起点. 由于在每个点(除了终点)的时间被过来的边固定,因此如果一个点不被新的边更新,是不会发生变化的. 因此可以按照时间顺序, ...
- 「JOISC 2014 Day1」 历史研究
「JOISC 2014 Day1」 历史研究 Solution 子任务2 暴力,用\(cnt\)记录每种权值出现次数. 子任务3 这不是一个尺取吗... 然后用multiset维护当前的区间,动态加, ...
随机推荐
- Django-权限管理与路径导航
1.url权限管理 设计表 1.设计表 系统一共有多少个路径: 有哪些用户使用: 用户在公司的角色: 对角色进行权限分配(什么样的角色可以访问什么样的路径): 2.往表中添加数据,分配角色权限 3.登 ...
- python sqlite3学习笔记
1.sqlite3.connect()参数说明 self.connect = sqlite3.connect(db_name,timeout=3,isolation_level=None,check_ ...
- LK光流算法公式详解
由于工程需要用到 Lucas-Kanade 光流,在此进行一下简单整理(后续还会陆续整理关于KCF,PCA,SVM,最小二乘.岭回归.核函数.dpm等等): 光流,简单说也就是画面移动过程中,图像上每 ...
- AT3576 Popping Balls
AT3576 Popping Balls 好题!一种以前没怎么见过的思路! %%ywy 以什么方式,什么位置统计本质不同的方案,才能不重不漏是处理所有计数问题的主心骨. 本题难以容斥.难以DP. 所以 ...
- 从JMS到KafKa
从JMS到KafKa JMS (1)JMS概念 JMS(Java Message Service,java消息服务)API是一个消息服务的标准或者说是规范,允许应用程序组件基于JavaEE平台创建.发 ...
- (转载)完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三
转自:http://blog.csdn.net/piggyxp/article/details/6922277 前 言 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何 ...
- koa 项目打包(使用webpack打包koa2 框架app)
关键问题 一:所有node_modules里的模块都不进行打包 webpack的核心功能是将引用的各个模块打到一个文件里,并会将各种规范的模块进行统一的模块化处理(webpack规范). 然而node ...
- numpy基本方法总结
NumPy基本方法 一.数组方法 创建数组:arange()创建一维数组:array()创建一维或多维数组,其参数是类似于数组的对象,如列表等 读取数组元素:如a[0],a[0,0] 数组变形:如b= ...
- PCL中有哪些可用的PointT类型(4)
博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=269 PointWithViewpoint - float x, y, z, ...
- k8s-高可用多主master配置
准备主机 centos7镜像 node1: 192.168.0.101 node2: 192.168.0.102 node3: 192.168.0.103 vip: 192.168.0.104 配置s ...