倍增,对于每一个点计算他走到$2^i$次祖先所需要的攻击力以及最终会变成什么(一个一次函数),简单处理即可
(然而这样是错的,因为他只保证了骑士的攻击力可以存,并没有保证这个一次函数的系数可以存)
(其实还可以用科学记数法即pair<long double,int>来存即可,只要注意精度&常数)
正解是模拟,维护当前子树中骑士血量的左偏树(支持合并),然后考虑不断删除堆顶,修改可以用打标记来实现(因为乘的是正的,所以不改变顺序)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 300005
4 #define ll long long
5 struct ji{
6 int nex,to,len;
7 }edge[N<<1];
8 pair<ll,int>val[N];
9 int E,n,m,x,r[N],dis[N],ls[N],rs[N],head[N],d[N],p[N],ans1[N],ans2[N];
10 ll y,tc[N],tj[N],h[N],v[N];
11 void upd(int k,ll x,ll y){
12 tc[k]=tc[k]*x;
13 tj[k]=tj[k]*x+y;
14 val[k].first=val[k].first*x+y;
15 }
16 void down(int k){
17 upd(ls[k],tc[k],tj[k]);
18 upd(rs[k],tc[k],tj[k]);
19 tc[k]=1;
20 tj[k]=0;
21 }
22 int merge(int x,int y){
23 if ((!x)||(!y))return x+y;
24 down(x);
25 down(y);
26 if (val[x]>val[y])swap(x,y);
27 rs[x]=merge(rs[x],y);
28 if (dis[ls[x]]<dis[rs[x]])swap(ls[x],rs[x]);
29 dis[x]=dis[rs[x]]+1;
30 return x;
31 }
32 void add(int x,int y){
33 edge[E].nex=head[x];
34 edge[E].to=y;
35 head[x]=E++;
36 }
37 void dfs(int k,int sh){
38 d[k]=sh;
39 for(int i=head[k];i!=-1;i=edge[i].nex){
40 dfs(edge[i].to,sh+1);
41 r[k]=merge(r[k],r[edge[i].to]);
42 }
43 while ((r[k])&&(val[r[k]].first<h[k])){
44 down(r[k]);
45 ans1[k]++;
46 ans2[r[k]]=d[val[r[k]].second]-d[k];
47 r[k]=merge(ls[r[k]],rs[r[k]]);
48 }
49 if (!p[k])upd(r[k],1,v[k]);
50 else upd(r[k],v[k],0);
51 }
52 int main(){
53 scanf("%d%d",&n,&m);
54 memset(head,-1,sizeof(head));
55 for(int i=1;i<=n;i++)scanf("%lld",&h[i]);
56 for(int i=2;i<=n;i++){
57 scanf("%d%d%lld",&x,&p[i],&v[i]);
58 add(x,i);
59 }
60 for(int i=1;i<=m;i++){
61 scanf("%lld%d",&y,&x);
62 val[i]=make_pair(y,x);
63 tc[i]=1;
64 r[x]=merge(r[x],i);
65 }
66 dfs(1,0);
67 while (r[1]){
68 ans2[r[1]]=d[val[r[1]].second]+1;
69 r[1]=merge(ls[r[1]],rs[r[1]]);
70 }
71 for(int i=1;i<=n;i++)printf("%d\n",ans1[i]);
72 for(int i=1;i<=m;i++)printf("%d\n",ans2[i]);
73 }

[bzoj4003]城市攻占的更多相关文章

  1. [BZOJ4003]城池攻占

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

  2. bzoj-4003 城池攻占

    题意: 给出一个n个结点的有根树,和m个骑士: 树上的结点--城池有一个防御值,骑士有一个战斗力: 当骑士的战斗力大于等于城池时,城池被攻破.骑士的战斗力变化,并向树上的父节点前进: 否则骑士死亡. ...

  3. 【左偏树+延迟标记+拓扑排序】BZOJ4003-城池攻占

    [题目大意] 有n个城市构成一棵树,除1号城市外每个城市均有防御值h和战斗变化参量a和v. 现在有m个骑士各自来刷副本,每个其实有一个战斗力s和起始位置c.如果一个骑士的战斗力s大于当前城市的防御值h ...

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

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

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

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

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

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

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

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

  8. 【BZOJ4003】【JLOI2015】城池攻占(左偏树)

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

  9. 【BZOJ4003】【JLOI2015】城池攻占

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

随机推荐

  1. Java集合——List,Set,Map总结笔记

    1. 集合 Collection 1.1 Java 集合框架 ​ ​ ​ ​ ​ ​ ​ ​ Java 集合框架位于 java.util 包中.Java 集合框架主要包括两种类型的容器,一种是集合(C ...

  2. Java8新特性——Lambda 表达式

    Lambda 表达式 ​ ​ ​ ​ ​ ​ ​ ​ Lambda 表达式的实质属于函数式编程. ​ ​ ​ ​ ​ ​ ​ ​ 语法格式为:(parameters) -> expression ...

  3. 初学Python-day8 案例2

    中奖率 1 import random 2 num = 123456 3 i = 1 4 while True: 5 win = random.randrange(100000, 999999) 6 ...

  4. 【c++ Prime 学习笔记】第3章 字符串、向量和数组

    string和vector是两类最重要的标准库类型 strng表示可变长的字符序列 vector存放某种给定类型对象的可变长序列. 3.1 命名空间的using声明 using namespace:: ...

  5. 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS

    词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...

  6. 合理占用服务器空闲GPU[狗头]

    合理占用服务器GPU资源[狗头] 场景:当你想进行模型训练时,发现GPU全被占用,怎么办? 解决方案1: 在终端输入如下命令:watch -n 设定刷新时间(s) nvidia-smi 然后记起来了回 ...

  7. TortoiseGit使用

    TortoiseGit 前言: 其实作为一名学生,还未接触过企业级开发项目,基本都是一个人在本地敲代码,对于项目管理工具使用的并不多,最常用的命令也就是git clone了,hhh: 前些日子了解了一 ...

  8. BUAA 2020 软件工程 个人博客作业

    BUAA 2020 软件工程 个人博客作业 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 ...

  9. 字符串与模式匹配算法(一):BF算法

    一.BF算法的基本思想 BF(Brute Force)算法是模式匹配中最简单.最直观的算法.该算法最基本的思想是从主串的第 start 个字符起和模式P(要检索的子串)的第1个字符比较,如果相等,则逐 ...

  10. 你知道怎么从jar包里获取一个文件的内容吗

    目录 背景 报错的代码 原先的写法 编写测试类 找原因 最终代码 背景 项目里需要获取一个excle文件,然后对其里的内容进行修改,这个文件在jar包里,怎么尝试都读取不成功,但是觉得肯定可以做到,因 ...