首页 > 其他分享 >【树套树,LCT,出栈序】P4027 [NOI2007] 货币兑换

【树套树,LCT,出栈序】P4027 [NOI2007] 货币兑换

时间:2023-09-09 16:44:07浏览次数:32  
标签:P4027 LCT 树套 val int top mid li ll

其实是我 Li-Chao-Tree 哒!!

考虑转移

\(f_x = \min f_{anc} + (d_{x} - d_{anc})p_x + q_x\) 其中 \(anc\) 为 \(x\) 的祖先,然后满足 \(d_{anc} \geq d_{x} - li_{x})\)。

考虑如果用权值线段树 + 带撤销的李超树可以维护 \(li_{x}\) 可以维护 \(li_{x} < 0\) 的情况。

但是这个题比较良心,考虑 stack 维护根到点的链。然后我们每一次在栈上二分出最早满足条件的情况。

然后建议使用 Lena and Queries 的技巧,线段树套 Li-Chao-Tree。即可。

这个题 inf 要设 \(1e18\)。

#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = l; i <= r; i ++)
#define per(i, r, l) for (int i = r; i >= l; i --)
#define ls x << 1
#define rs x << 1 | 1

/*\yhx12243/ 鱼大保佑*/
/*
  你说的对
  但是你将在一场模拟赛中扮演“没有时间,没有实力,没有资源”的信息学竞赛选手
  与没有同情心的出题人共同发掘:“60也算赢,一题夸自己”的奥赛本质。
*/

using namespace std;

typedef long long ll;

const int _ = 2e5 + 5, __ = _ * 20 + 5;
const ll inf = 1e16;

int n, t;
int rt[_ << 2], tcnt;
struct line {
	ll k, b;
	line (ll k = 0, ll b = inf) : k(k), b(b) {}
	ll val (int x) { return 1ll * k * x + b;}
} a[_];
int tr[__];
int lc[__], rc[__];
void insert (int & x, int l, int r, int p) {
	if (! x) x = ++ tcnt, tr[x] = p;
	else {
		int mid = (l + r) >> 1;
		if (a[tr[x]].val(mid) > a[p].val(mid)) swap(tr[x], p);
		if (l == r) return ;
		if (a[tr[x]].val(l) > a[p].val(l)) insert(lc[x], l, mid, p);
		if (a[tr[x]].val(r) > a[p].val(r)) insert(rc[x], mid + 1, r, p);
	}
}
ll query (int x, int l, int r ,int v) {
	if (! x) return inf;
	int mid = (l + r) >> 1;
	return min(a[tr[x]].val(v), v <= mid ? query(lc[x], l, mid, v) : query(rc[x], mid + 1, r, v));
}
void modify (int x, int l, int r, int v, int p) {
	insert(rt[x], 0, 1e6, p);
	if (l == r) return ;
	int mid = (l + r) >> 1;
	v <= mid ? modify(ls, l, mid, v, p) : modify(rs, mid + 1, r, v, p);
}
ll queryRange (int x, int l, int r, int ql, int qr, int v) {
	if (ql <= l && r <= qr) return query(rt[x], 0, 1e6, v);	
	int mid = (l + r) >> 1; ll ret = inf;
	if (ql <= mid) ret = min(ret, queryRange(ls, l, mid, ql, qr, v));
	if (qr > mid) ret = min(ret, queryRange(rs, mid + 1, r, ql, qr, v));
	return ret;
}

struct EDGE {
	int y;
	ll z;
};

int dfc, top, dfn[_], stk[_], p[_];
ll d[_], q[_], f[_], li[__];
vector <EDGE> e[_];
void dfs1 (int x) {
	for (auto & [y, z] : e[x]) dfs1(y);
	dfn[x] = ++ dfc;
}
void dp (int x) {
	a[x] = {-d[top], f[x]};
	stk[top] = x;
	modify(1, 1, n, dfn[x], x);
	for (auto & [y, z] : e[x]) {
		++ top, d[top] = d[top - 1] + z;
		int rp = dfn[stk[lower_bound(d, d + top, d[top] - li[y]) - d]];
		f[y] = queryRange(1, 1, n, dfn[y], rp, p[y]) + d[top] * p[y] + q[y];
		dp(y), -- top;
	}
}
int main () {
	cin >> n >> t;
	rep(x, 2, n) {
		int fa;
		ll z;
		scanf("%d %lld %d %lld %lld", & fa, & z, & p[x], & q[x], & li[x]);
		e[fa].push_back({x, z});
	}
	dfs1(1), dp(1);
	rep(x, 2, n) printf("%lld\n", f[x]); 
	return 0;
}

标签:P4027,LCT,树套,val,int,top,mid,li,ll
From: https://www.cnblogs.com/Custlo/p/17689725.html

相关文章

  • k8s安装etcd出现Job for etcd.service failed......"journalctl -xe" for details.
    错误如下先按照提示,输入journalctl-xe看一些详细信息1、针对:startrequestrepeatedtooquicklyforetcd.service错误,解决办法如下vi/usr/lib/systemd/system/etcd.service在[service]部分添加:RestartSec=5(参数作用:如果服务需要被重启,这个参数的值为服务被重启前的......
  • 【学习笔记】树套树
    所谓树套树,其本质是通过用树维护一组树的根,从而维护强悍的数据1线段树套平衡树线段树套#include<bits/stdc++.h>usingnamespacestd;#defineMAXN50005intseg[MAXN<<2];intamin=1000000,amax=0;structNode{ intval,rnd,siz; intch[2]; }t[MAXN*80];intt......
  • Splay,LCT,ETT
    Splay核心代码。总结就是双旋voidrot(intx,int&k){ inty=tr[x].fa,z=tr[y].fa; intkd=(tr[y].son[0]==x)?0:1; if(y==k)k=x; else{ if(tr[z].son[0]==y)tr[z].son[0]=x; elsetr[z].son[1]=x; } tr[y].son[kd]=tr[x].son[!kd];tr[tr[y].son[kd]].fa=y; tr[......
  • 【个人模板封装】树套树、高维数据结构
    前言这是我个人使用的一些模板封装,限于个人能力,可能存在诸多不足与漏洞,在未加测试直接使用前请务必小心谨慎。更新可能会滞后于我本地的文档,如有疑问或者催更之类的可以在评论区留言。全文模板测试均基于以下版本信息,请留意版本兼容问题。Windows,64bitG++(ISOC++20)stack......
  • linux内存日志 | journalctl指令
    摘要一、linux内存日志就是有些日志仅仅在系统允许过程中写在内存当中,但是并不会保存到硬盘当中重启后,内存日志就会情况二、指令指令功能说明选项journalctl查看全部journalctl-n3查看最新3条journalctl--since19:00--until19:10:10查看起始......
  • journalctl
    journalctl检索systemd日志,是CentOS7才有的工具。语法journalctl[OPTIONS...][MATCHES...]选项Flags:--system#显示系统日志--user#显示当前用户的用户日志-M--machine=CONTAINER#在本地容器上操作-S--since=DATE......
  • LCT 模板
    以P3690为例。#include<iostream>#defineUP(i,s,e)for(autoi=s;i<e;++i)namespaceLCT{//}{{{structNode{ Node*ls,*rs; Node*fa; intsum,val; boolrev; Node();}nil_,*nil=&nil_;Node::Node(){fa=ls=rs=nil;}voidpushup(......
  • Splay&LCT不怎么详细的详解
    Splay:平衡树的一种,学名伸展树。平衡树首先是一棵二叉搜索树(BST),满足性质:中序遍历单调递增。根据这个性质,很容易在一棵BST上完成以下操作:插入一个数,查询一个数的排名,查询给定排名的数,删除一个数。BST可能是不平衡的,即左右子树相差很大。Splay均摊后是平衡的,即时间复杂度均摊......
  • journalctl 清理journal日志
    在CentOS7开始使用的systemd使用了journal日志,这个日志的管理方式和以往使用syslog的方式不同,可以通过管理工具维护。使用df-h检查磁盘文件,可以看到/run目录下有日志目录/run/log/journal,占用了数G空间FilesystemSizeUsedAvailUse%Mountedon/dev/mapper......
  • LCT
    动态树问题的引入静态树问题静态树问题的一般形式如下:给定一个树,点和边可能有权。要对这个树按时间顺序进行一些操作和询问。操作可以修改点和边的权值。询问可以对链和子树进行询问。通俗的讲,所有在整个过程中树的结构不变的树论问题就叫静态树问题。动态树问题动态树......