传送门

每一个城市代表的点开一个小根堆,把每一个骑士合并到它开始攻占的城池所代表的点上

然后开始dfs,每一次把子树里那些还活着的骑士合并上来

然后再考虑当前点的堆,一直pop直到骑士全死光或者剩下的骑士的攻击力都大于等于当前城池的生命值,同时维护城池和骑士的答案

然后修改的话在堆顶打一个标记,需要的时候下传即可

 //minamoto
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
inline ll read(){
#define num ch-'0'
char ch;bool flag=;ll res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char sr[<<],z[];int K=-,Z;
inline void Ot(){fwrite(sr,,K+,stdout),K=-;}
inline void print(int x){
if(K><<)Ot();if(x<)sr[++K]=,x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++K]=z[Z],--Z);sr[++K]='\n';
}
const int N=3e5+;
int head[N],Next[N],ver[N],tot;
inline void add_edge(int u,int v){
ver[++tot]=v,Next[tot]=head[u],head[u]=tot;
}
int L[N],R[N],rt[N],d[N],ans1[N],ans2[N],dep[N],c[N],n,m;
ll add[N],mul[N],v[N],h[N],val[N];bool fl[N];
inline void ppd(int p,ll m,ll a){
if(p){
v[p]*=m,v[p]+=a;
mul[p]*=m,add[p]*=m,add[p]+=a;
}
}
inline void pd(int p){
ppd(L[p],mul[p],add[p]),ppd(R[p],mul[p],add[p]);
mul[p]=,add[p]=;
}
int merge(int x,int y){
if(!x||!y) return x+y;
pd(x),pd(y);
if(v[x]>v[y]) swap(x,y);
R[x]=merge(R[x],y);
if(d[L[x]]<d[R[x]]) swap(L[x],R[x]);
d[x]=d[R[x]]+;return x;
}
void dfs(int u,int fa){
dep[u]=dep[fa]+;
for(int i=head[u];i;i=Next[i]){int v=ver[i];dfs(v,u),rt[u]=merge(rt[u],rt[v]);}
while(rt[u]&&v[rt[u]]<h[u]){
pd(rt[u]);++ans1[u],ans2[rt[u]]=dep[c[rt[u]]]-dep[u];
rt[u]=merge(L[rt[u]],R[rt[u]]);
}
fl[u]?ppd(rt[u],val[u],):ppd(rt[u],,val[u]);
}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),m=read();
for(int i=;i<=n;++i) h[i]=read();
for(int i=;i<=n;++i){
int fa=read();fl[i]=read(),val[i]=read();
add_edge(fa,i);
}
for(int i=;i<=m;++i){
v[i]=read(),c[i]=read();
mul[i]=;
rt[c[i]]=merge(rt[c[i]],i);
}
dfs(,);
while(rt[]) pd(rt[]),ans2[rt[]]=dep[c[rt[]]],rt[]=merge(L[rt[]],R[rt[]]);
for(int i=;i<=n;++i) print(ans1[i]);
for(int i=;i<=m;++i) print(ans2[i]);
Ot();
return ;
}

洛谷P3261 [JLOI2015]城池攻占(左偏树)的更多相关文章

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

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

  2. BZOJ 4003 / Luogu P3261 [JLOI2015]城池攻占 (左偏树)

    左偏树裸题,在树上合并儿子传上来的堆,然后小于当前结点防御值的就pop掉,pop的时候统计答案. 修改的话就像平衡树一样打懒标记就行了. 具体见代码 CODE #include<bits/std ...

  3. [JLOI2015]城池攻占 左偏树

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

  4. [luogu3261 JLOI2015] 城池攻占 (左偏树+标记)

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

  5. BZOJ 4003: [JLOI2015]城池攻占 左偏树 可并堆

    https://www.lydsy.com/JudgeOnline/problem.php?id=4003 感觉就是……普通的堆啊(暴论),因为这个堆是通过递归往右堆里加一个新堆或者新节点的,所以要始 ...

  6. [洛谷P3261][JLOI2015]城池攻占

    题目大意:有$n$个点的树,第$i$个节点有一个权值$h_i$,$m$个骑士,第$i$个骑士攻击力为$v_i$,一个骑士可以把从它开始的连续的父亲中比它小的节点攻破,攻破一个节点可以把攻击力加或乘一个 ...

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

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

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

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

  9. bzoj 4003 [JLOI2015]城池攻占 —— 左偏树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4003 其实蛮简单的,首先一个城市只会被其子树中的骑士经过,启发我们 dfs 序用可并堆合并子 ...

随机推荐

  1. 转 Linux里设置环境变量的方法(export PATH)

    1.动态库路径的设置 Linux下调用动态库和windows不一样.linux 可执行程序是靠配置文件去读取路径的,因此有些时候需要设置路径 具体操作如下export LD_LIBRARY_PATH= ...

  2. Android远程服务

    一.远程服务主要代码 1.IService.aidl package com.shz.remoteservice; interface IService { String getTicketInfoB ...

  3. Java获取Linux系统cpu使用率

    原文:http://www.open-open.com/code/view/1426152165201 import java.io.BufferedReader; import java.io.Fi ...

  4. C++:vector中的resize()函数 VS reserve()函数

    http://www.cnblogs.com/biyeymyhjob/archive/2013/05/11/3072893.html

  5. 【stl学习笔记】list

    list使用双向链表来管理元素. 与vector.deque的区别: 1.list不支持随机存取,在list中随机遍历任意元素,是很缓慢的行为 2.任何位置上执行元素的安插和移除都非常快,始终是常数时 ...

  6. 【Nginx】I/O多路转接之select、poll、epoll

    当需要读两个以上的I/O的时候,如果使用阻塞式的I/O,那么可能长时间的阻塞在一个描述符上面,另外的描述符虽然有数据但是不能读出来,这样实时性不能满足要求,大概的解决方案有以下几种: 1.使用多进程或 ...

  7. javascript/jquery模板引擎——Handlebars初体验

    Handlebars.js下载地址:http://handlebarsjs.com/ 最近自己在建一个站,采用完全的前后端分离的方式,现在正在做前端的部分.其中有项功能是需要ajax调用后端接口,返回 ...

  8. 【Jquery】jQuery获取URL參数的两种方法

    jQuery获取URL參数的关键是获取到URL,然后对URL进行过滤处理,取出參数. location.href是取得URL.location.search是取得URL"?"之后的 ...

  9. PyTorch 高级实战教程:基于 BI-LSTM CRF 实现命名实体识别和中文分词

    前言:译者实测 PyTorch 代码非常简洁易懂,只需要将中文分词的数据集预处理成作者提到的格式,即可很快的就迁移了这个代码到中文分词中,相关的代码后续将会分享. 具体的数据格式,这种方式并不适合处理 ...

  10. Poi 操作 Excel

    http://blog.csdn.net/chenglc1612/article/details/53413445   一. POI简介              Apache POI是Apache软 ...