HDU 4729 An Easy Problem for Elfness(主席树)(2013 ACM/ICPC Asia Regional Chengdu Online)
Since the water every city provides and costs every day is different, he needs to transfer water from one particular city to another as much as possible in the next few days. However the pipes which connect the cities have a limited capacity for transmission. (Which means the water that transfer though the pipe should not exceed a particular amount) So he has to know the maximum water that the network can transfer in the next few days.
He thought it's a maximum flow problem, so he invites an expert in this field, Elfness (Also known as Xinhang senior sister) to help him figure it out.
Unlike Pfctgeorge, Elfness quickly finds that this problem is much easier than a normal maximum flow problem, and is willing to help Pfctgeorge.
"Oh well, this problem is not a tough one. We can ..."
Abruptly, Pfctgeorge's iPhone rings, and ... the ringtone is Mo Di Da Biao Ke.
"You can make that? Excellent! "Pfctgeorge hangs up his iPhone, and turns to Elfness.
"Here's good news for you. A construction team told me that every pipe's capacity can be extended for one day. And the price for extending one unit capacity varies from day to day. "
"Eh well, that's a good news for you, not me. Now it's rather like a minimum cost ow problem, right? But it's still not a tough one, let me have a think. "
After a few seconds' thought, Elfness comes up with a simple solution.
"Ok, we can solve it like... "
Abruptly, here comes Mo Di Da Biao Ke again.
"Seriously? You can build new pipes? Thank you very much. "
"OK, my dear Elfness, we got more good news. Another construction team said they can build one or more pipes between any two cities and their pipes are exactly like the original ones except that they only work for one day. And the capacity of the new pipes is only one, but they can be extended, too. Of course, their price to build a single pipe also varies in days. "
"You mean the new pipes can be extended too? Wow, things are getting more interesting. Give me a few minutes. "
Elfness takes out his new ultrabook which is awarded in VK cup and does some basic calculation.
"I get it. The problem can be solved ..."
Mo Di Da Biao Ke again, but this time it's from Elfness's phone.
"As you see, I have to go out. But I know someone else who can also solve this; I'll recommend this guy for you. "
And of course, that poor guy is YOU. Help Pfctgeorge solve his problem, and then the favorability about you from Elfness will raise a lot.
The first line of each test case is two integers N (1 <= N <= 100000) and M (1 <= M <= 100000), indicating the number of the city that the original network connects and the number of days when Pfctgeorge needs to know about the maximum water transmissions. Then next N - 1 lines each describe a pipe that connects two cities. The format will be like U, V , cap (1 <= U, V <= N and 0 <= cap < 10000), which means the ids of the two cities the pipe connects and the transmission limit of the pipe. As is said in description, the network that the cities and pipes form is a tree (an undirected acyclic graph).
Then next M lines of the test case describe the information about the next few days. The format is like S, T, K, A, B(0 <= K <= 2^31 - 1, 1 <= A, B <= 2^31 - 1). S means the source of the water while T means the sink. K means the total budget in the day. A means the cost for a construction team to build a new pipe and B means the cost for a construction team to extend the capacity of a pipe.
I am glad to list the information of building a new pipe and extending the capacity.
1. Pfctgeorge can build a new pipe between any two cities, no matter they have been directly connected or not. Pfctgeorge can build more than one new pipe between any two cities.
2. The capacity of the pipe that was newly built is one.
3. Pfctgeorge can extend the capacity of any existed pipe including the newly built one and the original one.
4. Each time you extend the capacity of one pipe, the capacity of that pipe increases one.
5. The cost of building a new pipe is A and the cost of extending a pipe is B.
6. You can take any constructions in any times and the only limit is to make sure the total costs not exceed the budget.
7. All the work that construction team does only lasts one single day.
Then for each day, output the maximum water Pfctgeorge can transfer from S and T with a budget of K.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL; const int MAXC = ;
const int MAXN = ;
const int MAXV = * ;
const int MAXE = * ; int head[MAXV], fa[MAXV];
bool vis[MAXV];
int to[MAXE], next[MAXE], weight[MAXE];
int T, n, m, ecnt; void init() {
memset(head, , sizeof(head));
memset(vis, , sizeof(vis));
for(int i = ; i <= n; ++i) fa[i] = i;
ecnt = ;
} void add_edge(int u, int v, int c) {
to[ecnt] = v; weight[ecnt] = c; next[ecnt] = head[u]; head[u] = ecnt++;
to[ecnt] = u; weight[ecnt] = c; next[ecnt] = head[v]; head[v] = ecnt++;
} struct QUERY {
int s, t, k, a, b, lca;
void read(int i) {
scanf("%d%d%d%d%d", &s, &t, &k, &a, &b);
add_edge(s + n, t + n, i);
}
} Query[MAXV]; int get_set(int x) {
return fa[x] == x ? x : fa[x] = get_set(fa[x]);
} void dfs_lca(int u, int f) {
for(int p = head[u]; p; p = next[p]) {
int &v = to[p];
if(v == f) continue;
dfs_lca(v, u);
fa[v] = u;
}
vis[u] = true;
for(int p = head[u + n]; p; p = next[p]) {
int v = to[p] - n;
if(vis[v]) Query[weight[p]].lca = get_set(v);
}
} struct Node {
int L, R, sum, cnt;
} tree[ * MAXN];
int root[MAXV], Tcnt; void init_Tree() {
root[] = ;
Tcnt = ;
} void insert(int &x, int left, int right, int &val) {
tree[Tcnt] = tree[x]; x = Tcnt++;
++tree[x].cnt; tree[x].sum += val;
if(left == right) return ;
int mid = (left + right) >> ;
if(val <= mid) insert(tree[x].L, left, mid, val);
else insert(tree[x].R, mid + , right, val);
} void dfs_build_tree(int u, int f, int w) {
root[u] = root[f];
if(f) insert(root[u], , MAXC, w);
for(int p = head[u]; p; p = next[p]) {
int &v = to[p];
if(v == f) continue;
dfs_build_tree(v, u, weight[p]);
}
} int query(int x, int y, int lca, int left, int right, int k) {
if(left == right) return left;
int t = tree[tree[x].L].cnt + tree[tree[y].L].cnt - * tree[tree[lca].L].cnt;
int mid = (left + right) >> ;
if(k <= t) return query(tree[x].L, tree[y].L, tree[lca].L, left, mid, k);
else return query(tree[x].R, tree[y].R, tree[lca].R, mid + , right, k - t);
} int query(int x, int y, int lca, int cap) {
int l = , r = MAXC, cnt = , sum = ;
while(l < r) {
int mid = (l + r) >> ;
int tmp_cnt = tree[tree[x].L].cnt + tree[tree[y].L].cnt - * tree[tree[lca].L].cnt;
int tmp_sum = tree[tree[x].L].sum + tree[tree[y].L].sum - * tree[tree[lca].L].sum;
if((cnt + tmp_cnt) * mid - (sum + tmp_sum) > cap)
x = tree[x].L, y = tree[y].L, lca = tree[lca].L, r = mid;
else x = tree[x].R, y = tree[y].R, lca = tree[lca].R, l = mid + , cnt += tmp_cnt, sum += tmp_sum;
}
return l - ;
} int main() {
scanf("%d", &T);
for(int t = ; t <= T; ++t) {
scanf("%d%d", &n, &m);
init();
for(int i = ; i < n; ++i) {
int u, v, c;
scanf("%d%d%d", &u, &v, &c);
add_edge(u, v, c);
}
for(int i = ; i <= m; ++i) Query[i].read(i);
printf("Case #%d:\n", t);
dfs_lca(, );
//for(int i = 1; i <= m; ++i) printf("%d\n", Query[i].lca);
init_Tree();
dfs_build_tree(, , );
//for(int i = 1; i <= m; ++i) printf("%d\n", query(root[Query[i].s], root[Query[i].t], root[Query[i].lca], 0, MAXC, 1));
for(int i = ; i <= m; ++i) {
int ans = query(root[Query[i].s], root[Query[i].t], root[Query[i].lca], , MAXC, );
if(Query[i].a < Query[i].b) ans += Query[i].k / Query[i].a;
else {
if(Query[i].k >= Query[i].a) ans += (Query[i].k - Query[i].a) / Query[i].b + ;
ans = max(ans, query(root[Query[i].s], root[Query[i].t], root[Query[i].lca], Query[i].k / Query[i].b));
}
printf("%d\n", ans);
}
}
}
HDU 4729 An Easy Problem for Elfness(主席树)(2013 ACM/ICPC Asia Regional Chengdu Online)的更多相关文章
- HDU 4729 An Easy Problem for Elfness 主席树
题意: 给出一棵树,每条边有一个容量. 有若干次询问:\(S \, T \, K \, A \, B\),求路径\(S \to T\)的最大流量. 有两种方法可以增大流量: 花费\(A\)可以新修一条 ...
- HDU 4729 An Easy Problem for Elfness(树链剖分边权+二分)
题意 链接:https://cn.vjudge.net/problem/HDU-4729 给你n个点,然你求两个点s和t之间的最大流.而且你有一定的钱k,可以进行两种操作 1.在任意连个点之间建立一个 ...
- HDU 4735 Little Wish~ lyrical step~(DLX搜索)(2013 ACM/ICPC Asia Regional Chengdu Online)
Description N children are living in a tree with exactly N nodes, on each node there lies either a b ...
- HDU 4717 The Moving Points(三分法)(2013 ACM/ICPC Asia Regional Online ―― Warmup2)
Description There are N points in total. Every point moves in certain direction and certain speed. W ...
- HDU 4722 Good Numbers(位数DP)(2013 ACM/ICPC Asia Regional Online ―― Warmup2)
Description If we sum up every digit of a number and the result can be exactly divided by 10, we say ...
- HDU 4291 A Short problem(2012 ACM/ICPC Asia Regional Chengdu Online)
HDU 4291 A Short problem(2012 ACM/ICPC Asia Regional Chengdu Online) 题目链接http://acm.hdu.edu.cn/showp ...
- HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- 数据结构(主席树):HDU 4729 An Easy Problem for Elfness
An Easy Problem for Elfness Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65535/65535 K (J ...
- HDU 4729 An Easy Problem for Elfness (主席树,树上第K大)
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove 题意:给出一个带边权的图.对于每一个询问(S , ...
随机推荐
- deep learning学习记录三
deep learning,这几年有多火!! imagenet比赛,大家今年都是基于去年的基础上改进和应用的,效果比去年提升当然. 在deep learning方向,hinton, benjio, l ...
- 自己平时收集的css、html笔记(适合初级前端攻城狮)
实习了一年时间,陆陆续续记录下来一堆笔记,不过也丢失了一些... 以后会持续更新.扩展,现在把碰到的知识点归纳于此,方便翻阅 一.html部分 1.取消iPhone自动识别数字为拨打号码 <me ...
- 小白袍 -- Chapter 1.4.1.1 URL编码的理论解读
1.4.1.1 URL编码的理论解读 我们在做JavaWeb时避不过GET请求,GET请求和POST请求最大一点不同就在于参数,GET请求的参数会URL中,而POST请求的参数则会在HTTP Hea ...
- CodePush自定义更新弹框及下载进度条
CodePush 热更新之自定义更新弹框及下载进度 先来几张弹框效果图 非强制更新场景 image 强制更新场景 image 更新包下载进度效果 image 核心代码 这里的热更新Modal框,是封装 ...
- NEC css规范
CSS规范 - 分类方法 SS文件的分类和引用顺序 通常,一个项目我们只引用一个CSS,但是对于较大的项目,我们需要把CSS文件进行分类. 我们按照CSS的性质和用途,将CSS文件分成“公共型样式”. ...
- struts2的token interceptor
关于struts2的token拦截器的说明 原理:struts2的token interceptor是关于重复提交的拦截器,其实现是:在form表单中加入token标签,如下: <form ac ...
- jdbc最基础的mysql操作
1.基本的数据库操作 这里连接数据库可以做成一个单独的utils类,我这里因为程序少就没有封装. 虽然现在jdbc被其他框架取代了,但这是框架的基础 如下:第一个是插入数据操作 package Dat ...
- Spring常见面试题
本文是通过收集网上各种面试指南题目及答案然后经过整理归纳而来,仅仅是为了方便以后回顾,无意冒犯各位原创作者. Spring框架 1. 什么是Spring? Spring 是个java企业级应用的开源开 ...
- ZooKeeper(1)-入门
一. Zookeeper工作机制 二.Zookeeper特点 三.Zookeeper数据结构 四.Zookeeper应用场景 统一命名服务 统一配置管理 统一集群管理 服务器动态上下线 软负载均衡
- python学习——函数
一.在python的世界里什么是函数: 答:函数通常是用来实现某一个功能二被封装成的一个对象,是用来实现代码复用的常用方式 现在有一个需求,假如你在不知道len()方法的情况下,要你计算字符串‘he ...