[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 ...
随机推荐
- Electron+Vue+ElementUI开发环境搭建
Node环境搭建 本文假定你完成了nodejs的环境基础搭建: 镜像配置(暂时只配置node包镜像源,部分包的二进制镜像源后续讨论).全局以及缓存路径配置,全局路径加入到了环境变量 $ node -v ...
- 倒计时 | 7.24 阿里云 Serverless Developer Meetup 杭州站报名火热进行中!
本周六阿里云 Serverless Developer Meetup 即将亮相杭州 时间:7.24 本周六 13:30 - 17:30 地点:杭州市良睦路 999 号乐佳国际 1-3-7 特洛伊星 ...
- 市区择房分析(ArcPy实现)
1, 背景 如何找到环境好.购物方便.小孩上学方便的居住区地段是购房者最关心的问题.因此购房者就需要从总体上对商品房的信息进行研究分析,选择最适宜的购房地段. 2,目的 学会利用缓冲区分析和叠置分析解 ...
- 2020.10.30--vj个人赛补题
D - D CodeForces - 743A Vladik is a competitive programmer. This year he is going to win the Interna ...
- 远程设备管理opendx平台搭建-appium和adb的安装
多年不见了,说起来也有3年了我又开始写博客了,这几年我还是没啥长进,还是干测试,但是测试行业的话,我已经成了一个测开了,也在搭建自己的测试网站 本系列文章讲述的是一个系列的第一部分,最终可以搭建一整套 ...
- 【c++ Prime 学习笔记】第8章 IO库
C++语言不直接处理输入输出,而是通过标准库中的一组类来处理IO 1.2节介绍的IO库: istream(输入流)类型,提供输入 ostream(输出流)类型,提供输出 cin,是istream对象, ...
- 学了ES6,还不会Promise的链式调用?🧐
前言 本文主要讲解promise的链式调用的方法及其最终方案 应用场景 假如开发有个需求是先要请求到第一个数据,然后根据第一个数据再去请求第二个数据,再根据第二个数据去请求第三个数据...一直到最后得 ...
- the Agiles Scrum Meeting 10
会议时间:2020.4.18 20:00 1.每个人的工作 今天已完成的工作 个人结对项目增量开发组:完成自动创建仓库功能 issues:增量组:准备评测机制,增加仓库自动创建和管理 团队项目增量开发 ...
- 攻防世界 杂项 1.base64÷4
666C61677B45333342374644384133423834314341393639394544444241323442363041417D 根据题目base64÷4得base16 在线工 ...
- Unity的Deferred Shading
什么是Deferred Shading Unity自身除了支持前向渲染之外,还支持延迟渲染.Unity的rendering path可以通过Edit/Project Settings中的Graphic ...