BZOJ4003 [JLOI2015]城池攻占
这题有两种做法来着。。。
第一种就是一开始想到的比较不靠谱,不过貌似可以过掉:
看从$1$号节点开始到$p$号节点最大需要的体力,记录单调上升的体力,询问的时候二分跳着走就可以了
不过精度问题还有可能爆double什么的QAQ
于是写了一半果断弃疗。。。结果有人说他过了【摔
第二种是正解,对于每个点我们可以先把下面的骑士都先做完然后还活着的全部搞到这个点上来,然后再看有谁死在这个点上了
所以我们要维护能都删除/查询最小值,合并,允许打标记的数据结构
貌似是可并堆喵!【完结撒花~
/**************************************************************
Problem: 4003
User: rausen
Language: C++
Result: Accepted
Time:6872 ms
Memory:56988 kb
****************************************************************/ #include <cstdio>
#include <cmath>
#include <algorithm> using namespace std;
typedef double lf;
typedef long long ll; const int N = 3e5 + ; struct edge {
int next, to;
edge(int _n = , int _t = ) : next(_n), to(_t) {}
} e[N]; struct heap {
heap *ls, *rs;
ll v, tag_t, tag_a;
int dep, st, w; void* operator new(size_t, int x, int y, ll z) {
static heap mempool[N], *c = mempool;
c -> ls = c -> rs = NULL;
c -> dep = , c -> v = z, c -> w = x, c -> st = y;
c -> tag_t = , c -> tag_a = ;
return c++;
} inline void Times(ll x) {
v *= x, tag_t *= x, tag_a *= x;
}
inline void Add(ll x) {
v += x, tag_a += x;
}
inline void push() {
if (ls) ls -> Times(tag_t);
if (rs) rs -> Times(tag_t);
tag_t = ;
if (ls) ls -> Add(tag_a);
if (rs) rs -> Add(tag_a);
tag_a = ;
} #define Dep(p) (p ? p -> dep : 0)
inline void update() {
dep = Dep(rs) + ;
} friend heap* merge(heap *x, heap *y) {
if (!x) return y;
if (!y) return x;
if (x -> v > y -> v) swap(x, y);
x -> push();
x -> rs = merge(x -> rs, y);
if (Dep(x -> rs) > Dep(x -> ls)) swap(x -> ls, x -> rs);
x -> update();
return x;
}
#undef Dep inline heap* pop() {
this -> push();
return merge(ls, rs);
}
} *h[N]; struct tree_node {
int fa, a, dep;
ll h, v;
} tr[N]; inline ll read() {
static ll x, sgn;
static char ch;
x = , sgn = , ch = getchar();
while (ch < '' || '' < ch) {
if (ch == '-') sgn = -;
ch = getchar();
}
while ('' <= ch && ch <= '') {
x = x * + ch - '';
ch = getchar();
}
return sgn * x;
} int n, m;
int first[N], tot;
int ans1[N], ans2[N]; inline void add_edge(int x, int y) {
e[++tot] = edge(first[x], y);
first[x] = tot;
} #define y e[x].to
void dfs(int p) {
int x;
tr[p].dep = tr[tr[p].fa].dep + ;
for (x = first[p]; x; x = e[x].next) {
dfs(y);
h[p] = merge(h[p], h[y]);
}
while (h[p] && h[p] -> v < tr[p].h) {
++ans1[p], ans2[h[p] -> w] = tr[h[p] -> st].dep - tr[p].dep;
h[p] = h[p] -> pop();
}
if (h[p])
if (tr[p].a) h[p] -> Times(tr[p].v);
else h[p] -> Add(tr[p].v);
}
#undef y int main() {
int i, x, c;
ll s;
n = read(), m = read();
for (i = ; i <= n; ++i) tr[i].h = read();
for (i = ; i <= n; ++i) {
x = read(), add_edge(x, i);
tr[i].fa = x , tr[i].a = read(), tr[i].v = read();
}
for (i = ; i <= m; ++i) {
s = read(), c = read();
h[c] = merge(h[c], new(i, c, s)heap);
}
dfs();
while (h[]) {
ans2[h[] -> w] = tr[h[] -> st].dep;
h[] = h[] -> pop();
}
for (i = ; i <= n; ++i) printf("%d\n", ans1[i]);
for (i = ; i <= m; ++i) printf("%d\n", ans2[i]);
return ;
}
BZOJ4003 [JLOI2015]城池攻占的更多相关文章
- [bzoj4003][JLOI2015]城池攻占_左偏树
城池攻占 bzoj-4003 JLOI-2015 题目大意:一颗n个节点的有根数,m个有初始战斗力的骑士都站在节点上.每一个节点有一个standard,如果这个骑士的战斗力超过了这个门槛,他就会根据城 ...
- BZOJ4003 [JLOI2015]城池攻占 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4003 题意概括 题意有点复杂,直接放原题了. 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑 ...
- BZOJ4003[JLOI2015]城池攻占——可并堆
题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖, 其中 fi ...
- [BZOJ4003][JLOI2015]城池攻占(左偏树)
这题有多种做法,一种是倍增预处理出每个点往上走2^i步最少需要的初始战斗力,一种是裸的启发式合并带标记splay. 每个点合并能攻占其儿子的所有骑士,删去所有无法攻占这个城市的骑士并记录答案. 注意到 ...
- BZOJ4003 JLOI2015城池攻占
用左偏树模拟攻占的过程,维护最小值,最多入和出m次,每次log复杂度. #include<bits/stdc++.h> using namespace std; ; typedef lon ...
- 【BZOJ4003】[JLOI2015]城池攻占 可并堆
[BZOJ4003][JLOI2015]城池攻占 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号 ...
- BZOJ_4003_[JLOI2015]城池攻占_可并堆
BZOJ_4003_[JLOI2015]城池攻占_可并堆 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 ...
- [洛谷P3261] [JLOI2015]城池攻占(左偏树)
不得不说,这道题目是真的难,真不愧它的“省选/NOI-”的紫色大火题!!! 花了我晚自习前半节课看题解,写代码,又花了我半节晚自习调代码,真的心态爆炸.基本上改得和题解完全一样了我才过了这道题!真的烦 ...
- BZOJ4003:[JLOI2015]城池攻占——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4003 https://www.luogu.org/problemnew/show/P3261 小铭 ...
随机推荐
- Mac : 强大的截图
来源:http://irising.me/2011/11/12135/ Mac的截图功能扩展功能很强大的,不要用QQ那个COM+Ctrl+A弱爆了的截图了~ 首先说一下两种截图1.Command+sh ...
- TreeView控件
public partial class WebForm1 : System.Web.UI.Page { DataSet dsTreeView = new DataSet(); protected v ...
- ubuntu使用mailx利用SMTP发送邮件
转载:http://www.blogjava.net/jasmine214--love/archive/2010/10/09/334102.htmlLinux下mail利用外部邮箱发送邮件的方法: 1 ...
- Python学习(18)面向对象
目录 Python 面向对象 创建实例对象 Python内置类属性 Pyyhon对象销毁(垃圾回收) 类属性与方法 Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此 ...
- (五)uboot移植补基础之shell
1.shell介绍:shell是操作系统的终端命令行 (1)shell可以理解为软件系统提供给用户操作的命令行界面,可以说它是人机交互的一种方式.(2)我们可以使用shell和操作系统.uboot等软 ...
- Android的启动模式(上)
1. 基本介绍 大家平时只要懂一点Android知识的话,都一定会知道,一个应用的组成,往往包含了许多的activity组件,每个activity都应该围绕用户的特定动作进行跳转设计.比如说,一个电话 ...
- DOM加载:浏览器渲染和操作顺序(转载 学习中。。。)
DOM加载:浏览器渲染和操作顺序 1.HTML解析完毕 2.外部脚本和样式表加载完毕 3.脚本在文档内解析并执行 4.HTML DOM完全构造起来 5.图片和外部内容加载 6.网页完成加载 基于这个顺 ...
- hiho_1086_browser_caching
题目 浏览器有一个cache,可以存放M(M <= 5000) 个url地址(url为长度小于30的字符串).现在进行N(N <= 20000)次访问,每一个访问,如果访问的url在cac ...
- K-均值聚类及其在生物信息中的应用
如果一点基础没有最好先拿起一本教材开始学,<机器学习实战>还不错,P93,书上有python源码和练习数据,非常适合新手. k均值聚类 名词:簇:相似度算法 伪代码 创建K个点作为起始质心 ...
- parent relation column can't be updated LESSON_EXTENDED_ATTRIBUTE->LESSON_ID
MyCat 中 作为分片的主键不允许更新 , 需要设置为null,调用updateSelectiveByPrimaryKey来更新数据 parent relation column can't be ...