【BZOJ 3242】【UOJ #126】【CodeVS 3047】【NOI 2013】快餐店
http://www.lydsy.com/JudgeOnline/problem.php?id=3242
http://codevs.cn/problem/3047/
因为存在一条边,答案所在的点走向左右的城的最短路都不会经过这条边。
所以枚举这条边,剩下的用线段树维护。
线段树初始化搞了好久,忘了在外向树上做dp,树形dp时记录也错了,总之调了一天,吃枣药丸啊QwQ
时间复杂度$O(nlogn)$,听说有$O(n)$的单调队列做法,留一个坑以后再看。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 100003;
int in() {
int k = 0, fh = 1; char c = getchar();
for(; c < '0' || c > '9'; c = getchar())
if (c == '-') fh = -1;
for(; c >= '0' && c <= '9'; c = getchar())
k = (k << 3) + (k << 1) + c - '0';
return k * fh;
} struct SegmentTree {
int L, R, n, maid[N << 2];
ll ma[N << 2], ma_sc[N << 2], lazy[N << 2], key;
void pushdown(int rt, int l, int r) {
if (lazy[rt]) {
ma[rt << 1] += lazy[rt];
ma[rt << 1 | 1] += lazy[rt];
if (l != r) {
ma_sc[rt << 1] += lazy[rt];
ma_sc[rt << 1 | 1] += lazy[rt];
}
lazy[rt << 1] += lazy[rt];
lazy[rt << 1 | 1] += lazy[rt];
lazy[rt] = 0;
}
}
void pushup(int rt) {
if (ma[rt << 1] > ma[rt << 1 | 1]) ma[rt] = ma[rt << 1], maid[rt] = maid[rt << 1];
else ma[rt] = ma[rt << 1 | 1], maid[rt] = maid[rt << 1 | 1];
if (ma[rt << 1] > ma[rt << 1 | 1]) ma_sc[rt] = max(ma[rt << 1 | 1], ma_sc[rt << 1]);
else ma_sc[rt] = max(ma[rt << 1], ma_sc[rt << 1 | 1]);
}
void mkmaid(int rt, int l, int r, ll *s) {
lazy[rt] = 0;
if (l == r) {
maid[rt] = l;
ma[rt] = s[l];
ma_sc[rt] = -10000000000000000ll;
return;
}
int mid = (l + r) >> 1;
mkmaid(rt << 1, l, mid, s);
mkmaid(rt << 1 | 1, mid + 1, r, s);
pushup(rt);
}
void init(int num, ll *s) {
n = num;
mkmaid(1, 1, n, s);
}
void update(int rt, int l, int r) {
if (L <= l && r <= R) {
lazy[rt] += key;
ma[rt] += key;
if (l != r) ma_sc[rt] += key;
return;
}
int mid = (l + r) >> 1;
pushdown(rt, l, r);
if (L <= mid) update(rt << 1, l, mid);
if (R > mid) update(rt << 1 | 1, mid + 1, r);
pushup(rt);
}
void cover(int l, int r, ll num) {
L = l; R = r; key = num;
update(1, 1, n);
}
} T1, T2; struct node {
int nxt, to, w;
} E[N << 1];
bool vis[N];
ll g[N], sum1[N], sum2[N], Treefr[N], Treesc[N];
int n, cnt = 0, point[N], fa[N], fadis[N], mark = 0, markf;
int cir[N], cirnum, cirdis[N], lala; void ins(int u, int v, int l) {E[++cnt] = (node) {point[u], v, l}; point[u] = cnt;} void dfs(int x) {
vis[x] = true;
for(int i = point[x]; i; i = E[i].nxt)
if (E[i].to != fa[x]) {
if (vis[E[i].to]) {
mark = x;
markf = E[i].to;
lala = E[i].w;
return;
}
fa[E[i].to] = x; fadis[E[i].to] = E[i].w;
dfs(E[i].to);
if (mark) return;
}
} ll ans2 = 0; ll dfs2(int x) {
ll ret = 0; vis[x] = true;
for(int i = point[x]; i; i = E[i].nxt)
if (!vis[E[i].to]) {
ret = max(ret, dfs2(E[i].to) + E[i].w);
if (Treefr[E[i].to] + E[i].w >= Treefr[x]) {
Treesc[x] = Treefr[x];
Treefr[x] = Treefr[E[i].to] + E[i].w;
} else if (Treefr[E[i].to] + E[i].w > Treesc[x])
Treesc[x] = Treefr[E[i].to] + E[i].w;
}
ans2 = max(ans2, Treefr[x] + Treesc[x]);
return ret;
} ll Query() {
if (T1.maid[1] == T2.maid[1]) return max(T1.ma[1] + T2.ma_sc[1], T1.ma_sc[1] + T2.ma[1]);
else return T1.ma[1] + T2.ma[1];
} int main() {
n = in();
int u, v, l;
for(int i = 1; i <= n; ++i) {
u = in(); v = in(); l = in();
ins(u, v, l);
ins(v, u, l);
} fa[1] = 0; dfs(1);
cir[1] = markf;
cir[2] = mark;
cirdis[1] = lala;
cirnum = 2;
memset(vis, 0, sizeof(bool) * (n + 1));
vis[mark] = true;
while (mark != markf) {
cirdis[cirnum] = fadis[mark];
mark = fa[mark]; vis[mark] = true;
cir[++cirnum] = mark;
}
cirdis[cirnum] = cirdis[1]; cirdis[0] = cirdis[cirnum - 1]; for(int i = 1; i < cirnum; ++i)
g[i] = dfs2(cir[i]); ll ret = 0, ans;
for(int i = 1; i < cirnum; ++i) {
sum1[i] = g[i] + ret;
sum2[i] = g[i] - ret;
ret += cirdis[i];
}
T1.init(cirnum - 1, sum1); T2.init(cirnum - 1, sum2);
ans = Query(); for(int i = 2; i < cirnum; ++i) {
T1.cover(i - 1, i - 1, ret);
T2.cover(i - 1, i - 1, -ret);
T1.cover(1, cirnum - 1, -cirdis[i - 1]);
T2.cover(1, cirnum - 1, cirdis[i - 1]);
ans = min(ans, Query());
} ans = max(ans, ans2);
printf("%.1lf\n", 1.0 * ans / 2);
return 0;
}
【BZOJ 3242】【UOJ #126】【CodeVS 3047】【NOI 2013】快餐店的更多相关文章
- 【BZOJ3242】【UOJ#126】【NOI2013】快餐店
NOI都是这种难度的题怎么玩嘛QAQ 原题: 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. ...
- [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字
[LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字 题意 给定一个大串 \(S\) 以及 \(q\) 次询问, 每次询问给定一个串 \(T\) 和区间 \([l, ...
- UOJ #126 【NOI2013】 快餐店
题目链接:快餐店 震惊!某ZZ选手此题调了一天竟是因为……>>点击查看 一般碰到这种基环树的题都要先想想树上怎么做.这道题如果是在树上的话……好像求一遍直径就做完了?答案就是直径长度的一半 ...
- 「BZOJ 3242」「NOI 2013」快餐店「基环树」
题意 基环树上找到一个点(可以在边上)使得它到树上最远点的距离最小,输出最小距离 题解 如果是一棵树,答案就是树的直径\(/2\) 如果是基环树,那么很好证明删去环上的某一条边是不影响答案的.于是断环 ...
- 【BZOJ 3051】【UOJ #57】【WC 2013】平面图
http://www.lydsy.com/JudgeOnline/problem.php?id=3051 http://uoj.ac/problem/57 这道题需要平面图转对偶图,点定位,最小生成树 ...
- 【BZOJ 3672】【UOJ #7】【NOI 2014】购票
http://www.lydsy.com/JudgeOnline/problem.php?id=3672 http://uoj.ac/problem/7 链上的情况可以用斜率优化dp.树上用斜率优化d ...
- 【BZOj 3670】【UOJ #5】【NOI 2014】动物园
http://www.lydsy.com/JudgeOnline/problem.php?id=3670 http://uoj.ac/problem/5 可以建出"KMP自动机"然 ...
- 【BZOJ 4650】【UOJ #219】【NOI 2016】优秀的拆分
http://www.lydsy.com/JudgeOnline/problem.php?id=4650 http://uoj.ac/problem/219 这里有非常好的题解qwq 接着道题复习一下 ...
- NOI 2013 书法家
http://uoj.ac/problem/125 我真是日狗了...... 果然还是没有耐心读题,搞到读题读错了2个地方,结果调试了半天...... 言归正传. 动态规划. 这种题目很常见. 我们发 ...
随机推荐
- 应用程序Cache对象到高性能Memcached学习之路
来源:微信公众号CodeL 以下是个人学习之路的简单分享,不足之处欢迎大神们批评指正! 在网站开发的初期,我们没有考虑更多的东西,也没有对缓存进行系统的设计,而是直接使用了应用程序缓存对象Cache, ...
- NOIP2010提高组 机器翻译 -SilverN
/**/ #include<iostream> #include<cstdio> #include<cmath> #include<cstring> # ...
- hdu-5493 Queue(二分+树状数组)
题目链接: Queue Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- Red5 第一个例子之HelloWorld
http://yerik.blog.51cto.com/1662422/1343993
- window对象的inner/outer/page/screen详解
innerHeight : 返回窗口的文档显示区的高度,包含工具条与滚动条.说明:ie8以下不支持 outerHeight : 返回窗口的外部高度,包含工具条与滚动条.说明:ie8以下不支持 page ...
- Linux打包压缩.md
Linux下打包压缩命令 下面学习一下压缩和打包的相关命令,首先得先明确两个概念,即:压缩和打包 .我们实际使用中一般是打包和压缩结合的使用,为了学习下面简要的介绍一下压缩文件或目录的命令. 压缩:将 ...
- IntelliJ IDEA 快捷键备忘
打开关闭项目结构树 Alt + 1 查看方法定义 Ctrl + B 查看方法实现 Ctrl + Alt + B 查看类结构 Ctrl + F12 弹出 或 Alt + 7 右侧栏 查看类继承结构 Ct ...
- 生产服务器环境最小化安装后 Centos 6.5优化配置[转]
内容目录 centos6.5最小化安装后配置网络: IP地址, 网关, 主机名, DNS 更新系统源并且升级系统 系统时间更新和设定定时任 创建普通用户并进行sudo授权管理 修改SSH端口号和屏蔽r ...
- 数据类型之记录(record)..With XXX do begin... end;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 type Mai ...
- 02传智_jbpm与OA项目_部门模块
部门模块:具有增删改查(部门)的功能. Dao层的实现: 1,定义一个DepartmentDao.java. 定义基本的数据库操作.