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,维护当前子树的小根堆 因为需要合并孩子们的信息,使用左偏树就可以了 每次弹出死亡骑士,对剩余骑士打上奖励标记 至于标记的下传和更改,只需要每次在 ...
 
随机推荐
- ThinkPHP---TP功能类之分页
			
(1)核心 数据分页通过limit语法实现 (2)分页类 ThinkPHP里系统封装好了分页类:Page.class.php (3)代码分析 位置:Think/Page.class.php, ①查看相 ...
 - NOIP2000方格取数(洛谷,动态规划递推)
			
先上题目: P1004 方格取数 下面上ac代码: ///如果先走第一个再走第二个不可控因素太多 #include<bits/stdc++.h> #define ll long long ...
 - out对象的使用
			
out对象的使用 制作人:全心全意 out对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区.在使用out对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的 ...
 - FZU 1492 地震预测(模拟链表的应用)(Java实现)
			
FZU 1492 地震预测(模拟链表的应用)(Java实现) 怀特先生是一名研究地震的科学家,最近他发现如果知道某一段时间内的地壳震动能量采样的最小波动值之和,可以有效地预测大地震的发生. 假设已知一 ...
 - 【Codeforces 598D】Igor In the Museum
			
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 同一个联通块里面答案都一样. 把每个联通块的答案都算出来 然后赋值就好 [代码] #include <bits/stdc++.h> ...
 - codeforces   371B - Fox Dividing Cheese
			
#include<stdio.h> int count; int gcd(int a,int b) { if(b==0) return a; return gcd(b,a%b); ...
 - 一文教你用 Neo4j 快速构建明星关系图谱
			
更多有趣项目及代码见于:DesertsX/gulius-projects 前言 本文将带你用 neo4j 快速实现一个明星关系图谱,因为拖延的缘故,正好赶上又一年的4月1日,于是将文中的几个例子顺势改 ...
 - 最大公约数GCD
			
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 输入2个正整数A,B,求A与B的最大公约数. Input 2个数A,B,中间用空格隔开.(1<= A,B <= ...
 - 51Nod——T 1631 小鲨鱼在51nod小学
			
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1631 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 ...
 - 又通过一道题目,替换字符串 —— 剑指Offer
			
https://www.nowcoder.net/practice/4060ac7e3e404ad1a894ef3e17650423?tpId=13&tqId=11155&tPage= ...