【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个地方,结果调试了半天...... 言归正传. 动态规划. 这种题目很常见. 我们发 ...
随机推荐
- Codeforces Round #282 Div.1 B Obsessive String --DP
题意: 给两个串S,T,问能找出多少的S的(a1,b1)(a2,b2)..(ak,bk),使Sa1---Sb1,...Sak---Sbk都包含子串T,其中k>=1,且(a1,b1)...(ak, ...
- Codeforces 715A. Plus and Square Root[数学构造]
A. Plus and Square Root time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- POJ3783Balls[DP 最坏情况最优解]
Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 907 Accepted: 598 Description T ...
- oracle:sql函数
Oracle将函数大致分为单行函数,聚合函数和分析函数. 单行函数分为字符函数,日期函数,转换函数,数字函数,通用函数,decode函数 一.字符函数 1)大小写控制函数 01.Lower() 全部小 ...
- 学习cocos code ide 的lua编程
装上了cocos code ide,配了路径之后,建立一个默认lua工程,发现无法调试,报错. 问了别人,在cocos2dconstants.lua的613行插入cc.AsyncTaskPool = ...
- zlog学习笔记(level)
level.h /** * */ #ifndef __zlog_level_h #define __zlog_level_h #include "stdio.h" #include ...
- BZOJ 1014 【JSOI2008】 火星人prefix
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...
- 批量修改string中的字符
#1,修改"/"为"\\",多用于在txt读取内容后进行修改 size_t pos0 = mkfolder.find("/");//首次查找 ...
- Hadoop: MapReduce2的几个基本示例
1) WordCount 这个就不多说了,满大街都是,网上有几篇对WordCount的详细分析 http://www.sxt.cn/u/235/blog/5809 http://www.cnblogs ...
- Java7并发编程实战(一) 线程的管理
1:线程的创建 1:继承Thread类,并且覆盖run()方法 2:创建一个实现Runnable接口的类.使用带参数的Thread构造器来构造 2:example-->计算打印乘法表 首先 ...