[bzoj4003]城市攻占
倍增,对于每一个点计算他走到$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]城市攻占的更多相关文章
- [BZOJ4003]城池攻占
Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖, ...
- bzoj-4003 城池攻占
题意: 给出一个n个结点的有根树,和m个骑士: 树上的结点--城池有一个防御值,骑士有一个战斗力: 当骑士的战斗力大于等于城池时,城池被攻破.骑士的战斗力变化,并向树上的父节点前进: 否则骑士死亡. ...
- 【左偏树+延迟标记+拓扑排序】BZOJ4003-城池攻占
[题目大意] 有n个城市构成一棵树,除1号城市外每个城市均有防御值h和战斗变化参量a和v. 现在有m个骑士各自来刷副本,每个其实有一个战斗力s和起始位置c.如果一个骑士的战斗力s大于当前城市的防御值h ...
- [BZOJ4003][JLOI2015]城池攻占(左偏树)
这题有多种做法,一种是倍增预处理出每个点往上走2^i步最少需要的初始战斗力,一种是裸的启发式合并带标记splay. 每个点合并能攻占其儿子的所有骑士,删去所有无法攻占这个城市的骑士并记录答案. 注意到 ...
- [bzoj4003][JLOI2015]城池攻占_左偏树
城池攻占 bzoj-4003 JLOI-2015 题目大意:一颗n个节点的有根数,m个有初始战斗力的骑士都站在节点上.每一个节点有一个standard,如果这个骑士的战斗力超过了这个门槛,他就会根据城 ...
- BZOJ4003 [JLOI2015]城池攻占 左偏树 可并堆
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4003 题意概括 题意有点复杂,直接放原题了. 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑 ...
- 【BZOJ4003】[JLOI2015]城池攻占 可并堆
[BZOJ4003][JLOI2015]城池攻占 Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号 ...
- 【BZOJ4003】【JLOI2015】城池攻占(左偏树)
题面 题目描述 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其中 fi ...
- 【BZOJ4003】【JLOI2015】城池攻占
Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池.这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖,其 ...
随机推荐
- Python中字符串常用方法
capitalize() String.capitalize() 将字符串首字母变为大写 name = 'xiaoming' new_name = name.capitalize() print(ne ...
- K12教培从业者转型指南 换个赛道依然可以再创辉煌
随着"双减"政策的落地,属于K12教培机构的时代逐渐拉上帷幕,面对机会不再的K12教培行业,约70万机构和近千万的从业人员面临转型问题.压力之下,留下或离开?对广大K12教培机构从 ...
- 小甲鱼零基础学python第25讲课后习题动手练习--通讯录
小甲鱼零基础学python第25讲课后习题动手练习---通讯录 **************************通讯录要求******************************* 输入指令: ...
- 一站式交付体验:云效+Kubernetes
背景 云效依托于阿里巴巴研发效能多年规模化持续交付,赋能云上开发者专为云端用户提供的一站式研发协作平台.Kubernetes,由Google开源的容器集群管理平台,面向运维侧提供自动化的集群和应用管理 ...
- elasticsearch嵌套对象的映射
在es中,我们有时候可能需要映射,{ "field" : "xx" , "field01" : [] }这样格式的嵌套对象,默认情况下es会 ...
- RocketMQ源码详解 | Producer篇 · 其一:Start,然后 Send 一条消息
概述 DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); ...
- Noip模拟10 2021.6.27
T1 入阵曲 好了,又一个考试败笔题. 也就是在那个时候,小 F 学会了矩阵乘法.让两个矩阵乘几次就能算出斐波那契数, 真是奇妙无比呢. 不过, 小 F 现在可不想手算矩阵乘法--他觉得好麻烦.取而代 ...
- 2021.8.12考试总结[NOIP模拟37]
T1 数列 考场上切掉的简单题. $a$,$b$与数列中数的正负值对答案无关.全当作正数计算即可. $exgcd$解未知数系数为$a$,$b$,加和为$gcd(a,b)$的不定方程组,再枚举每个数.如 ...
- stm32电机控制之控制两路直流电机
小车使用的电机是12v供电的直流电机,带编码器反馈,这样就可以采用闭环速度控制,这里电机使用PWM驱动,速度控制框图如下: 由以上框图可知,STM32通过定时器模块输出PWM波来控制两个直流电机的转动 ...
- numpy数组的计算
1.数组的形状 查看数组的形状: import numpy as np a = np.array([[1, 2, 3, 4, 5], [5, 6, 7, 8, 9]]) print(a.shape) ...