[gym102769L]Lost Temple
考虑第$i$列的答案,即找到一个区间$[l,r]$,使得:
1.$l$和$r$要同奇偶,令$ans=\frac{r-l}{2}$,要求尽量大($ans+1$即为该列答案)
2.$\forall 0\le j\le ans$,$[l+j,r-j]\subseteq [l_{i-j},r_{i-j}],[l_{i+j},r_{i+j}]$(两个都包含)
两个都包含可以看成求交,那么即$l\ge \max(l_{i-j},l_{i+j})-j$,类似的$r\le \min(r_{i-j},r_{i+j})+j$,很明显$l$和$r$都会取到端点,只需要保证长度足够,即$ans$合法当且仅当
$$
\min_{0\le j\le ans}(\min(r_{i-j},r_{i+j})+j)-\max_{0\le j\le ans}(\max(l_{i-j},l_{i+j})-j)\ge 2ans
$$
由于相邻两列答案至多相差1,记上一列的答案为$ans$,那么只需要判定$ans\pm 1$即可
注意到一次判定也就是求区间$l_{i}/r_{i}\pm i$最小和最大值,用树状数组维护复杂度过高,考虑用单调队列来维护,通过调整判定$ans\pm 1$的顺序每一次询问的右端点单调不下降,左端点至多减小1,复杂度为$o(n)$
时间复杂度为$o(n)$,且常数略大

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 5000005
4 #define mod 998244353
5 #define ull unsigned long long
6 int t,n,ans,sum,mi[N],l[N],r[N];
7 struct pqueue{
8 int p,L,R,x,y,a[N],q[N];
9 void add(int k){
10 while ((x<y)&&(a[k]<=a[q[y-1]]))y--;
11 q[y++]=k;
12 }
13 int query(int l,int r){
14 int ans=0x3f3f3f3f;
15 //q头尾为[x,y],是[L,R]的单调队列,询问[l,r]
16 for(int i=l;i<L;i++)ans=min(ans,a[i]);
17 assert(R<=r);
18 while (R<r)add(++R);
19 if (L<l){
20 L=l;
21 while ((x<y)&&(q[x]<L))x++;
22 }
23 ans=min(ans,a[q[x]]);
24 return p*ans;
25 }
26 }Q[4];
27 ull calc(ull &A,ull &B){
28 ull T=A,S=B;
29 A=S;
30 T^=(T<<23);
31 T^=(T>>17);
32 T^=(S^(S>>26));
33 B=T;
34 return T+S;
35 }
36 void read(){
37 int L,X,Y;
38 ull A,B;
39 scanf("%d%d%d%llu%llu",&L,&X,&Y,&A,&B);
40 for(int i=1;i<=n;i++){
41 l[i]=calc(A,B)%L+X;
42 r[i]=calc(A,B)%L+Y;
43 if (l[i]>r[i])swap(l[i],r[i]);
44 }
45 }
46 void init(){
47 for(int i=0;i<4;i++)Q[i].L=Q[i].R=Q[i].x=Q[i].y=0;
48 for(int i=1;i<=n;i++)Q[0].a[i]=r[i]-i;
49 for(int i=1;i<=n;i++)Q[1].a[i]=r[i]+i;
50 for(int i=1;i<=n;i++)Q[2].a[i]=-(l[i]+i);
51 for(int i=1;i<=n;i++)Q[3].a[i]=-(l[i]-i);
52 }
53 bool check(int i,int ans){
54 if ((i+ans>n)||(i-ans<=0))return 0;
55 int r=min(Q[0].query(i-ans,i)+i,Q[1].query(i,i+ans)-i);
56 int l=max(Q[2].query(i-ans,i)-i,Q[3].query(i,i+ans)+i);
57 return r-l>=2*ans;
58 }
59 int main(){
60 mi[0]=1;
61 for(int i=1;i<N-4;i++)mi[i]=3LL*mi[i-1]%mod;
62 Q[0].p=Q[1].p=1;
63 Q[2].p=Q[3].p=-1;
64 scanf("%d",&t);
65 for(int ii=1;ii<=t;ii++){
66 scanf("%d",&n);
67 read();
68 init();
69 ans=0;
70 sum=1;
71 for(int i=2;i<=n;i++){
72 if (!check(i,ans))ans--;
73 else{
74 if (check(i,ans+1))ans++;
75 }
76 sum=(sum+1LL*mi[i-1]*(ans+1))%mod;
77 }
78 printf("Case #%d: %d\n",ii,sum);
79 }
80 }
[gym102769L]Lost Temple的更多相关文章
- Temple Build~dp(01背包的变形)
The Dwarves of Middle Earth are renowned for their delving and smithy ability, but they are also mas ...
- AngularJS.js: temple
ylbtech-AngularJS.js: temple 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 ...
- Vue.js: temple
ylbtech-Vue.js: temple 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 9.返 ...
- Memcached: temple
ylbtech-Memcached: temple 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 ...
- ionic:temple
ylbtech-ionic:temple 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:http://ylb ...
- SPOJ TEMPLEQ - Temple Queues(二分查找+树状数组)
题意: 有N个队伍(1 <= N <= 100,000),每个队伍开始有ai个人[0 <= ai<= 100,000,000],有Q个操作[0<=Q<= 500,0 ...
- Redis: temple
ylbtech-Redis: 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 9.返回顶部 1 ...
- DCloud:temple
ylbtech-DCloud: 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 9.返回顶部 1 ...
- golang iris html/temple
在使用golang的模板语法的过程中遇见自动转义问题(或者以我的理解下发的富文本html代码不是template.html类型,而是string类型),需要强制转型 func unescaped(x ...
随机推荐
- 跟着老猫一起来学GO,环境搭建
老猫的GO学习系列博客已经正式发车了,相信大家以前学习一门编程语言的时候也有经验,咱们一般都是从环境开始,在此呢,大家也跟着老猫从最开始的搭建环境开始. GO语言的安装 首先呢,我们开始需要下载GO语 ...
- 计算机网络:HTTP
计算机网络基础:HTTP 先验知识 HTTP和其他协议的关系 通过下图,了解IP协议,TCP协议,DNS服务在使用HTTP协议通信过程中各自发挥的作用: 服务器处理流程 接受客户端连接 ------& ...
- UltraSoft - Alpha - Scrum Meeting 5
Date: Apr q9th, 2020. Scrum 情况汇报 进度情况 组员 负责 昨日进度 后两日任务 CookieLau PM 统筹个人进度,协助推进进度 辅助前后端连接工作 刘zh 前端 完 ...
- [对对子队]会议记录5.15(Scrum Meeting2)
今天已完成的工作 吴昭邦 工作内容:衔接循环指令系统,搭建第4关 相关issue:实现循环组件 相关签入:feat: 将模型加入第四关 第四关可以顺利通过 何瑞 工作内容:衔接循环指令 ...
- 《HelloGitHub》第 67 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweihan/HelloGitHu ...
- 一文带你掌握【TCP拥塞窗口】原理
❝ 关注公众号:高性能架构探索.后台回复[资料],可以免费领取 ❞ 学过网络相关课程的,都知道TCP中,有两个窗口: 滑动窗口(在我们的上一篇文章中有讲),接收方通过通告发送方自己的可以接受缓冲区大小 ...
- 15个问题自查你真的了解java编译优化吗?
摘要:为什么C++的编译速度会比java慢很多?二者运行程序的速度差异在哪? 了解了java的早期和晚期过程,就能理解这个问题了. 本文分享自华为云社区<你真的了解java编译优化吗?15个问题 ...
- 深入了解Mybatis架构设计
架构设计 我们可以把Mybatis的功能架构分为三层: API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库.接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理. ...
- 如何反编译微信小程序👻
如何反编译微信小程序 准备工具: 夜神模拟器(或者你可以自己准备一个安卓模拟器,有root权限.) RE文件管理器(下载地址:https://soft.ucbug.com/uploads/shouji ...
- 面试官:熟悉JS中的new吗?能手写实现吗?
目录 1 new 运算符简介 2 new 究竟干了什么事 3 模拟实现 new 运算符 4 补充 预备知识: 了解原型和原型链 了解this绑定 1 new 运算符简介 MDN文档:new 运算符创建 ...