题目描述

相信大家都在长训班学过树塔问题,题目很简单求最大化一个三角形数塔从上往下走的路径和。走的规则是:(i,j)号点只能走向(i+1,j)或者(i+1,j+1)。如下图是一个数塔,映射到该数塔上行走的规则为:从左上角的点开始,向下走或向右下走直到最底层结束。

1

3 8

2 5 0

1 4 3 8

1 4 2 5 0

路径最大和是1+8+5+4+4 = 22,1+8+5+3+5 = 22或者1+8+0+8+5 = 22。

小S觉得这个问题so easy。于是他提高了点难度,他每次ban掉一个点(即规定哪个点不能经过),然后询问你不走该点的最大路径和。

当然他上一个询问被ban掉的点过一个询问会恢复(即每次他在原图的基础上ban掉一个点,而不是永久化的修改)。

输入

第一行包括两个正整数,N,M,分别表示数塔的高和询问次数。

以下N行,第i行包括用空格隔开的i - 1个数,描述一个高为N的数塔。

而后M行,每行包括两个数X,Y,表示第X行第Y列的数塔上的点被小S ban掉,无法通行。

(由于读入数据较大,c或c++请使用较为快速的读入方式)

输出

M行每行包括一个非负整数,表示在原图的基础上ban掉一个点后的最大路径和,如果被ban掉后不存在任意一条路径,则输出-1。

样例输入

5 3

1

3 8

2 5 0

1 4 3 8

1 4 2 5 0

2 2

5 4

1 1

样例输出

17

22

-1

数据范围

样例解释

第一次是

1

3 X

2 5 0

1 4 3 8

1 4 2 5 0

1+3+5+4+4 = 17 或者 1+3+5+3+5=17

第二次:

1

3 8

2 5 0

1 4 3 8

1 4 2 X 0

1+8+5+4+4 = 22

第三次:你们都懂的!无法通行,-1!

解法

预处理出每个点向上走和向下走的最优值。

那么对于ban掉(i,j),答案即为(i,k)的点的最优值(k!=j),考虑用数据结构来维护。

代码

const
maxn=1007;
type
longint=int64;
var
n,m:longint;
i,j,k:cardinal;
a,f,g:array[0..maxn,0..maxn] of longint;
ans:array[0..maxn,0..maxn] of longint;
c,d:array[1..maxn] of longint;
function max(a,b:longint):longint;
begin
if (a>b) then exit(a);
exit(b);
end;
function lowbit(x:longint):longint;
begin
exit(x and (-x));
end;
function getmax(l,r:longint):longint;
begin
getmax:=0;
while (l<=r) do
begin
if (r-lowbit(r)>=l) then
begin
getmax:=max(getmax,c[r]);
r:=r-lowbit(r);
end
else
begin
getmax:=max(getmax,d[r]);
dec(r);
end;
end;
end;
procedure change(v,v1:longint);
begin
d[v]:=v1;
while (v<=n) do
begin
c[v]:=max(c[v],v1);
v:=v+lowbit(v);
end;
end;
begin
readlN(n,m);
for i:=1 to n do
for j:=1 to i do read(a[i][j]);
for i:=1 to n do
for j:=1 to i do
g[i][j]:=max(g[i-1][j]+a[i-1][j],g[i-1][j-1]+a[i-1][j-1]);
for i:=n downto 1 do
for j:=1 to i do
f[i][j]:=max(f[i+1][j]+a[i+1][j],f[i+1][j+1]+a[i+1][j+1]);
for i:=1 to n do
begin
fillchar(c,sizeof(c),0);
for j:=1 to i do
begin
change(j,f[i][j]+g[i][j]+a[i][j]);
end;
for j:=1 to i do
begin
ans[i][j]:=max(getmax(1,j-1),getmax(j+1,i));
end;
end;
ans[1][1]:=-1;
for i:=1 to m do
begin
readlN(j,k);
writeln(ans[j][k]);
end;
end.

启发

打树状数组时不要偷懒,该fillchar就要fillchar。

【JZOJ4746】【NOIP2016提高A组模拟9.3】树塔狂想曲的更多相关文章

  1. JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数

    4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms  Memory Limits: 262144 KB  Detailed ...

  2. 【NOIP2016提高A组模拟9.14】数列编辑器

    题目 分析 比赛上,没有注意到询问只询问光标前面,于是只打了个暴力. 因为询问只询问光标前面,首先,当光标向后每移动到一个位置,顺便将这个位置的前缀和,和最大前缀和求出来. 总之,模拟 #includ ...

  3. 【NOIP2016提高A组模拟9.24】总结

    第一题纯模拟,结果那个出题人脑子似乎进水了,空间限制开了1G!!! 导致我捉摸了半天为什么空间要开那么大,最后只能得出上面的结论. 第二题是个矩阵快速幂,比赛上我没把递推式求出来,但是根据各种乱搞,得 ...

  4. 【JZOJ4745】【NOIP2016提高A组模拟9.3】看电影

    题目描述 听说NOIP2016大家都考得不错,于是CCF奖励省常中了 K 张变形金刚5的电影票奖励OI队的同学去看电影.可是省常中OI队的同学们共有 N(N >= K)人.于是机智的你想到了一个 ...

  5. 【JZOJ4803】【NOIP2016提高A组模拟9.28】求导

    题目描述 输入 输出 样例输入 2x^2+3x+1 样例输出 4x+3 数据范围 样例解释 求导的意思: 多项式是由若干个单项式构成的 单项式的一般形式是ax^b,其中ab都是常数,x是自变量 对于单 ...

  6. 【JZOJ4787】【NOIP2016提高A组模拟9.17】数格子

    题目描述 输入 输出 样例输入 1 10000 3 10000 5 10000 0 0 样例输出 1 11 95 数据范围 每个测试点数据组数不超过10组 解法 状态压缩动态规划. 设f[i][j]表 ...

  7. [jzoj 4668] [NOIP2016提高A组模拟7.19] 腐败 解题报告(质数分类+慢速乘)

    题目链接: http://172.16.0.132/senior/#main/show/4668 题目: 题解: 考虑把A数组里的每个元素分解质因数,对于每个质因数开一个vector存一下包含这个质因 ...

  8. [jzoj 4722] [NOIP2016提高A组模拟8.21] 跳楼机 解题报告 (spfa+同余)

    题目链接: http://172.16.0.132/senior/#main/show/4722 题目: DJL为了避免成为一只咸鱼,来找srwudi学习压代码的技巧.Srwudi的家是一幢h层的摩天 ...

  9. [JZOJ4737] 【NOIP2016提高A组模拟8.25】金色丝线将瞬间一分为二

    Description Input Output Sample Input 5 101 12 23 34 45 5 Sample Output 4 Data Constraint Hint 开long ...

随机推荐

  1. LUOGU P2675 《瞿葩的数字游戏》T3-三角圣地

    题面 解题思路 手推可以得出,最后每个数字的贡献其实就是第n行杨辉三角数,然后直接卢卡斯直接算(今天才找到lucas定理时间复杂度是log n,log以模数为底).代码略麻烦,不想改了. 代码 #in ...

  2. 微信小程序--导航跟随

    最近开发小程序的时候遇到这样一个需求:如图1 页面向下滚动到白色导航的位置时,白色导航固定到页面最上方:当页面向上滚动到白色导航时,白色导航恢复到原始位置:点击各个导航,平滑的跳到相应位置. 思路1: ...

  3. android 开发环境问题

    一.console出现The connection to adb is down, and a severe error has occured. .先把eclipse关闭. .在管理器转到你的and ...

  4. Spring注解驱动开发(六)-----spring容器创建【源码】

    Spring容器的refresh()[创建刷新] 1.prepareRefresh()刷新前的预处理 1).initPropertySources()初始化一些属性设置;子类自定义个性化的属性设置方法 ...

  5. Python爬虫笔记【一】模拟用户访问之webdriver用户登入——第三次(8)

    经过post方法之后,因为有动态的value值所以再此回到用webdriver的解决上,但是在下载图片上会打开新打开一个链接,导致与网页图片不同即验证码同步问题,没办法只能想了一个笨法子,网页截图,唉 ...

  6. GC Roots的几种对象

    在java语言里,可作为GC Roots的对象包括下面几种: >虚拟机栈(栈帧中的本地变量表)中的引用的对象: >方法区中类静态属性引用的对象: >方法区中常量引用的对象: > ...

  7. localStorage对象简单应用 - - 访问次数

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. SpringBoot集成lombook让代码更简洁

    1)添加lombok依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>l ...

  9. JSP内置对象解析

    out对象:(PrintWriter类的实例) 用来向客户端输出信息,除了输出各种信息外还负责对缓冲区进行管理: 主要方法: print / println void 输出数据 newLine() v ...

  10. webpack4进阶配置

    移动端CSS px自动转换成rem 需要两步来实现: px2rem-loader 在构建阶段将px转换成rem lib-flexible 页面渲染时动态计算根元素的font-size值(手机淘宝开源库 ...