洛谷P2792 [JSOI2008]小店购物(最小树形图)
题意
Sol
一开始的思路:新建一个虚点向每个点连边,再加上题面中给出的边,边权均为大小*需要购买的数量
然后发现死活都过不去
看了题解才发现题目中有个细节——买了\(A\)就可以买\(B\),但是人家没告诉你必须买够\(A\)的数量才能买\(B\)呀qwqqqqqqq
所以建图的时候只算一次贡献就行了
这样剩下的个数都可以通过最小值买到
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10, INF = 1e9 + 10;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c -'0', c = getchar();
return x * f;
}
int N, M, R, m[MAXN], id[MAXN], vis[MAXN], fa[MAXN];
double mn[MAXN], val[MAXN];
struct Edge {
int u, v; double w; int nxt;
}E[MAXN];
int head[MAXN], num = 1;
inline void AddEdge(int x, int y, double w) {
E[num] = (Edge) {x, y, w, head[x]}; head[x] = num++;
}
double ZhuLiu() {
double ans = 0; R = N;
while("Liang Liang") {
for(int i = 1; i <= N; i++) id[i] = vis[i] = 0, mn[i] = 1e9; int cnt = 0, x;
for(int i = 1; i <= num; i++)
if(E[i].v != E[i].u && (mn[E[i].v] > E[i].w))
mn[E[i].v] = E[i].w, fa[E[i].v] = E[i].u;
mn[R] = 0;
for(int i = 1; i <= N; i++) {
ans += mn[i];
for(x = i; (!id[x]) && (vis[x] != i) && x != R; x = fa[x]) vis[x] = i; //tag
if(x != R && (!id[x])) {
id[x] = ++cnt;
for(int t = fa[x]; t != x; t = fa[t]) id[t] = cnt;
}
}
if(cnt == 0) return ans;
for(int i = 1; i <= N; i++) if(!id[i]) id[i] = ++cnt;
for(int i = 1; i <= num; i++) {
double pre = mn[E[i].v];
if((E[i].u = id[E[i].u]) != (E[i].v = id[E[i].v])) E[i].w -= pre;
}
N = cnt; R = id[R];
}
return ans;
}
int main() {
N = read();
for(int i = 1; i <= N; i++) {
scanf("%lf", &val[i]), m[i] = read(), AddEdge(N + 1, i, val[i]);
}
N++;
M = read();
for(int i = 1; i <= M; i++) {
int x = read(), y = read(); double z; scanf("%lf", &z);
AddEdge(x, y, z); val[y] = min(val[y], z);
}
double ans = 0;
for(int i = 1; i <= N - 1; i++) ans += 1.0 * (m[i] - 1) * val[i];// printf("%d\n", m[i] - 1);
printf("%.2lf", ans + ZhuLiu());
return 0;
}
洛谷P2792 [JSOI2008]小店购物(最小树形图)的更多相关文章
- 【LuoguP2792 】[JSOI2008]小店购物(最小树形图)
题目链接 题目描述 小店的优惠方案十分简单有趣: 一次消费过程中,如您在本店购买了精制油的话,您购买香皂时就可以享受2.00元/块的优惠价:如果您在本店购买了香皂的话,您购买可乐时就可以享受1.50元 ...
- Luogu2792 JSOI2008 小店购物 最小树形图
传送门 被题意杀 本以为一个种类的物品一定要一起买 看了题解才知道可以先把所有要买的物品买一个,剩下要买的物品就可以得到这个种类的物品能够得到的最大优惠-- 所以现在只需要知道:第一次买所有物品一遍时 ...
- Luogu2792 [JSOI2008]小店购物
Luogu2792 [JSOI2008]小店购物 重题 bzoj4349 最小树形图 有 \(n\) 个物品,每个物品有价格 \(c_i\) 和所需个数 \(k_i\) ,所有物品必须恰好买 \(k_ ...
- [JSOI2008]小店购物 & bzoj4349:最小树形图 最小树形图
---题面(洛谷)--- ---题面(bzoj)--- 其实是同一道题,,,样例都一模一样 题解: 一开始看想了好久,,,还想到了最短路和最小生成树,,然而写的时候才意识到最小生成树应该要用无向边 其 ...
- JSOI2008 小店购物
https://www.luogu.org/problem/show?pid=2792 题目背景 JSOI集训队的队员发现,在他们经常活动的集训地,有一个小店因为其丰富的经营优惠方案深受附近居民的青睐 ...
- 最小树形图--朱刘算法([JSOI2008]小店购物)
题面 luogu Sol 首先设一个 \(0\) 号点,向所有点连边,表示初始价值 显然这个图的一个 \(0\) 为根的最小有向生成树的边权和就是每个买一次的最小价值 再买就一定能优惠(包含 \(0\ ...
- 「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数
「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数 题面描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数, ...
- 洛谷 P1198 [JSOI2008]最大数
洛谷 P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. ...
- 【洛谷4005】小Y和地铁(搜索)
[洛谷4005]小Y和地铁(搜索) 题面 洛谷 有点长. 题解 首先对于需要被链接的两个点,样例中间基本上把所有的情况都给出来了. 但是还缺了一种从下面绕道左边在从整个上面跨过去在从右边绕到下面来的情 ...
随机推荐
- Oracle的常用修改表及字段的语句
单行注释:-- 多行注释:/* */ Oracle中修改表结构 增加字段 ALTER TABLE table_name ADD column_name data_type; 删除字段 ...
- notepad++常用操作梳理
在 设置---管理快捷键 可以查询/重置快捷键.如下: 工作or学习中最长用到的操作: Ctrl+ALT-C:列编辑Ctrl+U:转换为小写Ctrl+Shift+U:转换为大写Ctrl+B:跳转 ...
- day3.python 学习之列表
python中列表用[ ]表示, list = [ ] #表示一个空列表 1.list = [ 'A','B','C',‘D’] print(list[0]) # 表示打印出列表中的第一个元素,列表 ...
- c/c++ int,float,short 大小端转换函数
unsigned int(uint32_t)大小端转换函数 unsigned int BLEndianUint32(unsigned int value) { return ((value & ...
- 【笔记】AJAX基础
[笔记]AJAX基础 Django AJAX 知识储备:JSON 什么是 JSON JSON 是轻量级的文本数据交换格式 JSON 独立于语言和平台.JSON 解析器和 JSON 库支持许多不同的编 ...
- Mac 10.12打开任何来源选项
在终端中输入: sudo spctl --master-disable 然后输入密码即可.最终会出现如下图所示:
- ToolkitScriptManager vs. ScriptManager 关于“只能向页面中添加 ScriptManager 的一个实例”讨论
在使用ASP.NET设计AJAX功能网页时,需要首先声明ToolkitScriptManager或者ScriptManager控件,这些全局的脚本核心控制,然后才能使用众多的AJAX控件.如果没有创建 ...
- hibernate_Session接口_load_get
hibernate读取数据库内容,用 1,session.get(Class类型,主键); 立马发出sql语句.从数据库中取出值装到对象里去 2,session.load(Class类型,主键); 从 ...
- ubuntu 添加多个IP
上次这个问题 : UBUNTU 无法解析域名 解决方法 解决后,每次重启电脑都需要重新配置 /etc/resolv.conf. 这次添加IP的时候留心发现,在/etc/network/interfa ...
- unity代码创建草和模拟风的效果
void Start() { Test4(); } //草 private Vector3[] grassArray = new Vector3[7]; private GameObject gras ...