题目描述

相信大家都在长训班学过树塔问题,题目很简单求最大化一个三角形数塔从上往下走的路径和。走的规则是:(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. 【bzoj2120】数颜色 带修莫队

    数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画 ...

  2. css3的3D变形

    一.坐标系 1.是我们熟悉的右手坐标系:伸出右手,让拇指和食指成L形,大拇指向为右,食指向上,中指指向前方,这样,拇指.食指.中指的指向分别是X.Y.Z轴的正方向. 2.是我们CSS3中的3D坐标:伸 ...

  3. js的相关距离

    js的相关距离 一.dom对象的距离 ---dom.style.width : 对象本身的内容宽度(这里必须是内联样式中的width,带px)(content) ---dom.style.height ...

  4. ionic Hide tabs 实现

    1.指令代码 directiveMod.directive('hideTabs',function($rootScope){ return { restrict:'AE', link:function ...

  5. jsx简介

    react文档笔记 jsx简介 jsx是一种javascript的语法扩展,jsx用来声明React当中的元素. 在jsx中使用表达式 jsx当中的表达式要包含在大括号里.例如2+2,user.fir ...

  6. nodejs + mySQL实践

    1.建立数据库连接:createConnection(Object)方法      该方法接受一个对象作为参数,该对象有四个常用的属性host,user,password,database.与php中 ...

  7. sqlserver 下三种批量插入数据的方法

    本文将介绍三种批量插入数据的方法,需要的朋友可以参考下 本文将介绍三种批量插入数据的方法.第一种方法是使用循环语句逐个将数据项插入到数据库中:第二种方法使用的是SqlBulkCopy,使您可以用其他源 ...

  8. 同名的cookie会不会存在多个

    cookie new了多个.同一个名字.会不会存在多个呢. //若果不设置Cookie的path,则名字相同的Cookie视为相同的Cookie,后面的覆盖前面的,注意:大小写敏感 Cookie c1 ...

  9. Activiti实战03_Hello World

    Hello World如此经典,以至于几乎学习没一门新的技术都是从Hello World开始,可能意味着开启了新世界的大门吧,接下来就让我们一起步入到Activiti的世界中吧! 本文所使用开发环境 ...

  10. IO流15 --- 数据流操作Java语言的基本数据类型 --- 技术搬运工(尚硅谷)

    写入数据 @Test public void test10() throws IOException { DataOutputStream dos = new DataOutputStream(new ...