【JZOJ6346】ZYB和售货机
description
analysis
其实这个连出来的东西叫基环内向树
先考虑很多森林的情况,也就是树根连回自己
明显树根物品是可以被取完的,那么买树根的价钱要是儿子中价钱最小的那个
或者把那个叫成收益,也就是选择所有儿子中收益最大的儿子
既然树根可以取完,同理所有非叶子节点也可以被取完
所以树(森林)的情况就可以\(O(n)\)遍历一遍得到
考虑在基环树上删去一条边,使得图变成树,然后用树的做法
如果购买一个点的父亲\(x\),卖钱比另一个父亲也为\(x\)的要差,那就不用按按钮
没有这种情况,就钦定环上环边贡献减去树边贡献最小的点断开环边
记录每个点的儿子中收益最大和次大的儿子,就可以知道两个贡献之差
code
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 100005
#define MAXM MAXN*2
#define ha 19260817
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
#define rep(i,a) for (reg i=last[a];i;i=next[i])
using namespace std;
ll last[MAXM],next[MAXM],tov[MAXM];
ll fa[MAXN],a[MAXN],c[MAXN],d[MAXN];
ll dfn[MAXN],num[MAXN],val[MAXN],mx[MAXN],smx[MAXN];
ll bz[MAXN],flag[MAXN];
ll n,mn=ha,tot,ans,where;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}
inline void link(ll x,ll y){next[++tot]=last[x],last[x]=tot,tov[tot]=y;}
/*
inline void findcircle(ll x)
{
if (dfn[x]==tot)
{
fo(i,1,n)if (dfn[x]==tot)bz[i]=1;
return;
}
if (dfn[x])return;
dfn[x]=tot;if (x!=fa[x])findcircle(fa[x]);
}
inline void dfs(ll x)
{
ans+=val[mx[x]]*a[x];
rep(i,x)dfs(tov[i]);
}*/
inline void dfs1(ll x)
{
if (flag[x]==tot){ans-=mn;return;}
if (flag[x])return;
flag[x]=tot,mn=min(mn,val[mx[x]]-val[smx[x]]);
if (mx[x]!=x)dfs1(mx[x]);
}
int main()
{
//freopen("T2.in","r",stdin);
freopen("goods.in","r",stdin);
freopen("goods.out","w",stdout);
n=read();
fo(i,1,n)fa[i]=read(),c[i]=read(),d[i]=read(),a[i]=read(),link(fa[i],i);
fo(i,1,n)
{
val[i]=d[fa[i]]-c[i];
if (val[i]<0)continue;
if (val[i]>val[mx[fa[i]]])smx[fa[i]]=mx[fa[i]],mx[fa[i]]=i;
else if (val[i]>val[smx[fa[i]]])smx[fa[i]]=i;
}
tot=0;
//fo(i,1,n)if (!dfn[i])++tot,findcircle(i);
fo(i,1,n)ans+=val[mx[i]]*a[i];
tot=0;
fo(i,1,n)if (!flag[i])++tot,mn=ha,dfs1(i);
printf("%lld\n",ans);
return 0;
}
【JZOJ6346】ZYB和售货机的更多相关文章
- [JZOJ6346]:ZYB和售货机(拓扑+基环内向森林)
题目描述 可爱的$ZYB$来到一个售货机前. 售货机里有一共有$N(\leqslant 10^5)$个物品,每个物品有$A_i$个.自然,还有$N$个购买按钮.正常情况下,按下第$i$个按钮,需要支付 ...
- C#骏鹏自动售货机接口
MachineJP类: 第1部分:串口初始化,串口数据读写 using System; using System.Collections.Generic; using System.IO.Ports; ...
- 使用NewLife网络库构建可靠的自动售货机Socket服务端(一)
最近有个基于tcp socket 协议和设备交互需求,想到了新生命团队的各种组件,所以决定用NewLife网络库作为服务端来完成一系列的信息交互. 第一,首先说一下我们需要实现的功能需求吧 1,首先客 ...
- YTU 2598: 编程题B-小平智斗自动售货机
2598: 编程题B-小平智斗自动售货机 时间限制: 1 Sec 内存限制: 128 MB 提交: 268 解决: 69 题目描述 LYH自动售货机在销售商品时,具有自动找钱功能.但是找零的最小单 ...
- 玩转华为物联网IoTDA服务系列三-自动售货机销售分析场景示例
场景简介 通过收集自动售货机系统的销售数据,EI数据分析售货销量状况. 该场景主要描述的是设备可以通过MQTT协议与物联网平台进行交互,应用侧可以到物联网平台订阅设备侧变化的通知,用户可以在控制台或通 ...
- 开发实践丨用小熊派STM32开发板模拟自动售货机
摘要:本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代码,通过云端开发和设备终端开发,实现终端数据在的华为云平台显示. 本文内容是讲述用小熊派开发板模拟自动售货机,基于论坛提供的工程代 ...
- 09自动售货机综设实验(含按键消抖,led和状态机)
一设计功能 1.上次状态机的练习 2这次自动售货机综设 (一)对比两次的售货机 上次售货机的关键是画出状态转移图.明确输入分几种,输出是啥,有哪些状态.如下图所示 (二)系统或综合设计的经验: 既然这 ...
- Java开发自动售货机
1:先写一个类,包括商品的基本属性 package com.xt.java.base25; public class Goods { private int ID; private String na ...
- FSM自动售货机 verilog 实现及 code 细节讲解
1.题目: 饮料1.5 元, 可投入硬币1 元 0.5 元,输出饮料 零钱 2. 画出状态机. 3.仿真结果:coin=1 --> 0.5 元 coin=2-->1元 4.关键代码分析: ...
随机推荐
- Web开发常规调试方法与常见问题分析
一.Web项目基本原理 现在的web项目大都已经前后端独立开发与部署. 前后端独立开发,一般是前端与后端通过web接口(常见的有RESTful与websocket)文档进行交流.前端开发人员先更具业务 ...
- ADS 命令行命令介绍
armasm 1. 命令:armasm [选项] -o 目标文件 源文件 2. 选项说明 -Errors 错误文件名 ;指定一个错误输出文件 -I 目录[,目录] ;指 ...
- 微信小程序控件
1 scrollview 窗口view的滑动 <scroll-view scroll-y class='scroll-view-y' bindscrolltoupper="uppe ...
- 反编译字节码角度分析synchronized关键字的原理
1.synchronized介绍 synchronized是java关键字.JVM规范中,synchronized关键字用于在线程并发执行时,保证同一时刻,只有一个线程可以执行某个代码块或方法:同时还 ...
- ThreadLocal知识点
ThreadLocal是什么 ThreadLocal 表面上看他是和多线程,线程同步有关的一个工具类,但其实他与线程同步机制无关.线程同步机制是多个线程共享同一个变量,而ThreadLocal是为每个 ...
- leetcode-263-丑数一
题目描述: 方法一:递归 class Solution: def isUgly(self, num: int) -> bool: if num == 0: return False if num ...
- 【缓存】缓存穿透、缓存雪崩、key重建方案
一.缓存穿透预防及优化 缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,但是出于容错的考虑,如果从存储层查不到数据则不写入缓存层,如图 11-3 所示整个过程分为如下 3 步: 缓存层 ...
- MTT学习小记
这是个毒瘤题才有的毒瘤东西--奶一口NOI不考 拆系数FFT: 考虑做NTT时模数不是NTT模数(\(2^a*b+1\))怎么办? 很容易想到拆次数FFT. 比如说现在求\(a*b\),设\(m=\s ...
- 阿里巴巴持续投入,etcd 正式加入 CNCF
摘要: 2018 年 12 月 11 日,在 KubeCon + CloudNativeCon 北美峰会上,etcd 项目正式加入 CNCF. 2018 年 12 月 11 日,在 KubeCon + ...
- js的线程和同步异步以及console.log机制
项目上线了,闲下来就写写东西吧.积累了好多东西都没有做笔记~挑几个印象深刻的记录一下吧. js的同步异步以及单线程问题: 都知道单线程是js的一大特性.但是通常io(ajax获取服务器数据).用户/浏 ...