分享

Noip 模拟 9 2018/10/26

 印度阿三17 2018-10-27

T1:新的世界(neworld)
在一个N NN 行M MM 列的网格中,第i ii 行j jj 列的格子有一个可变的 “亮度” Li,jLi,jLi,j(初始时都为 0)和一个固定的 “不透光度”AijAijAij。现在在c cc 列放入一个亮度为l ll 的光源,NEWorld 游戏引擎会根据以下逻辑,让光源逐步 “照亮” 附近的方格:先将光源所在方格的亮度Lrc LrcLrc 赋值为l ll。而对于i ii 行j jj 列一个不是光源的方格,它的亮度由Aij AijAij 和四周方格的亮度所确定
定义F(i,j)=max(Li1,j,Li 1,j,Li,j1,Li,j 1,Aij)Aij F(i,j)=\max(Li−1,j,Li 1,j,Li,j−1,Li,j 1,Aij)−AijF(i,j)=max(Li−1,j,Li 1,j,Li,j−1,Li,j 1,Aij)−Aij(此处当1iN 1≤i′≤N1≤i′≤N 不成立或1jM 1≤j′≤M1≤j′≤M 不成立时,LijLi′j′Li′j′被看作是 0),我们称方格(i,j) (i,j)(i,j) 的亮度Lij LijLij 是 “有效” 的,当且仅当Lij=F(i,j) Lij=F(i,j)Lij=F(i,j)。显然初始时所有亮度都是 “有效” 的,而放入光源后则可能存在亮度 “无效” 的方格
现在引擎会循环执行操作,每一步找出当前所有亮度 “无效”(不包括光源)的方格中,行数i ii 最小的那一个(如果有多个行数i ii 最小的,就选择其中列数j jj 最小的方格),然后计算F(i,j) F(i,j)F(i,j) 的值,将其赋值给Lij LijLij。操作会不停地执行,直到所有亮度都 “有效” 为止(请参考样例,循环一定会在有限步操作后结束)。请问最后q qq 列的方格亮度值Lpq LpqLpq 是多少?
注:max(a,b,c,d,e)\max(a,b,c,d,e)max(a,b,c,d,e) 表示取a,b,c,d,e a,b,c,d,ea,b,c,d,e 中最大的值。

f(i,j)f(i,j)f(i,j)的定义发现,(i,j)(i,j)(i,j)只会被它周围l(i,j)l(i,j)l(i,j)最大的更改,所以从(i,j)(i,j)(i,j)最小的更新简直就是废话
那么就只需要从l(r,c)l(r,c) l(r,c)跑最短路就可以了
网格图竟然没有卡 SPFA,看来出题人是没有去 NOI2018 啊(虽然我写的也是 SPFA)

T2:邻面合并(merging)
给定一个 N×MN×MN×M 的网格,每个格子上写有 0 或 1。现在用一些长方形覆盖其中写有 1 的格子,长方形的每条边都要与坐标轴平行。要求:每个写着 1 的格子都要被覆盖,长方形不可以重叠(重复绘制也多少会增加性能开销),也不能覆盖到任何一个写着 0 的格子(不然绘制结果就不正确了) 请问最少需要多少长方形?

考场没想到怎么表示状压的状态和转移,打了个贪心竟然有606060%
orzsz
因为m<=8m<=8m<=8,所以考虑状压
f[i][j]f[i][j]f[i][j]表示第iii行状态为jjj的最小长方形个数,jjj的第kkk位表示kkk这个位置和上一个位置是否在一个长方形里
显然f[i][j]=f[i1][k] jf[i][j]=f[i-1][k] jf[i][j]=f[i−1][k] j和kkk不同的划分的长方形个数,被动转移即可

T3:光线追踪(raytracing)
考虑一个二维平面,摄像机在 (0,0) 的位置,初始时平面上没有障碍物。现在执行 Q 次操作,操作有两种(假设这是第 i 次操作,1≤i≤Q):
1、给定 x0,y0,x1,y1(x0<x1,y0<y1),创建一个每条边与坐标轴平行的长方形障碍物,包含所有满足 x0≤x≤x1 且 y0≤y≤y1 的点 (x,y)(如果这个区域的某一部分已经存在障碍,则直接覆盖掉它,具体请看样例)。这个障碍物的编号为
2、给定向量 (x,y),会有一个动点从摄像机所在的 (0,0) 位置出发,以 (x,y) 所指的方向前进,直到碰到第一个障碍物为止
对于第 2 种操作,输出最先碰到的障碍物的编号。若不会碰到任何障碍物,输出 0。

观察可以发现,对答案有影响的只有四边形的两条边(x0,y0)(x0,y1)(x0,y0)(x0,y1)(x0,y0)(x0,y1)和(x0,y0)(x1,y0)(x0,y0)(x1,y0)(x0,y0)(x1,y0)那么就考虑分别维护这两条边
开两棵线段树,分别存储更新这两条边影响的斜率
发现斜率是double型,没办法作为下标(虽然map可以,但是没法存线段树,而且时间过不去),那么就只能离散了(STL有离散三件套,sort,lower_bound,unique超级好用,而且省代码)
查询是得出的两条线段比较一下先碰到谁就可以了
线段树的维护有一些骚操作,更新时只要修改[l,r][l,r] [l,r]这个区间的值并且不用向下传递,(听说传递会TLE),查询的时候需要查询到底并且带着查询经过的区间的最小值就可以了
算几的细节一如既往的多,调得心态爆炸

来源:http://www./content-4-72651.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多