[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 ...
随机推荐
- C#开发BIMFACE系列41 服务端API之模型对比
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] 在建筑施工图审查系统中,设计单位提交设计完成的模型/图纸,审查专家审查模型/图纸.审查过程中如果发现不符合规范的地方,则流 ...
- 深入思考软件工程,开启 DevOps 之旅
20 世纪 60 年代,软件开始脱离硬件,逐渐成为一个独立产业.至今,软件开发过程从瀑布模型.CMM/CMMI,到 20 年前敏捷的诞生,再到今天 DevOps 的火热,一代代软件人在思考和探索,如何 ...
- NOIP模拟80
学考+OJ改名祭 T1 邻面合并 解题思路 状压 DP ...(于是贪心竟然有 60pts 的高分?? code) 状态设计的就非常妙了,如果状态是 1 就表示是一个分割点也就是一个矩形的右边界. 那 ...
- 解决Mybatis 报错Invalid bound statement (not found)
解决Mybatis 报错Invalid bound statement (not found) 出现此错误的原因 1.xml文件不存在 2.xml文件和mapper没有映射上 namespace指定映 ...
- 第七次Scrum Metting
日期:2021年5月5日 会议主要内容概述:前后端对接,以及接下来的测试优化等工作. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 徐宇龙 后端 测试数据模块和 ...
- Scrum Meeting 0423
零.说明 日期:2021-4-23 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成引导页UI# ...
- SpringBoot整合多个RabbitMQ
一.背景 最近项目中需要用到了RabbitMQ来监听消息队列,监听的消息队列的 虚拟主机(virtualHost)和队列名(queueName)是不一致的,但是接收到的消息格式相同的.而且可能还存 ...
- 使用nexus搭建一个docker私服
使用nexus搭建docker私服 一.需求: 二.实现步骤 1.编写`docker-compose`文件,实现`nexus`的部署 2.修改/usr/lib/systemd/system/docke ...
- 微信小程序实现上拉和下拉加载更多
在上一篇文章中,我们知道了使用 scroll-view 可以实现上拉加载更多,但是由于 scroll-view 的限制,它无法实现下拉加载更多,这篇文章我们使用 view 组件来实现 上拉和下拉加载更 ...
- C语言单片机项目实战超声波雷达测距
本实验是基于MSP430利用HC-SR04超声波传感器进行测距,测距范围是3-65cm,讲得到的数据显示在LCD 1602液晶屏上. 模块工作原理如下 (1)采用 IO 触发测距,给至少 10us 的 ...