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 ...
随机推荐
- loadrunner 利用JDBC操作mysql数据库
import lrapi.lr;import java.util.ArrayList;import java.util.List; import java.sql.Connection; import ...
- Springboot+Dubbo使用Zipkin进行接口调用链路追踪
Zipkin介绍: Zipkin是一个分布式链路跟踪系统,可以采集时序数据来协助定位延迟等相关问题.数据可以存储在cassandra,MySQL,ES,mem中.分布式链路跟踪是个老话题,国内也有类似 ...
- Android ELF文件解析
0X01 ELF初认识 elf文件是linux下的二进制文件,相当于windows下的PE文件,Android系统里的dll. 解析elf文件两个用处:1.so加固:2.frida(xposed)检 ...
- 阿里饿死了么Android面试凉经,两轮面完被虐哭了,怒清购物车。。。卸载饿死了么
大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助. 最近跟一个朋友聊天,他漫不经心地复习了几个月,就去参加了饿了么面试,第二面结束后,嗯,挂了 ...
- 5.1 剑指 Offer 03. 数组中重复的数字
类型题:剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, ...
- MySQL学习05(MySQL函数)
MySQL函数 常用函数 官方文档 : https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html 数据函数 SELECT ABS ...
- Python语言系列-08-面向对象3
反射 #!/usr/bin/env python3 # author: Alnk(李成果) # 反射 # hasattr getattr setattr delattr class Animal(ob ...
- SpringBoot开发二十-私信列表
私信列表功能开发. 发送私信功能开发 首先创建一个实体类:Message package com.nowcoder.community.entity; import java.util.Date; p ...
- STM32—驱动RFID-RC522模块
文章目录 一.S50(M1)卡介绍 1.S50(M1)卡基础知识 2.内部信息 3.存取控制 4.数据块的存取控制 5.控制块的存取控 6.工作原理 7.M1与读卡器的通信 二.RC522工程代码详解 ...
- Avro使用手册
1. Overview Data serialization is a technique of converting data into binary or text format. There a ...