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. 自学一个月的java了

    不知道这篇博文有不有朋友看到.先自我介绍一下,硕士一年级下学期. 对编程感兴趣,硕士一年级下学期转学计算机专业,目前刚好一个月的时间.接触计算机也是刚好一个月的时间. 学习了java,javaweb. ...

  2. Centos7 更新pip和scipy

    更新pip: pip install --upgrade pip 更新scipy包: pip install -upgrade scipy

  3. web 小知识

    document.write和innerHTML的区别   document.write是直接写入到页面的内容流,如果在写之前没有调用document.open, 浏览器会自动调用open.每次写完关 ...

  4. [No000058]一口气读完一本英语书

    个人:"如何学好英语?"99个人会回答:"去,读英文原著." 然而这事儿吧,恐怕比坚持背单词还难.无论少侠们背过多少单词,最后都会败在生词太多.句子太难的坎儿上 ...

  5. http协议(一)基础知识

    我自己写的随笔一般是偏学习笔记性质的,或者一点个人理解,适合新人,大牛可以忽略这个...... 参考书籍——<图解http> 当我们在浏览器的地址栏中输入网址,然后点击回车,接着,浏览器就 ...

  6. 在ASP.NET中如何运行后台任务

    from:https://blogs.msdn.microsoft.com/scott_hanselman/2014/12/21/asp-net/ [原文发表地址] How to run Backgr ...

  7. FSL - DualRegression

    Source:http://fsl.fmrib.ox.ac.uk/fsl/fslwiki/DualRegression Research Overview A common need for anal ...

  8. C#.NET 大型通用信息化系统集成快速开发平台 4.0 版本 - 组织机构的名称编号是否允许重复?

    通常情况下,一个公司内部的部门名称,编号是不可能重复的.但是是在多公司的情况下,很可能有部门名称重复的问题存在,这时需要允许部门名称重复. 例如一个大型IT公司,在2个地区都有研发部或者客户服务部,这 ...

  9. 通用权限管理系统组件3.9 的 Oracle 数据库创建脚本参考

    ---------------------------------------------------- -- Export file for user USERCENTER -- -- Create ...

  10. android 底层log分析 内存及backtrace tombstone/crash

    Build fingerprint: 'XXXXXXXXX'pid: 1658, tid: 13086  >>> system_server <<<signal 1 ...