考虑第$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的更多相关文章

  1. Temple Build~dp(01背包的变形)

    The Dwarves of Middle Earth are renowned for their delving and smithy ability, but they are also mas ...

  2. AngularJS.js: temple

    ylbtech-AngularJS.js: temple 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返回顶部   8.返回顶部 ...

  3. Vue.js: temple

    ylbtech-Vue.js: temple 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返回顶部   8.返回顶部   9.返 ...

  4. Memcached: temple

    ylbtech-Memcached: temple 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返回顶部   8.返回顶部   ...

  5. ionic:temple

    ylbtech-ionic:temple 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylb ...

  6. SPOJ TEMPLEQ - Temple Queues(二分查找+树状数组)

    题意: 有N个队伍(1 <= N <= 100,000),每个队伍开始有ai个人[0 <= ai<= 100,000,000],有Q个操作[0<=Q<= 500,0 ...

  7. Redis: temple

    ylbtech-Redis:  1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返回顶部   8.返回顶部   9.返回顶部   1 ...

  8. DCloud:temple

    ylbtech-DCloud: 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返回顶部   8.返回顶部   9.返回顶部   1 ...

  9. golang iris html/temple

    在使用golang的模板语法的过程中遇见自动转义问题(或者以我的理解下发的富文本html代码不是template.html类型,而是string类型),需要强制转型 func unescaped(x ...

随机推荐

  1. Java8新特性——Lambda 表达式

    Lambda 表达式 ​ ​ ​ ​ ​ ​ ​ ​ Lambda 表达式的实质属于函数式编程. ​ ​ ​ ​ ​ ​ ​ ​ 语法格式为:(parameters) -> expression ...

  2. Python | 一键生成九宫格图片

    一键生成九宫格图片 首先我们准备几张图片: 将代码文件放在放置图片的地方,用软件打开: 点击运行,在当前目录下会生成一个文件夹: 打开新生成的文件夹: 打开对应图片的名称文件夹: 如果不想图片被分成9 ...

  3. Java基础之(四):使用IDEA实现HelloWorld

    使用IDEA实现HelloWorld 在使用IDEA这个集成开发环境写Java程序之前,我们要先对IDEA进行一些基本的配置,以便我们能够更好地使用它. 新建一个空项目,用来学习基础语法 设置项目名称 ...

  4. 高级爬虫面试题测试题 v1.3

    Python Web高级爬虫工程师测试题 (请本文件发送到: SpiderTestQuestion@163.com 并附带简历) 1. 用yield写一个斐波那契数列的生成器函数. 2. 放一段scr ...

  5. NOI2016区间bzoj4653(线段树,尺取法,区间离散化)

    题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间,使得这 \(M\) 个区间共同包含至少一个 ...

  6. 初探webpack之从零搭建Vue开发环境

    初探webpack之搭建Vue开发环境 平时我们可以用vue-cli很方便地搭建Vue的开发环境,vue-cli确实是个好东西,让我们不需要关心webpack等一些繁杂的配置,然后直接开始写业务代码, ...

  7. Dapr-服务调用

    前言 上一篇对Dapr进行了了解,并搭建了Dapr环境.接下来就对Dapr的各个构建块类型的了解.应用实际案例. 一.服务调用: 在许多具有多个需要相互通信的服务的环境中,都会面临着很多问题. 如: ...

  8. Coursera Deep Learning笔记 改善深层神经网络:超参数调试 Batch归一化 Softmax

    摘抄:https://xienaoban.github.io/posts/2106.html 1. 调试(Tuning) 超参数 取值 #学习速率:\(\alpha\) Momentum:\(\bet ...

  9. canvas中的优先级,.after最前,before最底,canvas中间,部件在布局下面

    <RelativeWidget>: # 画布之后 canvas.before: Color: # 白色 rgba:[1,1,1,1] Rectangle: pos:self.pos # 最 ...

  10. 技术博客--微信小程序canvas实现图片编辑

    技术博客--微信小程序canvas实现图片编辑 我们的这个小程序不仅仅是想给用户提供一个保存和查找的平台,还希望能给用户一个展示自己创意的舞台,因此我们实现了图片的编辑部分.我们对对图片的编辑集成了很 ...