「JLOI2015」城池攻占 解题报告
「JLOI2015」城池攻占
注意到任意两个人的战斗力相对大小的不变的
可以离线的把所有人赛到初始点的堆里
然后做启发式合并就可以了
Code:
#include <cstdio>
#include <cctype>
#include <algorithm>
#define ll long long
const int N=3e5+10;
template <class T>
void read(T &x)
{
int f=0;x=0;char c=getchar();
while(!isdigit(c)) f|=c=='-',c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
x=f?-x:x;
}
int head[N],to[N],Next[N],cnt;
void add(int u,int v)
{
to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
int n,m,op[N],ans1[N],ans2[N],st[N],dep[N];
ll h[N],a[N];
struct node
{
ll mul,add;
node(){}
node(ll Mul,ll Add){mul=Mul,add=Add;}
}tag[N];
#define ls ch[x][0]
#define rs ch[x][1]
int ch[N][2],dis[N],root[N];ll dat[N];
void addtag(int x,node tg)
{
if(!x) return;
dat[x]=dat[x]*tg.mul+tg.add;
tag[x].mul*=tg.mul,tag[x].add*=tg.mul;
tag[x].add+=tg.add;
}
void pushdown(int x)
{
if(tag[x].mul==1&&!tag[x].add) return;
addtag(ls,tag[x]);
addtag(rs,tag[x]);
tag[x].mul=1,tag[x].add=0;
}
int Merge(int x,int y)
{
if(!x||!y) return x^y;
pushdown(x),pushdown(y);
if(dat[x]>dat[y]) std::swap(x,y);
rs=Merge(rs,y);
if(dis[ls]<dis[rs]) std::swap(ls,rs);
dis[x]=dis[rs]+1;
return x;
}
void del(int &x){pushdown(x),x=Merge(ls,rs);}
void dfs(int now)
{
for(int v,i=head[now];i;i=Next[i])
{
dep[v=to[i]]=dep[now]+1;
dfs(v);
root[now]=Merge(root[now],root[v]);
}
while(dat[root[now]]<h[now])
{
ans2[root[now]]=dep[st[root[now]]]-dep[now];
++ans1[now];
del(root[now]);
}
if(op[now]) addtag(root[now],node(a[now],0));
else addtag(root[now],node(1,a[now]));
}
int main()
{
read(n),read(m);
for(int i=1;i<=n;i++) read(h[i]);
for(int f,i=2;i<=n;i++) read(f),read(op[i]),read(a[i]),add(f,i);
h[0]=2e18,dat[0]=3e18;
for(int i=1;i<=m;i++)
{
read(dat[i]),read(st[i]);
dis[i]=1,tag[i]=node(1,0);
root[st[i]]=Merge(root[st[i]],i);
}
dep[1]=1;dfs(1);
while(dat[root[1]]<h[0])
{
ans2[root[1]]=dep[st[root[1]]];
del(root[1]);
}
for(int i=1;i<=n;i++) printf("%d\n",ans1[i]);
for(int i=1;i<=m;i++) printf("%d\n",ans2[i]);
return 0;
}
2019.2.26
「JLOI2015」城池攻占 解题报告的更多相关文章
- 「JLOI2015」骗我呢 解题报告?
「JLOI2015」骗我呢 这什么神仙题 \[\color{purple}{Link}\] 可以学到的东西 对越过直线的东西翻折进行容斥 之类的..吧? Code: #include <cstd ...
- 「JLOI2015」管道连接 解题报告
「JLOI2015」管道连接 先按照斯坦纳树求一个 然后合并成斯坦纳森林 直接枚举树的集合再dp一下就好了 Code: #include <cstdio> #include <cct ...
- 「JLOI2015」战争调度 解题报告
「JLOI2015」战争调度 感觉一到晚上大脑就宕机了... 题目本身不难,就算没接触过想想也是可以想到的 这个满二叉树的深度很浅啊,每个点只会和它的\(n-1\)个祖先匹配啊 于是可以暴力枚举祖先链 ...
- 【LOJ】#2107. 「JLOI2015」城池攻占
题解 用一个平衡树维护能攻占到u点的骑士,合并到父亲的时候去掉攻击力小于父亲生命值的那部分,只要把那棵树拆掉并且将树中的所有骑士更新一下答案,用无旋式treap很好写 合并的时候只要启发式合并就可以了 ...
- 「JLOI2015」城池攻占 可并堆
传送门 分析 如果直接暴力枚举的话肯定会超时 我们可以从下往上遍历,维护一个小根堆 每次到达一个节点把战败的骑士扔出去 剩下的再继续向上合并,注意要维护一下其实的战斗力 可以像线段树那样用一个lazy ...
- 「FJOI2016」神秘数 解题报告
「FJOI2016」神秘数 这题不sb,我挺sb的... 我连不带区间的都不会哇 考虑给你一个整数集,如何求这个神秘数 这有点像一个01背包,复杂度和值域有关.但是你发现01背包可以求出更多的东西,就 ...
- 「ZJOI2016」大森林 解题报告
「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...
- 「SCOI2016」背单词 解题报告
「SCOI2016」背单词 出题人sb 题意有毒 大概是告诉你,你给一堆n个单词安排顺序 如果当前位置为x 当前单词的后缀没在这堆单词出现过,代价x 这里的后缀是原意,但不算自己,举个例子比如abc的 ...
- 「NOI2015」寿司晚宴 解题报告
「NOI2015」寿司晚宴 这个题思路其实挺自然的,但是我太傻了...最开始想着钦定一些,结果发现假了.. 首先一个比较套路的事情是状压前8个质数,后面的只会在一个数出现一次的再想办法就好. 然后发现 ...
随机推荐
- 将iso镜像转换为docker镜像
为什么不用官方的镜像? 不是不想使用,而是官方镜像提供的功能实在是太少了,不信的话,你pull一个ubuntu:latest的进行,你看有没有wget.curl.ssh这些功能,就连最简单的ifcon ...
- 【kindle笔记】之 《鬼吹灯》-9-20
[kindle笔记]读书记录-总 9-20 日常吐槽 连着几天,基本是一口气读完了鬼吹灯. 想来,也算是阴差阳错了.本来是想看盗墓的,读了几页开头,心想坏了,拷贝错了,这是鬼吹灯-- 讲真的,每每读小 ...
- 墨者学院——密码学加解密实训(Base64转义)
地址:https://www.mozhe.cn/bug/detail/SW5ObnVFa05vSHlmTi9pcWhRSjRqZz09bW96aGUmozhe 在靶场中找到内容 解密 访问直接得key
- Python3练习题 001:4个数字求不重复的3位数
#Python练习题 001:4个数字求不重复的3位数#方法一import itertoolsres = [][res.append(i[0]*100 + i[1]*10 + i[2]) for i ...
- css3新属性box-orient
前言 box-orient属性经常与display:box属性结合使用 div { width:350px; height:100px; border:1px solid black; /* Fire ...
- 【git】如何去解决fatal: refusing to merge unrelated histories
我在Github新建一个仓库,写了License,然后把本地一个写了很久仓库上传. 先pull,因为两个仓库不同,发现refusing to merge unrelated histories,无法p ...
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
今天服务器遇到了一个很熟悉的问题, 输入 #mysql -u root -p ERROR 2002 (HY000):Can't connect to local MySQL server ...
- dashboard使用与访问
#dashboard的github地址 https://github.com/kubernetes/dashboard #下载 wget https://raw.githubusercontent.c ...
- mysql 常用字段类型
tinyint[(m)] [unsigned] [zerofill] 1字节 极小整数,数据类型用于保存一些范围的整数数值范围: 有符号: -128 - 127. 无符号: - 255 特别的: My ...
- Python 版百度站长平台链接主动推送脚本
如果自己的网站需要被百度收录,可以在搜索结果中找到,就需要将网站的链接提交给百度.依靠百度的爬虫可能无法检索到网站所有的内容,因此可以主动将链接提交给百度. 在百度的站长平台上介绍了链接提交方法,目前 ...