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」聚会的更多相关文章

  1. 【LOJ】#3032. 「JOISC 2019 Day1」馕

    LOJ#3032. 「JOISC 2019 Day1」馕 处理出每个人把馕切成N段,每一段快乐度相同,我们选择第一个排在最前的人分给他的第一段,然后再在未选取的的人中选一个第二个排在最前的切一下,并把 ...

  2. 【LOJ】#3030. 「JOISC 2019 Day1」考试

    LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...

  3. @loj - 3039@ 「JOISC 2019 Day4」蛋糕拼接 3

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 今天是 IOI 酱的生日,所以她的哥哥 JOI 君给她预定了一个 ...

  4. 【LOJ】#3036. 「JOISC 2019 Day3」指定城市

    LOJ#3036. 「JOISC 2019 Day3」指定城市 一个点的可以dp出来 两个点也可以dp出来 后面的就是在两个点的情况下选一条最长的链加进去,用线段树维护即可 #include < ...

  5. 【LOJ】#3034. 「JOISC 2019 Day2」两道料理

    LOJ#3034. 「JOISC 2019 Day2」两道料理 找出最大的\(y_{i}\)使得\(sumA_{i} + sumB_{y_i} \leq S_{i}\) 和最大的\(x_{j}\)使得 ...

  6. 【LOJ】#3033. 「JOISC 2019 Day2」两个天线

    LOJ#3033. 「JOISC 2019 Day2」两个天线 用后面的天线更新前面的天线,线段树上存历史版本的最大值 也就是线段树需要维护历史版本的最大值,后面的天线的标记中最大的那个和最小的那个, ...

  7. 「JOISC 2019 Day3」穿越时空 Bitaro

    「JOISC 2019 Day3」穿越时空 Bitaro 题解: ​ 不会处理时间流逝,我去看了一眼题解的图,最重要的转换就是把(X,Y)改成(X,Y-X)这样就不会斜着走了. ​ 问题变成二维平面上 ...

  8. 「JOISC 2014 Day1」巴士走读

    「JOISC 2014 Day1」巴士走读 将询问离线下来. 从终点出发到起点. 由于在每个点(除了终点)的时间被过来的边固定,因此如果一个点不被新的边更新,是不会发生变化的. 因此可以按照时间顺序, ...

  9. 「JOISC 2014 Day1」 历史研究

    「JOISC 2014 Day1」 历史研究 Solution 子任务2 暴力,用\(cnt\)记录每种权值出现次数. 子任务3 这不是一个尺取吗... 然后用multiset维护当前的区间,动态加, ...

随机推荐

  1. Codevs 4909 寂寞的堆

    4909 寂寞的堆 时间限制: 1 s 空间限制: 8000 KB 题目等级 : 大师 Master 题目描述 Description 堆,是一种神奇的数据结构 不寂寞的堆,是一棵满二叉树,其儿子节点 ...

  2. node和npm版本引起的安装依赖和运行项目失败问题

    问题:node版本不同导致的安装依赖版本不同而无法启动 https://www.jianshu.com/p/c07293c8c6d4 实际上问题分为两个部分: 1,npm包管理器安装依赖不成功,此时需 ...

  3. JavaScript判断数据类型的4中方法

    一: typeof typeof 是一种运算符,它的值有如下几种(number.boolean.string.undefined.null.function.object.symbol) consol ...

  4. [51nod1789] 跑得比谁都快

    题面 题解 设\(f[i]\)为根节点到\(i\)的最小耗时 设\(S\)为\(i\)的祖先集合, 可以得到 \[ f[i] = min(f[j] + (i - j)^p),j \in S \] 对于 ...

  5. 【分类模型评判指标 一】混淆矩阵(Confusion Matrix)

    转自:https://blog.csdn.net/Orange_Spotty_Cat/article/details/80520839 略有改动,仅供个人学习使用 简介 混淆矩阵是ROC曲线绘制的基础 ...

  6. Nginx反向代理设置header

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  7. [Javascript]客户端检测

    客户端检测是一种行之有效的开发策略.但不到万不得已,就不要使用客户端检测.先设计通用的方案,然后根据浏览器之间的差异和各自的怪癖quirky,再使用特定于浏览器的技术增强该方案. 能力检测 Featu ...

  8. redis2. sds 字符串(SimpleDynamicString)

    1.标准strcat 会有溢出风险,sdscat无溢出风险 2.空间预分配,惰性空间释放 空间预分配:sds分配空间时,如果原来是5,free是0, sdscat追加一个10长度的,此时字符串加长到1 ...

  9. Handler处理消息

    UI主线程通过Looper循环查询消息队列UI_MQ,当发现有消息存在时会将消息从消息队列中取出.首先分析消息,通过消息的参数判断该消息对应的Handler,然后将消息分发到指定的Handler进行处 ...

  10. RedHat Enterprise7 修改为CentOS的yum源

    报错 解决 1.将自带的yum卸载掉 2.下载centos的yum并安装 wget http://mirrors.163.com/centos/7/os/x86_64/Packages/yum-met ...