BZOJ 4003: [JLOI2015]城池攻占 左偏树 可并堆
https://www.lydsy.com/JudgeOnline/problem.php?id=4003
感觉就是……普通的堆啊(暴论),因为这个堆是通过递归往右堆里加一个新堆或者新节点的,所以要始终保持右边堆的深度比左边堆的小一些以保证复杂度,大概因为这个所以也叫左偏树吧。
这个题我最开始看错题目了所以看板子的时候一头雾水满脑子都是“这个实现有问题吧”,然后又看了一遍题目发现没问题骑士就是往上走的。
这道题是把每个点建一个堆然后从叶子到根向上传递+去掉没法再往上的,复杂度大概是O(nlogn)?
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=;
long long read(){
long long x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(''<=ch&&ch<=''){ x=x*+ch-'';ch=getchar(); }
return x*f;
}
int n,m;
long long h[maxn]={},k[maxn]={},b[maxn]={},s[maxn]={};
int fa[maxn]={},c[maxn]={};
int rt[maxn]={},ans1[maxn]={},ans2[maxn]={};
struct use{ int y,next; }e[maxn];
int head[maxn]={},dep[maxn]={},tot=;
struct hp{ long long k,b,v; int dis,l,r; }t[maxn];
void init(int x,int y){
e[++tot].y=y;e[tot].next=head[x];head[x]=tot;
}
inline void Ad(int x,long long tk,long long tb){
t[x].k*=tk;
t[x].b=t[x].b*tk+tb;
t[x].v=t[x].v*tk+tb;
}
inline void downdata(int x){
if(t[x].l)Ad(t[x].l,t[x].k,t[x].b);;
if(t[x].r)Ad(t[x].r,t[x].k,t[x].b);
t[x].k=;t[x].b=;
}
int merge(int x,int y){
if(!x)return y;if(!y)return x;
downdata(x);downdata(y);
if(t[x].v>t[y].v)swap(x,y);
t[x].r=merge(t[x].r,y);
if(t[t[x].r].dis>t[t[x].l].dis)swap(t[x].r,t[x].l);
t[x].dis=t[t[x].r].dis+;
return x;
}
void dfs(int x){
int y;
for(int i=head[x];i;i=e[i].next){
y=e[i].y;
dep[y]=dep[x]+;
dfs(y);Ad(rt[y],k[y],b[y]);
rt[x]=merge(rt[x],rt[y]);
}
while(rt[x]&&t[rt[x]].v<h[x]){
downdata(rt[x]);ans1[x]++;
ans2[rt[x]]=dep[c[rt[x]]]-dep[x];
rt[x]=merge(t[rt[x]].l,t[rt[x]].r);
}
}
int main(){
n=read();m=read();
for(int i=;i<=n;i++)h[i]=read();
for(int i=;i<=n;i++){
fa[i]=read();init(fa[i],i);
k[i]=read();b[i]=read();
if(!k[i])k[i]=;
else{k[i]=b[i];b[i]=;}
}
for(int i=;i<=m;i++){
s[i]=read();c[i]=read();
t[i].k=; t[i].b=; t[i].v=s[i];
rt[c[i]]=merge(rt[c[i]],i);
}dep[]=;
dfs();
while(rt[]){
downdata(rt[]);
ans2[rt[]]=dep[c[rt[]]];
rt[]=merge(t[rt[]].l,t[rt[]].r);
}
for(int i=;i<=n;i++)printf("%d\n",ans1[i]);
for(int i=;i<=m;i++)printf("%d\n",ans2[i]);
return ;
}
BZOJ 4003: [JLOI2015]城池攻占 左偏树 可并堆的更多相关文章
- bzoj 4003 [JLOI2015]城池攻占 —— 左偏树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4003 其实蛮简单的,首先一个城市只会被其子树中的骑士经过,启发我们 dfs 序用可并堆合并子 ...
- BZOJ4003 [JLOI2015]城池攻占 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4003 题意概括 题意有点复杂,直接放原题了. 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑 ...
- [洛谷P3261] [JLOI2015]城池攻占(左偏树)
不得不说,这道题目是真的难,真不愧它的“省选/NOI-”的紫色大火题!!! 花了我晚自习前半节课看题解,写代码,又花了我半节晚自习调代码,真的心态爆炸.基本上改得和题解完全一样了我才过了这道题!真的烦 ...
- 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 的 ...
- [BZOJ4003][JLOI2015]城池攻占(左偏树)
这题有多种做法,一种是倍增预处理出每个点往上走2^i步最少需要的初始战斗力,一种是裸的启发式合并带标记splay. 每个点合并能攻占其儿子的所有骑士,删去所有无法攻占这个城市的骑士并记录答案. 注意到 ...
- bzoj 4003: 城池攻占 左偏树
题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=4003 题解 一开始看漏条件了 题目保证当占领城池可以使攻击力乘上\(v_i\)时,一定有\ ...
- BZOJ 4003 JLOI2015 城池攻占
做法和APIO2012派遣 那道题目类似 在树上DFS,维护当前子树的小根堆 因为需要合并孩子们的信息,使用左偏树就可以了 每次弹出死亡骑士,对剩余骑士打上奖励标记 至于标记的下传和更改,只需要每次在 ...
随机推荐
- 【译】第一篇 Replication:复制简介
本篇文章是SQL Server Replication系列的第一篇,详细内容请参考原文. 复制这个词来自拉丁语中的"replicare",意味着重复.Replication des ...
- [转]CMake快速入门教程:实战
转自http://blog.csdn.net/ljt20061908/article/details/11736713 0. 前言 一个多月前,由于工程项目的需要,匆匆的学习了一下cmake的使 ...
- openjudge-NOI 2.5-1700 八皇后问题
题目链接:http://noi.openjudge.cn/ch0205/1700/ 题解: 经典深搜题目…… #include<cstdio> ][]; int num; void pri ...
- JSP和Servlet那些事儿系列--HTTPS
原文:http://qingkangxu.iteye.com/blog/1614053 <JSP和Servlet那些事儿 >系列文章旨在阐述Servlet(Struts和Spring的MV ...
- 安装mysql-python报错解决办法
报错: 按照网上的办法,安装mysql-connector-c-6.1.10-winx64.msi和MySQL-python-1.2.3.win-amd64-py2.7 .exe都不行,又源码安装My ...
- CF GYM100548 (相邻格子颜色不同的方案数 2014西安现场赛F题 容斥原理)
n个格子排成一行,有m种颜色,问用恰好k种颜色进行染色,使得相邻格子颜色不同的方案数. integers n, m, k (1 ≤n, m ≤ 10^9, 1 ≤ k ≤ 10^6, k ≤ n, m ...
- Pg188-3 构造方法
package org.hanqi.array; public class Father { private String name; private int age; public String g ...
- ASP.NET Web API 2 external logins with Facebook and Google in AngularJS app
转载:http://bitoftech.net/2014/08/11/asp-net-web-api-2-external-logins-social-logins-facebook-google-a ...
- 程序设计实习MOOC / 程序设计与算法(二)第二周测验(2018春季)
递归算法: 1:全排列 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列. 我们假设对于小写字母有'a' < ' ...
- Action(8):Error-26608:HTTP Status-Code=504(Gateway Time-out)
Action(8):Error-26608:HTTP Status-Code=504(Gateway Time-out) 若出现如下图问题, 1.在Vuser Generator中的Tools---& ...