博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 1179 D - Fedor Runs for President
阅读量:5337 次
发布时间:2019-06-15

本文共 2168 字,大约阅读时间需要 7 分钟。

思路:

推出斜率优化公式后,会发现最优点只可能来自凸斜率中的第一个元素和最后一个元素,

这两个元素不用维护凸斜率也能知道,就是第一个和上一个元素

代码:

#pragma GCC optimize(2)#pragma GCC optimize(3)#pragma GCC optimize(4)#include
using namespace std;#define y1 y11#define fi first#define se second#define pi acos(-1.0)#define LL long long//#define mp make_pair#define pb emplace_back#define ls rt<<1, l, m#define rs rt<<1|1, m+1, r#define ULL unsigned LL#define pll pair
#define pli pair
#define pii pair
#define piii pair
#define pdd pair
#define mem(a, b) memset(a, b, sizeof(a))#define debug(x) cerr << #x << " = " << x << "\n";#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//head const int N = 5e5 + 5;vector
g[N];int n, u, v, sz[N];LL dp[N], ans;//(dp[j]-dp[k]+sz[j]^2-sz[k]^2)/(sz[j]-sz[k]) >= 2*(n-sz[i]) k < jbool _g(int k, int j, LL C) { return (dp[j]-dp[k]+sz[j]*1LL*sz[j]-sz[k]*1LL*sz[k]) <= C*(sz[j]-sz[k]);}//(dp[i]-dp[j]+sz[i]^2-sz[j]^2)/(sz[i]-sz[j]) >= (dp[j]-dp[k]+sz[j]^2-sz[k]^2)/(sz[j]-sz[k])//k < j < ibool gg(int k, int j, int i) { return (dp[i]-dp[j]+sz[i]*1LL*sz[i]-sz[j]*1LL*sz[j])*(sz[j]-sz[k]) <= (dp[j]-dp[k]+sz[j]*1LL*sz[j]-sz[k]*1LL*sz[k])*(sz[i]-sz[j]);}void dfs(int u, int o) { sz[u] = 1; for (int v : g[u]) { if(v != o) { dfs(v, u); ans = min(ans, (n-sz[v])*1LL*(n-sz[v]) + sz[v]*1LL*sz[v]); sz[u] += sz[v]; } } dp[u] = sz[u]*1LL*sz[u]; for (int v : g[u]) { if(v != o) { dp[u] = min(dp[u], (sz[u]-sz[v])*1LL*(sz[u]-sz[v])+dp[v]); } } sort(g[u].begin(), g[u].end(), [](int x, int y){ return sz[x] > sz[y]; }); int l = -1, r = -1; for (int v : g[u]) { if(v == o) continue; if(l == -1) { l = r = v; continue; } int x = l; ans = min(ans, dp[v]+dp[x]+(n-sz[v]-sz[x])*1LL*(n-sz[v]-sz[x])); x = r; ans = min(ans, dp[v]+dp[x]+(n-sz[v]-sz[x])*1LL*(n-sz[v]-sz[x])); r = v; }}int main() { scanf("%d", &n); for (int i = 1; i < n; ++i) scanf("%d %d", &u, &v), g[u].pb(v), g[v].pb(u); int rt = 1; for (int i = 1; i <= n; ++i) if(g[i].size() != 1) rt = i; ans = n*1LL*n; dfs(rt, rt); printf("%lld\n", n*1LL*(n-1) - (ans-n)/2); return 0;}

 

转载于:https://www.cnblogs.com/widsom/p/11156690.html

你可能感兴趣的文章
linux 用户与权限管理
查看>>
Api demo源码学习(9)--App/Activity/Receive Result --Activity间传递数据
查看>>
Vim总结(二)
查看>>
JAVA:URL之图像图标
查看>>
wcf host service
查看>>
JSP内置对象——out,get与post
查看>>
一维数组
查看>>
JAVA多线程通信
查看>>
二分图的最大匹配问题
查看>>
第三次月赛题解
查看>>
Love for music
查看>>
Java 中无参带返回值方法的使用
查看>>
条件判断与循环
查看>>
Java 泛型方法、泛型类、通配符、通配符上下限
查看>>
Activity
查看>>
事件驱动模型
查看>>
LiteDB源码解析系列(1)LiteDB介绍
查看>>
orchard 1.7.2 的组织结构
查看>>
vue地址插件多级联动自适应 + github地址
查看>>
ODE 笔记
查看>>