http://www.lydsy.com/JudgeOnline/problem.php?id=3242

http://uoj.ac/problem/126

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】快餐店的更多相关文章

  1. 【BZOJ3242】【UOJ#126】【NOI2013】快餐店

    NOI都是这种难度的题怎么玩嘛QAQ 原题: 小T打算在城市C开设一家外送快餐店.送餐到某一个地点的时间与外卖店到该地点之间最短路径长度是成正比的,小T希望快餐店的地址选在离最远的顾客距离最近的地方. ...

  2. [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字

    [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字 题意 给定一个大串 \(S\) 以及 \(q\) 次询问, 每次询问给定一个串 \(T\) 和区间 \([l, ...

  3. UOJ #126 【NOI2013】 快餐店

    题目链接:快餐店 震惊!某ZZ选手此题调了一天竟是因为……>>点击查看 一般碰到这种基环树的题都要先想想树上怎么做.这道题如果是在树上的话……好像求一遍直径就做完了?答案就是直径长度的一半 ...

  4. 「BZOJ 3242」「NOI 2013」快餐店「基环树」

    题意 基环树上找到一个点(可以在边上)使得它到树上最远点的距离最小,输出最小距离 题解 如果是一棵树,答案就是树的直径\(/2\) 如果是基环树,那么很好证明删去环上的某一条边是不影响答案的.于是断环 ...

  5. 【BZOJ 3051】【UOJ #57】【WC 2013】平面图

    http://www.lydsy.com/JudgeOnline/problem.php?id=3051 http://uoj.ac/problem/57 这道题需要平面图转对偶图,点定位,最小生成树 ...

  6. 【BZOJ 3672】【UOJ #7】【NOI 2014】购票

    http://www.lydsy.com/JudgeOnline/problem.php?id=3672 http://uoj.ac/problem/7 链上的情况可以用斜率优化dp.树上用斜率优化d ...

  7. 【BZOj 3670】【UOJ #5】【NOI 2014】动物园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3670 http://uoj.ac/problem/5 可以建出"KMP自动机"然 ...

  8. 【BZOJ 4650】【UOJ #219】【NOI 2016】优秀的拆分

    http://www.lydsy.com/JudgeOnline/problem.php?id=4650 http://uoj.ac/problem/219 这里有非常好的题解qwq 接着道题复习一下 ...

  9. NOI 2013 书法家

    http://uoj.ac/problem/125 我真是日狗了...... 果然还是没有耐心读题,搞到读题读错了2个地方,结果调试了半天...... 言归正传. 动态规划. 这种题目很常见. 我们发 ...

随机推荐

  1. 以Access为支撑,书写一个C#写入记录的案例

    /// <summary> /// 读取Excel文档 /// </summary> /// <param name="Path">文件名称&l ...

  2. Application中的路径

    前提条件 项目工程目录:E:/Work/cosmosbox/cb-client/ 我电脑当前的用户名:qingqing PersistentDataPath Application.persisten ...

  3. News新闻发布系统

            News新闻发布系统分页的实现 1.首先我们要在NewsDAO中创建一个方法,返回List<NewsEntity>集合,其中pageIndex表示当前页,pageSize表 ...

  4. 入门训练 Fibonacci数列

      入门训练 Fibonacci数列   时间限制:1.0s   内存限制:256.0MB 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时, ...

  5. 在AppDelegate 或其它地方用UITabBarController怎么办

    1.解决了TabBarController,每个地方都要用到的时候?     创建一个单例,然后在创建UITabBarController时,赋值给这个单例,不管是登录还是抽屉,保证最终的根控制器是U ...

  6. javascript中在链表中向前(向后)移动n个节点

     1.概念 在链表上移动n个节点,我第一眼看到这个需求的时候首先想到的是当前节点.使用这个当前节点作为参考来移动,没有这个当前节点的话是没有办法在链表上前进和后退的.初始化定义链表的时候定义一个当前节 ...

  7. Delphi项目构成之单元文件PAS

    单元文件是Pascal源文件,扩展名为.pas. 有三种类型的单元文件: 窗体/数据模块和框架的单元文件(form/data module and frame units),一般由Delphi自动生成 ...

  8. 使用ViewBag传送数据从控制器至视图

    前一篇<ASP.NET MVC读取XML并使用ViewData显示>http://www.cnblogs.com/insus/p/4308740.html 中,在控制器中使用了ViewDa ...

  9. sublime配置文件

    起初是为了解决 tab转四个空格问题 安装包 Sublime_Text_Build_3103_x64_CHS_Lfqy.exe 配置方法 配置脚本 { "bold_folder_labels ...

  10. Spire.Doc组件读取与写入Word

    之前写了一篇开源组件DocX读写word的文章,当时时间比较匆忙选了这个组件,使用过程中还是有些不便,不能提前定义好模版,插入Form表单域进行替换.最近无意中发现Spire.Doc组件功能很强大,目 ...