【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维护当前的区间,动态加, ...
随机推荐
- shell脚本中${...}函数的用法总结
${...}在字符串中有非常多的用法: 1.${var} 限定变量. 如果一个变量名A是另一个变量名AB的前部分,那么,如果要在AB相连时,要得到A的值,就必须使用${var}限定. 如果变量名不会产 ...
- 第三章 python数据规整化
本章概要 1.去重 2.缺失值处理 3.清洗字符型数据的空格 4.字段抽取 去重 把数据结构中,行相同的数据只保留一行 函数语法: drop_duplicates() #导入pandas包中的read ...
- python控制窗口移动(轨迹为圆)
需先打开一个无标题记事本, import win32con import win32gui import time import math notepad = win32gui.FindWindow( ...
- Codeforces 1111 E. Tree(虚树,DP)
题意 有一棵树,q个询问,每次询问,指定一个点做树根,再给定k个点,要求把这些点分成不超过m组的方案数,分配的限制是任意两个有祖先关系的点不能分在同一组.题目还保证了所有的询问的k加起来不超过1e5. ...
- 内置对象 Date
1.内置对象 a)语言自带的对象 b)提供了常用的,基本的功能 Date 1.定义的方法 a) 获取当前时间 var date1=new Date(); co ...
- Jmeter在一次进程中如何循环执行某个步骤
在使用Jmeret工具过程中比如我使用借款功能,如果想多借几次就需要一次次执行脚本,如果我在脚本执行过程中登陆一次,可以重复执行借款这一个操作那么就方便多了 于是就用到(循环控制器)这个功能 1.我需 ...
- vue 源码解析computed
计算属性 VS 侦听属性 Vue 的组件对象支持了计算属性 computed 和侦听属性 watch 2 个选项,很多同学不了解什么时候该用 computed 什么时候该用 watch.先不回答这个问 ...
- hdu5492
hdu5492 陈大哥的毒瘤题T1 题意: 差不多就是根据题意推式子,求最小方差. 解法: 首先,可以观察到,如果我们直接暴力去取平均数,很大概率会取出来小数,所以一个很直观的想法就是把平均数从式子里 ...
- maven坐标及依赖范围的学习(1)
首先,我们先了解什么是maven的坐标(重中之重): 在这里我们可以看到那三个红色的行,基本是pom.xml中出现的最多的配置 例如这个配置:这里我们可以看到我们这个项目的pom文件中,他对名 ...
- js优先队列的定义和使用
//队列,先入先出,FIFO function Queue() { this.items = []; } Queue.prototype = { constructor: Queue, enqueue ...