2021秋 noip 模拟赛
9.9 T3 第负二题
\(f_i\) 的数学意义:中心在第 \(i\) 行的全 \(1\) 组成的最大正方形(对角线水平/竖直),对角线长 \(2f_i-1\)。
显然 \(f_i\) 具有单调性(存在较大的正方形则一定存在更小的)。由此得到一个朴素做法:
对于每行二分答案 \(k\),判断是否合法即判断是否存在合法的中心:
\]
\]
发现两个 \(\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 模拟赛的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
随机推荐
- 单片机学习(一)项目的建立和vscode代码编辑环境的设置
目录 Keil项目的建立 使用vscode进行开发 工欲善其事必先利其器,因此我们先搭建一个比较舒服的开发环境. Keil项目的建立 打开Keil软件点击Project/New uVision Pro ...
- TextLineCodecFactory笔记
Mina的TextLineCodecFactory将字符串编码为字节流,将字节流解码为字符串,下面是使用中遇到的两个问题. TextLineCodecFactory改变了message的类型 acce ...
- SortCompare.time的反射版本
"Algorithms" by Robert Sedgewick, p256, SortCompare.time(): public static double time(Stri ...
- Swagger在线文档使用教程
springboot整合Swagger2 1.首先创建一个springboot工程,在pom文件内导入依赖 <!--swagger依赖--> <!--Swagger2- ...
- http扩展小插件
支持.net framework4.5.1,.net core2.0及以上 应用层需要引用包Kogel.Net,Nuget上可以下载安装. 或者使用Nuget命令添加包 Install-Package ...
- Android系统编程入门系列之广播接收者BroadcastReceiver实现进程间通信
在前边几篇关于Android系统两个重要组件的介绍中,界面Activity负责应用程序与用户的交互,服务Service负责应用程序内部线程间的交互或两个应用程序进程之间的数据交互.看上去这两大组件就能 ...
- vue项目打包 部署nginx服务器 访问远程接口 本地json 跨域问题
本文建立在你已经在windows7上已经配好了nginx的前提下进行!!! 如果没有请移步至:https://www.cnblogs.com/jack1208-rose0203/p/5739765.h ...
- 解析和遍历一个HTML文档
如何解析一个HTML文档: String html = "<html><head><title>First parse</title>< ...
- etcd raft 处理流程图系列3-wal的存储和运行
存储和节点的创建 raftexample中的存储其实有两种,一个是通过raft.NewMemoryStorage()进行创建的raft.raftStorage,关联到单个raft节点,另一个是通过ne ...
- MediaWiki 语法简介
本文尚在完善中... 图片 图片官方教程 图文并茂的内容读起来总是更加舒服,让我们在wiki里引入图片. 内部图片 上传图片 点击右侧上传文件,上传文件后会获得文件名 编辑图片 文件上传后在编辑框,如 ...