【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个地方,结果调试了半天...... 言归正传. 动态规划. 这种题目很常见. 我们发 ...
随机推荐
- USACO(含training section)水题合集[5/未完待续]
(1) USACO2.1 Ordered Fractions 枚举 排序即可,注意1/1 #include<iostream> #include<cstdio> #includ ...
- u3d_Shader_effects笔记4 BRDF
1.英文意思 bidirectional reflectance distribution function bidirectional :双向的 reflectance :反射 distributi ...
- 在Eclipse彻底删除一个项目
1. 先必须关闭项目 2. 再从workspace中把项目删除
- span 与p 的区别,以及内联元素的作用
1.一般标签都有语义,p标签是指一个段落,而且默认是一个块级元素,span是一个行内元素的代表,没有什么意思,一般可以放文字等行内元素,例如<p>这是一段简介内容这是一段 <span ...
- 关于oracle with as用法
with as语法–针对一个别名with tmp as (select * from tb_name) –针对多个别名with tmp as (select * from tb_name), ...
- PHP用户注册邮箱验证激活帐号
我们在很多网站注册会员时,注册完成后,系统会自动向用户的邮箱发送一封邮件,这封邮件的内容就是一个URL链接,用户需要点击打开这个链接才能激活之前在该网站注册的帐号.激活成功后才能正常使用会员功能. 本 ...
- c语言:printf系列的函数
/** *----------------------------stdio.h--------------------------------------- * int printf(const c ...
- python问题:IndentationError:expected an indented block错误解决《转》
python问题:IndentationError:expected an indented block错误解决 标签: python语言 2012-07-07 17:59 125145人阅读 评论( ...
- Centos6.2 下 vncserver 的安装
好久没用vnc了, 把今天装的过程记录一下, 这是一个从网上下载的标准Centos6.2 虚机镜像, 已经带了桌面. 默认的用户是root和tom, 口令都是tomtom. 因为ssh服务没起来, 简 ...
- Java数据类型和变量
Java中存在2种数据类型,下面我们来详解一下: 基本数据类型: 引用数据类型: 可以用一张表来记录: 基本数据类型 整型 byte:1个字节8位,取值范围为:[-128, 127],直接写值:(by ...