浅谈左偏树:https://www.cnblogs.com/AKMer/p/10246635.html

题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=4003

从下往上合并左偏树然后把战斗力低的踢掉。做完之后打标记。因为不会乘负数所以小根堆的性质不会被破坏。

不知道为什么用\(struct\)封装左偏树会\(RE\),改成\(namespace\)之后才\(AC\)。

时间复杂度:\(O(nlogn)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll; const int maxn=3e5+5; bool a[maxn];
int dep[maxn];
ll h[maxn],v[maxn];
int n,m,tot,rt[maxn],ans[maxn];
int now[maxn],pre[maxn],to[maxn];
struct Knight {int c,ans;ll s;}p[maxn]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} ll READ() {
ll x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} void add(int a,int b) {
pre[++tot]=now[a];
now[a]=tot,to[tot]=b;
} namespace T {//用struct会RE,我也不清楚
int dist[maxn];
int son[maxn][2];
ll add_tag[maxn],mul_tag[maxn]; void init() {
dist[0]=-1;
for(int i=1;i<=m;i++)
add_tag[i]=0,mul_tag[i]=1;
} void make_mul_tag(int u,ll v) {
p[u].s*=v,add_tag[u]*=v,mul_tag[u]*=v;
} void make_add_tag(int u,ll v) {
p[u].s+=v,add_tag[u]+=v;
} void push_down(int p) {
if(mul_tag[p]!=1) {
make_mul_tag(son[p][0],mul_tag[p]);
make_mul_tag(son[p][1],mul_tag[p]);
mul_tag[p]=1;
}
if(add_tag[p]) {
make_add_tag(son[p][0],add_tag[p]);
make_add_tag(son[p][1],add_tag[p]);
add_tag[p]=0;
}
} int merge(int a,int b) {
if(!a||!b)return a+b;
if(p[a].s>p[b].s)swap(a,b);
push_down(a);
son[a][1]=merge(son[a][1],b);
if(dist[son[a][1]]>dist[son[a][0]])
swap(son[a][1],son[a][0]);
dist[a]=dist[son[a][1]]+1;
return a;
} int pop(int u) {
push_down(u);
int tmp=merge(son[u][0],son[u][1]);
son[u][0]=son[u][1]=0;
return tmp;
}
} void dfs(int u) {
for(int P=now[u],V=to[P];P;P=pre[P],V=to[P])
dep[V]=dep[u]+1,dfs(V),rt[u]=T::merge(rt[u],rt[V]);
while(rt[u]&&p[rt[u]].s<h[u]) {
ans[u]++;p[rt[u]].ans=dep[p[rt[u]].c]-dep[u];
rt[u]=T::pop(rt[u]);
}
if(a[u])T::make_mul_tag(rt[u],v[u]);
else T::make_add_tag(rt[u],v[u]);
} int main() {
n=read(),m=read();
for(int i=1;i<=n;i++)h[i]=READ();
for(int i=2;i<=n;i++) {
int f=read();add(f,i);
a[i]=read(),v[i]=READ();
}T::init();
for(int i=1;i<=m;i++) {
p[i].s=READ(),p[i].c=read();
rt[p[i].c]=T::merge(rt[p[i].c],i);
}dep[1]=1;dfs(1);
while(rt[1]) {
p[rt[1]].ans=dep[p[rt[1]].c];
rt[1]=T::pop(rt[1]);
}
for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
for(int i=1;i<=m;i++)printf("%d\n",p[i].ans);
return 0;
}

BZOJ4003:[JLOI2015]城池攻占的更多相关文章

  1. [bzoj4003][JLOI2015]城池攻占_左偏树

    城池攻占 bzoj-4003 JLOI-2015 题目大意:一颗n个节点的有根数,m个有初始战斗力的骑士都站在节点上.每一个节点有一个standard,如果这个骑士的战斗力超过了这个门槛,他就会根据城 ...

  2. BZOJ4003 [JLOI2015]城池攻占 左偏树 可并堆

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4003 题意概括 题意有点复杂,直接放原题了. 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑 ...

  3. BZOJ4003[JLOI2015]城池攻占——可并堆

    题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖, 其中 fi ...

  4. [BZOJ4003][JLOI2015]城池攻占(左偏树)

    这题有多种做法,一种是倍增预处理出每个点往上走2^i步最少需要的初始战斗力,一种是裸的启发式合并带标记splay. 每个点合并能攻占其儿子的所有骑士,删去所有无法攻占这个城市的骑士并记录答案. 注意到 ...

  5. BZOJ4003 JLOI2015城池攻占

    用左偏树模拟攻占的过程,维护最小值,最多入和出m次,每次log复杂度. #include<bits/stdc++.h> using namespace std; ; typedef lon ...

  6. BZOJ4003 [JLOI2015]城池攻占

    这题有两种做法来着... 第一种就是一开始想到的比较不靠谱,不过貌似可以过掉: 看从$1$号节点开始到$p$号节点最大需要的体力,记录单调上升的体力,询问的时候二分跳着走就可以了 不过精度问题还有可能 ...

  7. 【BZOJ4003】[JLOI2015]城池攻占 可并堆

    [BZOJ4003][JLOI2015]城池攻占 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号 ...

  8. BZOJ_4003_[JLOI2015]城池攻占_可并堆

    BZOJ_4003_[JLOI2015]城池攻占_可并堆 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 ...

  9. [洛谷P3261] [JLOI2015]城池攻占(左偏树)

    不得不说,这道题目是真的难,真不愧它的“省选/NOI-”的紫色大火题!!! 花了我晚自习前半节课看题解,写代码,又花了我半节晚自习调代码,真的心态爆炸.基本上改得和题解完全一样了我才过了这道题!真的烦 ...

  10. BZOJ4003:[JLOI2015]城池攻占——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4003 https://www.luogu.org/problemnew/show/P3261 小铭 ...

随机推荐

  1. 测试站如何最快获取正式站的最新数据: ln -s

    针对静态数据, 比如图片/js等文件, 测试站如何获取最新的呢? ln -s /alidata/www/mysite/uploads /alidata/www/mysite_test/uploads ...

  2. thinkphp将APP_DEBUG常量设置为false后报错的问题

    ThinkPHP 将 APP_DEBUG 常量设置为 false 后出现了下面的问题: Parse error: syntax error, unexpected T_STRING in \www\R ...

  3. Linux中假设系统丢失了ls命令

    假设系统丢失了ls命令,如何修复: 1.查询ls命令属于那个rpm包[root@localhost ~]# rpm -qf /bin/lscoreutils-8.4-43.el6.x86_64 2.挂 ...

  4. (转)Javascript模块化编程(三):require.js的用法

    这个系列的第一部分和第二部分,介绍了Javascript模块原型和理论概念,今天介绍如何将它们用于实战. 我采用的是一个非常流行的库require.js. 一.为什么要用require.js? 最早的 ...

  5. 从分布式锁来看redis和zookpeer!

    从分布式锁来看redis和zookpeer! 目前网上大部分的基于zookpeer,和redis的分布式锁的文章都不够全面.要么就是特意避开集群的情况,要么就是考虑不全,读者看着还是一脸迷茫.坦白说, ...

  6. C#读取excel 找不到可安装的ISAM

    实在没有办法了 就仔细的查看了 一下数据链接字符串: string strConn = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" ...

  7. Spring笔记:IOC基础

    Spring笔记:IOC基础 引入IOC 在Java基础中,我们往往使用常见关键字来完成服务对象的创建.举个例子我们有很多U盘,有金士顿的(KingstonUSBDisk)的.闪迪的(SanUSBDi ...

  8. link_to嵌套

    = link_to theses_path, :class=>"btn" do .text-center 购买

  9. 第五章 python中的异常处理

    每种编程语言都会有自己的异常处理机制,虽然各有特色,但基本上都差不多,那么python中强大异常处理机制是什么样的呢? 一.异常: python用异常对象来表示异常情况,遇到错误后,会引发异常.如果异 ...

  10. Cache-Control常用类型

    可缓存性 no-cache 强制所有缓存了此响应的缓存用户,在使用已存储的缓存数据前,发送条件请求到原始服务器,若未过期,则使用缓存数据,否则重新获取 no-store 不存储有关客户端请求或服务器响 ...