当前位置:网站首页>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;
}
边栏推荐
- 域名抢注“卷”到了表情包?ENS逆势上涨的新推力
- jsArray array copy method performance test 2207292307
- Scala基础:数组(Array)、映射(Map)、元组(Tuple)、集合(List)
- These critical programs are missing or too old: ma
- 【23考研】408代码题参考模板——顺序表
- 如何判断自己是否适合IT行业?方法很简单
- TaskDispatcher source code parsing
- Xms Xmx PermSize MaxPermSize 区别
- 树形dp小总结(换根,基环树,杂七杂八的dp)
- Mac Brew 安装PHP
猜你喜欢
随机推荐
leetcode207.课程表(判断有向图是否有环)
腾讯称电竞人才缺口200万;华为鸿蒙3.0正式发布;乐视推行每周工作4天半?...丨黑马头条...
[PostgreSQL] - Storage structure and cache shared_buffers
一文读懂Elephant Swap,为何为ePLATO带来如此高的溢价?
ARC117E Zero-Sum Ranges 2
权威推荐!腾讯安全DDoS边缘安全产品获国际研究机构Omdia认可
元宇宙的六大支撑技术
群晖系统安装相关文件分享
程序员修炼之道:务以己任,实则明心——通向务实的最高境界
R语言ggplot2可视化:使用ggpubr包的ggboxplot函数可视化箱图、width参数自定义箱图中箱体的宽度
Raja Koduri澄清Arc GPU跳票传闻 AXG年底前新推四条产品线
dolphinscheduler adds hana support
Apache Log4j2漏洞
【河北工业大学】考研初试复试资料分享
20220729 Securities, Finance
“12306” 的架构到底有多牛逼
Tutorial on using the one-key upgrade function of the RTSP/Onvif video platform EasyNVR service
浅析TSINGSEE智能视频分析网关的AI识别技术及应用场景
CF1320E Treeland and Viruses
Hu-cang integrated e-commerce project (1): project background and structure introduction









