当前位置:网站首页>ARC115F Migration
ARC115F Migration
2022-07-30 13:40:00 【With a cool moon】
二分答案.
鉴于 n n n 比较小,先 O ( n 2 ) \mathcal O(n^2) O(n2) Preprocess to figure out where each point optimally jumps to,Make the path maximum value as small as possible,It is guaranteed that it cannot jump to the origin, the weight is less than or equal to the root, and the number is as small as possible.
考虑二分答案 l i m lim lim,Each jumps the optimal point from the start node and the end node respectively,Skip to weights and over l i m lim lim 为止,Finally, determine whether the corresponding two points are equal,单次时间复杂度 O ( k n ) \mathcal O(kn) O(kn).
时间复杂度 O ( n 2 log V ) \mathcal O(n^2\log V) O(n2logV).
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ha putchar(' ')
#define he putchar('\n')
typedef long long ll;
inline int read()
{
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9')
{
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
x = x * 10 + c - '0', c = getchar();
return x * f;
}
inline void write(int x)
{
if(x < 0)
{
putchar('-');
x = -x;
}
if(x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
const int _ = 4010;
int n, k, w[_], a[_], A[_], B[_], val[_], f[_], rt, tot, head[_], to[_ << 1], nxt[_ << 1], s[_], t[_];
void add(int u, int v)
{
to[++tot] = v, nxt[tot] = head[u], head[u] = tot;
}
void dfs(int u, int fa, int z)
{
z = max(z, w[u]), a[u] = z;
if(w[u] < w[rt] || (w[u] == w[rt] && u < rt))
if(!f[rt] || a[u] < a[f[rt]]) f[rt] = u;
for(int i = head[u]; i; i = nxt[i])
if(to[i] ^ fa) dfs(to[i], u, z);
}
bool check(int x)
{
int s1 = 0, s2 = 0;
for(int i = 1; i <= k; ++i) A[i] = s[i], B[i] = t[i], s1 += w[A[i]], s2 += w[B[i]];
if(s1 > x || s2 > x) return 0;
while (1)
{
bool flg = 0;
for(int i = 1; i <= k; ++i)
if (f[A[i]] && s1 - w[A[i]] + val[A[i]] <= x) s1 = s1 - w[A[i]] + w[f[A[i]]], A[i] = f[A[i]], flg = 1;
for(int i = 1; i <= k; ++i)
if (f[B[i]] && s2 - w[B[i]] + val[B[i]] <= x) s2 = s2 - w[B[i]] + w[f[B[i]]], B[i] = f[B[i]], flg = 1;
if(!flg) break;
}
for(int i = 1; i <= k; ++i)
if (A[i] ^ B[i]) return 0;
return 1;
}
signed main()
{
n = read();
for(int i = 1; i <= n; ++i) w[i] = read();
for(int i = 1, u, v; i < n; ++i)
{
u = read(), v = read();
add(u, v), add(v, u);
}
k = read();
for(int i = 1; i <= k; ++i) s[i] = read(), t[i] = read();
for(int i = 1; i <= n; ++i)
{
rt = i;
memset(a, 0, sizeof a);
dfs(i, i, w[i]);
val[i] = a[f[i]];
}
int l = 0, r = 2e12, mid;
ll ans = 0;
while(l <= r)
{
mid = (l + r) >> 1;
if(check(mid)) ans = mid, r = mid - 1;
else l = mid + 1;
}
write(ans), he;
return 0;
}
边栏推荐
猜你喜欢
Eleven BUUCTF questions (06)
What are the hard-core upgrades and applications that cannot be missed in Greenplum 6.0?
ENVI图像处理(6):NDVI和植被指数
How to display an Excel table in the body of an email?
“12306” 的架构到底有多牛逼
ENVI Image Processing (6): NDVI and Vegetation Index
当下,产业园区发展面临的十大问题
for循环的3个表达式执行顺序
jsArray array copy method performance test 2207292307
js男女身高体重关系图
随机推荐
正确处理页面控制器woopagecontroller.php,当提交表单时是否跳转正确的页面
腾讯称电竞人才缺口200万;华为鸿蒙3.0正式发布;乐视推行每周工作4天半?...丨黑马头条...
【自校正控制】自校正PID
自动化测试的生命周期是什么?
Raja Koduri澄清Arc GPU跳票传闻 AXG年底前新推四条产品线
第十三天笔记
R语言ggplot2可视化:使用ggpubr包的ggmaplot函数可视化MA图(MA-plot)、设置label.select参数自定义在图中显示标签的基因类型(自定义显示的标签列表)
SQL 26 calculation under 25 years of age or older and the number of users
创意loadingjs特效小点跳跃动画
ARC115F Migration
Current and voltage acquisition module DAM-6160
cpu / CS 和 IP
jsArray数组复制方法性能测试2207300040
qq udp tcp机制
Smart pointer implementation conjecture
shell脚本流程控制语句
【ROS进阶篇】第十一讲 基于Gazebo和Rviz的机器人联合仿真(运动控制与传感器)
for循环的3个表达式执行顺序
Yilian: Activating the Value Potential of Data Elements and Unleashing the Innovation Dividend of SAS SSD
Dolphinscheduler stand-alone transformation