考虑从$0$到$n$枚举$A$的通关楼层。

设$f[i]$表示$B$通关$i$层时$C$最多能得到多少金币,因为金币数非负,所以也可以看作最多通关多少层。

当$A$的通关楼层往上多$1$的时候,这把钥匙必须给$A$。

如果这把钥匙还剩$0$把,那么说明:

$1.B$某些楼层$j$以上都不能到达,对应$f[\geq j]$变为$-inf$。

$2.C$某些楼层$j$以上都不能到达,对应$f$的某个后缀与$sumc[j-1]$取$min$。

如果这把钥匙还剩$1$把,那么说明:

当$B$的楼层在$j$以上时,$C$不能到达$k$以上的楼层,对应$f$的某个$\geq j$的后缀中与$sumc[k-1]$取$min$。

任意时刻,随着$i$的增加,$f[i]$不会增加,所以用线段树维护即可。

线段树上每个节点维护区间内最左边、最右边的$f$以及区间内某个$f$加上$sumb$的最大值。

当修改时,可以通过上下界判断是否可以打标记,否则暴力递归左右儿子。

时间复杂度$O(n\log n)$。

#include<cstdio>
const int N=100010,M=262150,inf=~0U>>1;
int T,n,i,w[N],a[N],b[N],c[N],pb[N],pc[N],sa[N],sb[N],sc[N],f[N],vl[M],vr[M],v[M],tag[M],ans;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void umin(int&a,int b){if(a>b)a=b;}
inline void umax(int&a,int b){if(a<b)a=b;}
inline void up(int x){
vl[x]=vl[x<<1],vr[x]=vr[x<<1|1];
v[x]=v[x<<1]>v[x<<1|1]?v[x<<1]:v[x<<1|1];
}
void build(int x,int a,int b){
tag[x]=-1;
if(a==b){
vl[x]=vr[x]=f[a];
v[x]=f[a]+sb[a];
return;
}
int mid=(a+b)>>1;
build(x<<1,a,mid),build(x<<1|1,mid+1,b);
up(x);
}
inline void tag1(int x,int r,int p){tag[x]=vl[x]=vr[x]=p,v[x]=sb[r]+p;}
void change(int x,int a,int b,int c,int p){
if(c<=a){
if(p>=vl[x])return;
if(p<vr[x]){tag1(x,b,p);return;}
}
int mid=(a+b)>>1;
if(tag[x]!=-1)tag1(x<<1,mid,tag[x]),tag1(x<<1|1,b,tag[x]),tag[x]=-1;
if(c<=mid)change(x<<1,a,mid,c,p);
change(x<<1|1,mid+1,b,c,p);
up(x);
}
int solve(){
read(n);
for(i=1;i<=n;i++)read(w[i]);
for(i=1;i<=n;i++)read(a[i]);
for(i=1;i<=n;i++)read(b[i]),pb[b[i]]=i;
for(i=1;i<=n;i++)read(c[i]),pc[c[i]]=i;
for(i=1;i<=n;i++)read(sa[i]),sa[i]+=sa[i-1];
for(i=1;i<=n;i++)read(sb[i]),sb[i]+=sb[i-1];
for(i=1;i<=n;i++)read(sc[i]),sc[i]+=sc[i-1];
for(f[0]=sc[n],i=1;i<=n;i++){
f[i]=f[i-1];
if(w[b[i]]==1)umin(f[i],sc[pc[b[i]]-1]);
}
build(1,0,n);
for(ans=v[i=1];i<=n;i++){
if(w[a[i]]==1)change(1,0,n,pb[a[i]],-inf),change(1,0,n,0,sc[pc[a[i]]-1]);
else change(1,0,n,pb[a[i]],sc[pc[a[i]]-1]);
umax(ans,sa[i]+v[1]);
}
return ans;
}
int main(){
char _[9];
scanf("%s",_);
for(read(T);T--;printf("%d\n",solve()));
return 0;
}

  

BZOJ2130 : 魔塔的更多相关文章

  1. tyvj1614 魔塔魔塔!

    描述 百度noip贴吧管理组开发了一个小游戏,叫魔塔魔塔.虽然把魔塔重复了两次,但其实还只是个魔塔而已,还是简化版的.游戏在一个N*M大小的地图中进行,每一格都是正方形.对于某一格,有若干种可能的状态 ...

  2. cocos2dx 魔塔项目总结(一)

    <魔塔天城>发布已经有半年的时间了,一直想找时间来总结一下这个项目,但总是一拖再拖.如果再这么拖下去,就永远都不会有时间来写这个总结了,时间总是挤出来的. 魔塔天城使用的cocos2dx ...

  3. 2018-2019学年第一学期Java课设--魔塔

    目录 Magic-Towers 一.团队名称.团队成员介绍.任务分配 团队名称:MoTa 团队成员介绍 任务分配 二.项目简介 三.项目采用技术 四.项目亮点 主界面显示主要信息功能 游戏动画 五.项 ...

  4. 自己做的roguelike+恶魔城游戏《魔塔猎人》已发布。

    游戏仍然是标准的roguelike,死亡后回到出生点重新开始,宏观架构上参考了<死亡细胞>,战斗设计上更加强调轻重攻击的组合,再配合236和28系列的搓招技.空中的突进飞腿.副武器等等. ...

  5. 魔兽争霸war3心得体会(四):不死族vs人族1本火魔塔

    QQ对战平台上玩随机的人特别多,为了应对对方的"出其不意",我最近一直用小狗去探路,小狗在家采集30个木头-摆放商店,就可以去探路了.主要有几个好处:知道对方的种族-出生点位-开局 ...

  6. P5168 xtq玩魔塔 [克鲁斯卡尔重构树+带修莫队]

    P5168 xtq玩魔塔 又是码农题- 利用克鲁斯卡尔重构树的性质 我们就可以得出 \(dep\) 值小的,肯定比 \(dep\) 大的值要优. 于是第二问就可以直接 LCA 求出来了- 至于第三问, ...

  7. 【Luogu P5168】xtq玩魔塔(Kruskal 重构树 & 树状数组 & set)

    Description 给定一个 \(n\) 个顶点,\(m\) 条边的无向联通图,点.边带权. 先有 \(q\) 次修改或询问,每个指令形如 \(\text{opt}\ x\ y\): \(\tex ...

  8. Luogu P5168 xtq玩魔塔

    这题不错啊,结合了一些不太传统的姿势. 首先看到题目有一问从一个点到另一个点边权最小值.想到了什么? 克鲁斯卡尔生成树+倍增?好吧其实有一个更常用NB的算法叫克鲁斯卡尔重构树 (不会的可以看dalao ...

  9. P5168 xtq玩魔塔

    传送门 其实就是板子--只要会克鲁斯卡尔重构树和带修莫队就可以了 这么想着的我就调了将近一个下午-- 思路其实比较清晰,然而码量很大,细节贼多-- 不难看出只在最小生成树上走最优,于是建出克鲁斯卡尔重 ...

随机推荐

  1. SQL Server Profiler的简单使用

    SQL Server Profiler可以检测在数据上执行的语句,特别是有的项目不直接使用sql语句,直接使用ORM框架的系统处理数据库的项目,在调试sql语句时,给了很大的帮助. 之前写了使用SQL ...

  2. zookeeper 学习 客户端Acl操作笔记

    Acl = Access control list create /node2 node2data [zk: localhost:2181(CONNECTED) 14] addauth digest ...

  3. Android Studio运行项目报错:Error:null value in entry: annotationProcessorOutputFolder=null的解决方案

    一般是在Android studio异常退出(比如强制关机)后,重新打开后运行项目出现该问题. 解决方案 删除项目根目录的.gradle文件夹,然后Clean  Project —— Rebulid ...

  4. python排序算法之冒泡,选择,插入

    1.参考 一本关于排序算法的 GitBook 在线书籍 <十大经典排序算法>,使用 JavaScript & Python & Go 实现 2.冒泡排序:两两比较,互换位置 ...

  5. 【译】写好JavaScript条件语句的5个技巧

    译文 当我们写JavaScript代码时,经常会用到到条件判断处理,这里有5个技巧能使你写出更好.更简洁的条件语句. 1.使用Array.includes处理多种条件 让我们来看一下的例子: // c ...

  6. 【Codeforces】Codeforces Round #551 (Div. 2)

    Codeforces Round #551 (Div. 2) 算是放弃颓废决定好好打比赛好好刷题的开始吧 A. Serval and Bus 处理每个巴士最早到站且大于t的时间 #include &l ...

  7. 【Android】android:windowSoftInputMode属性详解

    activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性. 这个属性能影响两件事情: [一]当有焦点产生时,软键盘是隐藏还是显示 [二]是否减少活动 ...

  8. django源码分析

    原文网址 https://www.jianshu.com/p/17d78b52c732?utm_campaign=maleskine&utm_content=note&utm_medi ...

  9. 51Nod1039 N^3 Mod P 数论 原根 BSGS

    原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1039.html 题目传送门 - 51Nod1039 题意 题解 这题我用求高次剩余的做法,要卡常数. ...

  10. 环形链表(给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null)

    思想: 思想:用快慢指针先判断是否有环,有环则 假设头结点到环入口距离为n,环入口到快慢指针相遇结点距离为m,则慢指针走的路程 为m+n,而快指针走的路程为m+n+k*l (k*l表示绕环走的路程), ...