bzoj 4003 [JLOI2015]城池攻占 —— 左偏树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4003
其实蛮简单的,首先一个城市只会被其子树中的骑士经过,启发我们 dfs 序用可并堆合并子树信息;
先乘后加,和带乘法的线段树一个方法;
如果秒 WA 的话,把读入全写成 %lld 就好了...
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const maxn=3e5+;
int n,m,c[maxn],rt[maxn],a[maxn],dis[maxn],dep[maxn];
ll h[maxn],v[maxn],s[maxn],la[maxn],lc[maxn];
int hd[maxn],ct,to[maxn],nxt[maxn],ans[maxn],end[maxn],ls[maxn],rs[maxn];
void add(int x,int y){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct;}
void update(int x,ll c,ll a)
{
if(!x)return;//
s[x]*=c; s[x]+=a;
lc[x]*=c; la[x]*=c; la[x]+=a;
}
void pushdown(int x)
{
if(lc[x]==&&la[x]==)return;//
update(ls[x],lc[x],la[x]); update(rs[x],lc[x],la[x]);
lc[x]=; la[x]=;
}
int merge(int x,int y)
{
if(!x||!y)return x+y;
pushdown(x); pushdown(y);//
if(s[x]>s[y])swap(x,y);
rs[x]=merge(rs[x],y);
if(dis[ls[x]]<dis[rs[x]])swap(ls[x],rs[x]);
if(rs[x])dis[x]=dis[rs[x]]+;
else dis[x]=;
return x;
}
void dfs(int x,int f)
{
dep[x]=dep[f]+;
pushdown(rt[x]);
for(int i=hd[x],u;i;i=nxt[i])
{
dfs(u=to[i],x); pushdown(rt[u]);
rt[x]=merge(rt[x],rt[u]);
}
while(rt[x]&&s[rt[x]]<h[x])
{
pushdown(rt[x]);
ans[x]++; end[rt[x]]=x;
rt[x]=merge(ls[rt[x]],rs[rt[x]]);
}
if(a[x]==)update(rt[x],,v[x]);
else update(rt[x],v[x],);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%lld",&h[i]);
for(int i=,fa;i<=n;i++)scanf("%lld%lld%lld",&fa,&a[i],&v[i]),add(fa,i);
for(int i=;i<=m;i++)lc[i]=;
for(int i=;i<=m;i++)
{
scanf("%lld%lld",&s[i],&c[i]);
rt[c[i]]=merge(rt[c[i]],i);
// lc[i]=1;
}
dfs(,);
for(int i=;i<=n;i++)printf("%d\n",ans[i]);
for(int i=;i<=m;i++)printf("%d\n",dep[c[i]]-dep[end[i]]);
return ;
}
bzoj 4003 [JLOI2015]城池攻占 —— 左偏树的更多相关文章
- BZOJ 4003: [JLOI2015]城池攻占 左偏树 可并堆
https://www.lydsy.com/JudgeOnline/problem.php?id=4003 感觉就是……普通的堆啊(暴论),因为这个堆是通过递归往右堆里加一个新堆或者新节点的,所以要始 ...
- BZOJ 4003 / Luogu P3261 [JLOI2015]城池攻占 (左偏树)
左偏树裸题,在树上合并儿子传上来的堆,然后小于当前结点防御值的就pop掉,pop的时候统计答案. 修改的话就像平衡树一样打懒标记就行了. 具体见代码 CODE #include<bits/std ...
- [JLOI2015]城池攻占 左偏树
题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi &l ...
- [luogu3261 JLOI2015] 城池攻占 (左偏树+标记)
传送门 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的 ...
- [洛谷P3261] [JLOI2015]城池攻占(左偏树)
不得不说,这道题目是真的难,真不愧它的“省选/NOI-”的紫色大火题!!! 花了我晚自习前半节课看题解,写代码,又花了我半节晚自习调代码,真的心态爆炸.基本上改得和题解完全一样了我才过了这道题!真的烦 ...
- BZOJ4003 [JLOI2015]城池攻占 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4003 题意概括 题意有点复杂,直接放原题了. 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑 ...
- [BZOJ4003][JLOI2015]城池攻占(左偏树)
这题有多种做法,一种是倍增预处理出每个点往上走2^i步最少需要的初始战斗力,一种是裸的启发式合并带标记splay. 每个点合并能攻占其儿子的所有骑士,删去所有无法攻占这个城市的骑士并记录答案. 注意到 ...
- bzoj 4003: 城池攻占 左偏树
题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=4003 题解 一开始看漏条件了 题目保证当占领城池可以使攻击力乘上\(v_i\)时,一定有\ ...
- BZOJ 4003 JLOI2015 城池攻占
做法和APIO2012派遣 那道题目类似 在树上DFS,维护当前子树的小根堆 因为需要合并孩子们的信息,使用左偏树就可以了 每次弹出死亡骑士,对剩余骑士打上奖励标记 至于标记的下传和更改,只需要每次在 ...
随机推荐
- CSS 类名的问题
以下以数字开头的 CSS 类名不会生效: .1st{ color: red; } 一个合法的 CSS 类名必需以下面其中之一作为开头: 下划线 _ 短横线 - 字母 a-z 然后紧跟其他 _,- 数字 ...
- luogu P3899 [湖南集训]谈笑风生 线段树合并
Code: #include<bits/stdc++.h> #define maxn 300002 #define ll long long using namespace std; vo ...
- 关于Linux字符集的查看及修改
一·查看字符集 字符集在系统中体现形式是一个环境变量,其查看当前终端使用字符集的方式可以有以下几种方式: 1.[root@ ~]# echo $LANG en_US.UTF-8 ...
- centos7修改时间和时区
设置时区同样, 在 CentOS 7 中, 引入了一个叫 timedatectl 的设置设置程序. 用法很简单: # timedatectl # 查看系统时间方面的各种状态 Local time: 四 ...
- linux diff3-比较3个文件不同的地方
推荐:更多Linux 文件查找和比较 命令关注:linux命令大全 diff3命令用于比较3个文件,将3个文件的不同的地方显示到标准输出. 语法 diff3(选项)(参数) 选项 -a:把所有的文件都 ...
- 【Lqb T336】Cowboys
[链接] 我是链接,点我呀:) [题意] 出现AB就要交换一下 给你结果序列 问你原序列有多少种可能 首尾可以交换. [题解] 设 dp[i][0]表示i和i-1不交换,达到前i个字符序列的状态的方案 ...
- HTTP Simple Storage
ubuntu12.10桌面版 1.安装FastCGI /usr/bin/spawn-fcgi这个文件来管理 FastCGI,它原属于lighttpd这个包里面,但 9.10 后,spawn-fcgi被 ...
- 【GC概述以及查看堆内存使用】Java内存管理和GC学习
内存划分 1.JAVA内存主要划分为方法栈.方法区.堆. 2.方法栈上内存会自动释放: 3.方法区上主要加载了类的元信息.静态变量.常量.改区域又称为持久代(Perm Gen),默认是最小16M,最大 ...
- springmvc 日期转换器
package com.xxx.common.controller.converter; import org.joda.time.DateTime; import org.joda.time.for ...
- POJ 1475 推箱
推箱 时限:n.2000MS 内存限制:n.131072K 提交材料共计: 6600 接受: 2263 特别法官 描述 想象一下你站在一个二维迷宫里,由方形细胞组成,它们可能或可能不会充满 ...