9.9 T3 第负二题

\(f_i\) 的数学意义:中心在第 \(i\) 行的全 \(1\) 组成的最大正方形(对角线水平/竖直),对角线长 \(2f_i-1\)。

显然 \(f_i\) 具有单调性(存在较大的正方形则一定存在更小的)。由此得到一个朴素做法:

对于每行二分答案 \(k\),判断是否合法即判断是否存在合法的中心:

\[\max\{l_j+k-1+(i-j)\}\le\min\{r_j-k+1-(i-j)\},j\le i
\]
\[\max\{l_j+k-1+(j-i)\}\le\min\{r_j-k+1-(j-i)\},j\ge i
\]

发现两个 \(\max,\min\) 中与 \(j\) 相关的分别为 \(l_j-j,r_j+j,l_j+j,r_j-j\),RMQ 即可。

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

另一个结论是 \(f_{i-1}-1\le f_i\le f_{i-1}+1\)(第 \(i-1\) 行变为 \(0\) 的下一时刻第 \(i\) 行一定都是 \(0\))。因此 \(k\) 不用二分,从 \(f_{i-1}-1\) 开始枚举即可,如果当前 \(k\) 不合法,则 \(f_i=k-1\),否则 \(k\leftarrow k+1\)。

考虑单调队列做到 \(O(n)\) RMQ。

对于 \(j\ge i\) 的情况,第 \(i-1\) 行 \(j\) 的区间为 \([i-1,(i-1)+(k+1)-1]\),扩展到第 \(i\) 行时变为 \([i,i+k-1]\),\(i,k\) 变大时左右端点都单调,普通单调队列。

对于 \(j\le i\),区间为 \([(i-1)-(k+1)+1,i-1]\) 变到 \([i-k+1,i]\),左端点不具有单调性。发现 \(k\) 最多变大两次,因此强制令左端点单调,对于没有考虑到的点(最多两个)特判即可。

code
const int N = 5e6+5, mod = 998244353;
int L,X,Y;
ULL A,B; int n,m,l[N],r[N],f[N];
LL ans; struct Que {
int fro,rea,que[N];
Que() { fro = 1, rea = 0; }
int front() { return que[fro]; }
int back() { return que[rea]; }
void push_back(int x) { que[++rea] = x; }
void pop_back() { --rea; }
bool empty() { return fro>rea; }
void valid(int l) { while( fro<=rea && que[fro] < l ) ++fro; }
} ul,ur,dl,dr; namespace data {
typedef unsigned long long u64;
u64 xorshift128p(u64 &A, u64 &B) { u64 T = A, S = B; A = S; T ^= T << 23;
T ^= T >> 17; T ^= S ^ (S >> 26); B = T; return T + S; }
void gen(int n, int L, int X, int Y, u64 A, u64 B, int l[], int r[]) {
for (int i = 1; i <= n; i ++) { l[i] = xorshift128p(A, B) % L + X;
r[i] = xorshift128p(A, B) % L + Y; if (l[i] > r[i]) swap(l[i], r[i]); } }
} signed main() {
read(n,L,X,Y,A,B); data::gen(n,L,X,Y,A,B,l,r);
f[1] = 1;
For(i,2,n) For(k,max(f[i-1],2),f[i-1]+2) { int j = i+k-1;
ul.valid(i-k+1), ur.valid(i-k+1), dl.valid(i), dr.valid(i);
while( !ul.empty() && l[i]+i >= l[ul.back()]+ul.back() ) ul.pop_back();
while( !ur.empty() && r[i]-i <= r[ur.back()]-ur.back() ) ur.pop_back();
while( !dl.empty() && l[j]-j >= l[dl.back()]-dl.back() ) dl.pop_back();
while( !dr.empty() && r[j]+j <= r[dr.back()]+dr.back() ) dr.pop_back();
ul.push_back(i), ur.push_back(i), dl.push_back(j), dr.push_back(j);
int le = l[ul.front()]+ul.front()-i+k-1,
ri = r[ur.front()]-ur.front()+i-k+1;
ckmax(le,l[dl.front()]-dl.front()+i+k-1),
ckmin(ri,r[dr.front()]+dr.front()-i-k+1);
if( k > f[i-1] )
ckmax(le,l[i-k+1]+i-k+1-i+k-1), ckmin(ri,r[i-k+1]-(i-k+1)+i-k+1);
if( k > f[i-1]+1 )
ckmax(le,l[i-k+2]+i-k+2-i+k-1), ckmin(ri,r[i-k+2]-(i-k+2)+i-k+1);
if( le > ri ) { f[i] = k-1; break; }
}
for(LL i = 1, pw = 1; i <= n; ++i, pw = pw*3%mod) ans += pw * f[i] %mod;
write(ans%mod);
return iocl();
}

2021秋 noip 模拟赛的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  9. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

随机推荐

  1. 微软内推常见问题 Q&A

    很高兴,已经成功内推 59 人拿到了微软 offer! 两年前,我就已经写过一篇微软面经,帮助到了不少人: 微软面经分享:如何更好地做好面试准备 在这两年的内推过程中,往往会有不少候选人来问我有关微软 ...

  2. 论文笔记:(CVPR2019)PointWeb: Enhancing Local Neighborhood Features for Point Cloud Processing

    目录 摘要 一.引言 二.相关工作 3D数据表示 点云深度学习 三.我们的方法 3.1 自适应特征调整(AFA)模块 3.1.1 影响函数fimp 3.1.2 关系函数frel 3.1.3 逐元素影响 ...

  3. vue的项目初始化

    1.创建文件 blog 2.下载安装node mongoose 3.(1)vue创建后端项目文件 vue create admin (2)vue创建前端项目文件 vue create web (3)新 ...

  4. MapReduce框架-Join的使用

    引言 首先先明白在关系型数据库中Join的用法. Join在MapReduce中的用法也是用于两个文件之间的连接. 使用MR程序解决两张表的join问题,有两种解决方案 à MR程序的join应用 1 ...

  5. [SQL]修改和删除基本表

    修改基本表 SQL语言用alter table语句修改基本表,其一般格式如下: alter table <表名> add <列名> <数据类型> [<列级完整 ...

  6. Blazor 模板化组件开发指南

    翻译自 Waqas Anwar 2021年4月15日的文章 <A Developer's Guide To Blazor Templated Components> [1] 在我之前的一篇 ...

  7. git常用命令究极记忆大法

    第一点,我觉得也是最最重要的,就是明确git的三个区,工作区(working),暂存区(index),仓库(repository). 第二就是区与区之间的操作了. working与index之间: g ...

  8. 【vulhub】Weblogic CVE-2017-10271漏洞复现&&流量分析

    Weblogic CVE-2017-10271 漏洞复现&&流量分析 Weblogic CVE-2017-10271 XMLDecoder反序列化 1.Weblogic-XMLDeco ...

  9. AlexNet论文总结

    论文链接:https://papers.nips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf Q1:解决了什么? 目前主 ...

  10. 🏆【JVM技术专区】「编译技术专题」带你彻底认识Java的编译技术

    前提概要 Java的class字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令.这个过程是Java虚拟机做的,这个过程也叫编译.是更深层次的编译. 在编译原理中,把源代码翻译成机 ...