bzoj 4003
左偏树。。。
打两个标记。。。和线段树一样,先下放cheng再下放*。
每回合并子树就行了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define N 300010
#define int long long
using namespace std;
int n,m,h[N];
int b[N],v[N];
int s[N],root[N];
vector<int>qi[N];
int c[N],ans[N],ans2[N];
int head[N],nxt[N],ver[N],tot;
void add(int a,int d)
{
tot++;nxt[tot]=head[a];head[a]=tot;ver[tot]=d;return ;
}
struct node
{
int l,r,w,d,lazy1,lazy2;
int pre;
node()
{
lazy2=;
}
}a[N*];int cnt;
int dep[N];
void push_down(int x)
{
int t1=a[x].l;int t2=a[x].r;
if(t1)
{
a[t1].w*=a[x].lazy2,a[t1].lazy1*=a[x].lazy2,a[t1].lazy2*=a[x].lazy2;
a[t1].w+=a[x].lazy1;
a[t1].lazy1+=a[x].lazy1;
}
if(t2)
{
a[t2].w*=a[x].lazy2,a[t2].lazy1*=a[x].lazy2,a[t2].lazy2*=a[x].lazy2;
a[t2].w+=a[x].lazy1;
a[t2].lazy1+=a[x].lazy1;
}
a[x].lazy1=;
a[x].lazy2=;
return ;
}
int merge(int x,int y)
{
if(!x||!y)return x+y;
if(a[x].w>a[y].w)swap(x,y);
push_down(x);
a[x].r=merge(a[x].r,y);
if(a[a[x].l].d<a[a[x].r].d)swap(a[x].l,a[x].r);
a[x].d=a[a[x].r].d+;
return x;
}
void dfs(int x)
{
root[x]=;
for(int i=;i<qi[x].size();i++)
{
a[++cnt].pre=qi[x][i];a[cnt].w=s[qi[x][i]];root[x]=merge(root[x],cnt);
}
for(int i=head[x];i;i=nxt[i])
{
dep[ver[i]]=dep[x]+;
dfs(ver[i]);
root[x]=merge(root[x],root[ver[i]]);
}
while(root[x]&&a[root[x]].w<h[x])
{
ans[x]++;
int y=a[root[x]].pre;
ans2[y]=dep[c[y]]-dep[x];
push_down(root[x]);
root[x]=merge(a[root[x]].l,a[root[x]].r);
}
if(root[x])
{
if(!b[x])
{
a[root[x]].w+=v[x];
a[root[x]].lazy1+=v[x];
}
else
{
a[root[x]].w*=v[x];
a[root[x]].lazy1*=v[x];
a[root[x]].lazy2*=v[x];
}
}
return ;
}
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=;i<=n;i++)scanf("%lld",&h[i]);
int t1;
for(int i=;i<=n;i++)
{
scanf("%lld",&t1);
add(t1,i);
scanf("%lld%lld",&b[i],&v[i]);
}
for(int i=;i<=m;i++)
{
scanf("%lld%lld",&s[i],&t1);
qi[t1].push_back(i);c[i]=t1;
}
dep[]=;
dfs();
while(root[]!=)
{
int y=a[root[]].pre;
ans2[y]=dep[c[y]]-dep[]+;
push_down(root[]);
root[]=merge(a[root[]].l,a[root[]].r);
}
for(int i=;i<=n;i++)printf("%lld\n",ans[i]);
for(int i=;i<=m;i++)printf("%lld\n",ans2[i]);
return ;
}
bzoj 4003的更多相关文章
- BZOJ 4003: [JLOI2015]城池攻占 左偏树 可并堆
https://www.lydsy.com/JudgeOnline/problem.php?id=4003 感觉就是……普通的堆啊(暴论),因为这个堆是通过递归往右堆里加一个新堆或者新节点的,所以要始 ...
- bzoj 4003: 城池攻占 左偏树
题目大意 http://www.lydsy.com/JudgeOnline/problem.php?id=4003 题解 一开始看漏条件了 题目保证当占领城池可以使攻击力乘上\(v_i\)时,一定有\ ...
- bzoj 4003 [JLOI2015]城池攻占 —— 左偏树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4003 其实蛮简单的,首先一个城市只会被其子树中的骑士经过,启发我们 dfs 序用可并堆合并子 ...
- BZOJ 4003 【JLOI2015】城池攻占
Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖, ...
- BZOJ 4003 JLOI2015 城池攻占
做法和APIO2012派遣 那道题目类似 在树上DFS,维护当前子树的小根堆 因为需要合并孩子们的信息,使用左偏树就可以了 每次弹出死亡骑士,对剩余骑士打上奖励标记 至于标记的下传和更改,只需要每次在 ...
- BZOJ 4003 左偏树
思路: 用到了左偏树合并复杂度是logn的性质 一开始先BFS一遍 打标记的左偏树 //By SiriusRen #include <cstdio> #include <cstrin ...
- BZOJ 4003 / Luogu P3261 [JLOI2015]城池攻占 (左偏树)
左偏树裸题,在树上合并儿子传上来的堆,然后小于当前结点防御值的就pop掉,pop的时候统计答案. 修改的话就像平衡树一样打懒标记就行了. 具体见代码 CODE #include<bits/std ...
- BZOJ 4003 (可并堆)
题面 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖, 其中 fi &l ...
- Luogu 3261 [JLOI2015]城池攻占
BZOJ 4003 需要实现一个可并堆. 每个点维护一个小根堆,然后一开始把所有骑士加入到它所在的点的小根堆当中,实际上空间是$O(m)$的,然后我们从上到下不断合并这个小根堆,合并完之后如果遇到堆顶 ...
随机推荐
- nginx php-fpm 输出php错误日志
nginx是一个web服务器,因此nginx的access日志只有对访问页面的记录,不会有php 的 error log信息. nginx把对php的请求发给php-fpm fastcgi进程来处理, ...
- spider RPC性能测试报告
测试环境部署结构 测试用例 类 别 说明 请求报文 194字节({"systemId":"PL","appVersion":"qq ...
- 菜鸟快飞之JavaScript对象、原型、继承(三)
正文之前需要声明的一点是,菜鸟系列博文全是基于ES5的,不考虑ES6甚至更高版本. 继承 由于我个人不是学计算机的,所以对于很多东西只是知其然,不知其所以然.就像这个继承,刚开始学JavaScript ...
- 实用的圆形图片控件ImageView
1.用法直接在布局中引用即可 import android.content.Context;import android.content.res.TypedArray;import android.g ...
- [Modern OpenGL系列(四)]在OpenGL中使用Shader
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51347440 在上一篇文章中已经介绍了OpenGL窗口的创建.本文接着说如 ...
- (视频)Erich Gamma 与 Visual Studio Online 的一点野史
大家对Erich Gamma的熟悉应该都集中在<设计模式>, Eclipse以及最近微软所发布的Visual Studio Code跨平台代码编辑器.其实在Erich加入微软的头几年里,他 ...
- MP3文件ID3信息编辑器代码开源 - 开源研究系列文章
上次把磁性窗体的源码开源了,这次就开源另一个程序源码:MP3文件ID3信息编辑器.这个源码也比较简单,关键在于获取和写入MP3文件的这个ID3的信息即可. 这个操作信息编辑的就封装在MP3ID3.ba ...
- javaWeb项目中Web.xml的基本配置
这个地址写的非常好 ,欢迎大家访问 Å:http://www.cnblogs.com/hxsyl/p/3435412.html 一.理论准备 先说下我记得xml规则,必须有且只有一个根节点,大小写敏感 ...
- centos本地yum源安装
1.为DVD或U盘创建一个用于挂载的目录 [root@localhost ~]# mkdir /media/CentOS/ 2.查看DVD或U盘所在的路径 [root@localhost ~]# fd ...
- AC日记——忠诚 洛谷 P1816
题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人的挑拨,财主还是对管家产生了 ...