P7739-[NOI2021]密码箱【Splay,矩阵乘法】

正题

题目链接:https://www.luogu.com.cn/problem/P7739


题目描述

懒得概括,摸了。

Yelekastee 是 U 国著名的考古学家。在最近的一次考古行动中,他发掘出了一个远古时期的密码箱。经过周密而严谨的考证,Yelekastee 得知密码箱的密码和某一个数列 {an}\{ a_n \}{an} 相关。数列 {an}\{ a_n \}{an} 可以用如下方式构造出来:

  1. 初始时数列长度为 222 且有 a0=0,a1=1a_0 = 0, a_1 = 1a0=0,a1=1
  2. 对数列依次进行若干次操作,其中每次操作是以下两种类型之一:
  • W 类型:给数列的最后一项111
  • E 类型:若数列的最后一项111,则给倒数第二项加 111;否则先给数列的最后一项111,接着在数列尾再加两项,两项的值都是 111

受到技术限制,密码箱并没有办法完整检查整个数列,因此密码箱的密码设定为数列 {an}\{ a_n \}{an} 经过函数 fff 作用后的值,其中 fff 的定义如下:

f(a0,…,ak−1,ak)={a0,amp;k=0f⁣(a0,a1,…,ak−2,ak−1+1ak)⁣,amp;k≥1f(a_0, \ldots , a_{k - 1}, a_k) = \begin{cases} a_0, & k = 0 \\ f \! \left( a_0, a_1, \ldots , a_{k - 2}, a_{k - 1} + \frac{1}{a_k} \right) \! , & k \ge 1 \end{cases} f(a0,,ak1,ak)={a0,f(a0,a1,,ak2,ak1+ak1),amp;k=0amp;k1

Yelekastee 并不擅长运算,因此他找到了你,希望你能根据他提供的操作序列计算出密码箱的密码。不幸的是,他的记性并不是很好,因此他会随时对提供的操作序列做出一些修改,这些修改包括以下三种:

  • APPEND c,在现有操作序列后追加一次 c 类型操作,其中 c 为字符 WE
  • FLIP l r,反转现有操作序列中第 lll 个至第 rrr 个(下标从 111 开始,修改包含端点 lllrrr,下同)操作,即所有 W 变为 E,所有 E 变为 W
  • REVERSE l r,翻转现有操作序列中第 lll 个至第 rrr 个操作,也就是将这个区间中的操作逆序。

1≤n,q≤1051\leq n,q\leq 10^51n,q105


解题思路

先考虑知道aaa序列怎么求答案,假设上一个传下来的是xy\frac{x}{y}yx,那么新的那个就是x′y′=ak+xy=yak+xx\frac{x'}{y'}=a_k+\frac{x}{y}=\frac{ya_k+x}{x}yx=ak+yx=xyak+x,那么有x′=yak+x,y′=xx'=ya_k+x,y'=xx=yak+x,y=x

显然如果我们只是动态修改每一个aaa,那么上面这个转移可以用矩阵乘法维护。

但是我们现在的操作可能是让一些数+1+1+1和在数列后面+1+1+1。麻烦的是让一些数+1+1+1这个操作,我们考虑如果我们在末尾加入了一个111,那么转移x′=x+y,y′=xx'=x+y,y'=xx=x+y,y=x,如果让末尾的一个数加111,那么x′=x+y,y′=yx'=x+y,y'=yx=x+y,y=y。这样就可以直接考虑矩阵维护EWEWEW操作了,我们分别设上面两个操作的矩阵为HA,HBH_A,H_BHA,HB,我们求出一个GA×HA=1,GB×HB=1G_A\times H_A=1,G_B\times H_B=1GA×HA=1,GB×HB=1这样就可以取消掉前面的一些操作了。

然后考虑一下下面的操作怎么实现,设目前的矩阵乘积为MMM

  1. 让末尾+1+1+1M′=HA×HB×GA×MM'=H_A\times H_B\times G_A\times MM=HA×HB×GA×M
  2. 让倒数第二个+1+1+1:注意到此时最后一个数字肯定是111,所以M′=HA×HA×HB×GA×GA×MM'=H_A\times H_A\times H_B\times G_A\times G_A\times MM=HA×HA×HB×GA×GA×M
  3. 让最后一个数−1-11,然后在末尾加入两个111M′=HA×HA×HA×GB×GA×MM'=H_A\times H_A\times H_A\times G_B \times G_A\times MM=HA×HA×HA×GB×GA×M

然后我们会愉快的发现后两个和EEE有关的操作有HA×HA×HB×GA×GA=HA×HA×HA×GB×GAH_A\times H_A\times H_B\times G_A\times G_A=H_A\times H_A\times H_A\times G_B \times G_AHA×HA×HB×GA×GA=HA×HA×HA×GB×GA

也就是其实EEE两种情况的操作乘上的都是同一个矩阵,那么用Splay维护即可,区间翻转和区间取反操作可以直接维护四个值,表示是否取反/翻转后的矩阵就行了。

至于输出x%P,y%Px\%P,y\%Px%P,y%Pgcd(x,y)gcd(x,y)gcd(x,y)111的要求我们不用担心,因为上面的操作中x,yx,yx,ygcdgcdgcd都是不会变的(因为gcd(x+y,x)=gcd(x,y)gcd(x+y,x)=gcd(x,y)gcd(x+y,x)=gcd(x,y)),所以无论怎样操作x,yx,yx,y都是互质的。

时间复杂度:O((n+q)log⁡n)O((n+q)\log n)O((n+q)logn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
using namespace std;
const int N=2e5+10,S=2,P=998244353;
int read(){int x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
void print(int x)
{if(x>9)print(x/10);putchar('0'+x%10);}
struct Matrix{int a[S][S];
}Ha,Hb,Ga,Gb,HA,HB,HC,O,c;
void add(int &x,int y)
{x=(x+y>=P)?(x+y-P):(x+y);}
Matrix operator*(const Matrix &a,const Matrix &b){memset(c.a,0,sizeof(c.a));for(int i=0;i<S;i++)for(int j=0;j<S;j++)for(int k=0;k<S;k++)add(c.a[i][j],1ll*a.a[i][k]*b.a[k][j]%P);return c;
}
struct node{Matrix M,N;void flp(){swap(M,N);return;}
}W,E,tmp;
int n,q,cnt,root;
char s[N];
struct PeTree{node w[N],v[N],a[N];int t[N][2],fa[N],siz[N];bool r[N],u[N];void PushUp(int x){w[x]=v[x]=a[x];if(t[x][1]){w[x].M=w[t[x][1]].M*w[x].M;v[x].M=v[x].M*v[t[x][1]].M;w[x].N=w[t[x][1]].N*w[x].N;v[x].N=v[x].N*v[t[x][1]].N;}if(t[x][0]){w[x].M=w[x].M*w[t[x][0]].M;v[x].M=v[t[x][0]].M*v[x].M;w[x].N=w[x].N*w[t[x][0]].N;v[x].N=v[t[x][0]].N*v[x].N;}siz[x]=siz[t[x][0]]+siz[t[x][1]]+1;return;}void PushR(int x){swap(t[x][0],t[x][1]);swap(w[x],v[x]);r[x]^=1;return;}void PushU(int x){w[x].flp();v[x].flp();a[x].flp();u[x]^=1;return;}void PushDown(int x){if(r[x])PushR(t[x][0]),PushR(t[x][1]),r[x]=0;if(u[x])PushU(t[x][0]),PushU(t[x][1]),u[x]=0;return;}bool Direct(int x){return t[fa[x]][1]==x;}void Rotate(int x){int y=fa[x],z=fa[y];int xs=Direct(x),ys=Direct(y);int w=t[x][xs^1];if(z)t[z][ys]=x;t[x][xs^1]=y;t[y][xs]=w;if(w)fa[w]=y;fa[y]=x;fa[x]=z;PushUp(y);PushUp(x);return;}void Downdata(int x,int f){if(x==f)return;Downdata(fa[x],f);PushDown(x);return;} void Splay(int x,int f){if(!f)root=x;Downdata(x,f);while(fa[x]!=f){int y=fa[x];if(fa[y]==f)Rotate(x);else if(Direct(x)==Direct(y))Rotate(y),Rotate(x);else Rotate(x),Rotate(x);}return;}int Find(int val,int x=root){PushDown(x);if(siz[t[x][0]]>=val)return Find(val,t[x][0]);if(siz[t[x][0]]+1==val)return x;return Find(val-siz[t[x][0]]-1,t[x][1]);}
}T;
int power(int x,int b){int ans=1;while(b){if(b&1)ans=1ll*ans*x%P;x=1ll*x*x%P;b>>=1;}return ans;
}
void Query(){T.Splay(1,0);T.Splay(n+2,1);Matrix ans=T.w[T.t[n+2][0]].M;int a=ans.a[0][0];int b=ans.a[0][1];swap(a,b);a+=b;a=(a%P+P)%P;b=(b+P)%P;print(b);putchar(' ');print(a);putchar('\n');
}
signed main()
{n=read();q=read();O.a[0][0]=1;O.a[1][0]=0;O.a[1][0]=0;O.a[1][1]=1;Ha.a[0][0]=1;Ha.a[1][0]=1;Ha.a[0][1]=0;Ha.a[1][1]=1;Ga.a[0][0]=1;Ga.a[1][0]=P-1;Ga.a[0][1]=0;Ga.a[1][1]=1;Hb.a[0][0]=1;Hb.a[1][0]=1;Hb.a[0][1]=1;Hb.a[1][1]=0;Gb.a[0][0]=0;Gb.a[1][0]=1;Gb.a[0][1]=1;Gb.a[1][1]=P-1;HA=Hb*Ha*Gb;HB=Hb*Hb*Ha*Gb*Gb;HC=Hb*Hb*Hb*Ga*Gb;W=(node){HA,HB};E=(node){HB,HA};scanf("%s",s+1);cnt=n+2;T.t[1][1]=2;T.fa[n+2]=n+1;for(int i=2;i<=n+1;i++){if(s[i-1]=='W')T.a[i]=W;else T.a[i]=E;T.t[i][1]=i+1;T.fa[i]=i-1;}for(int i=n+2;i>=1;i--)T.PushUp(i);Query();int m=n;while(q--){char op[10];scanf("%s",op);if(op[0]=='A'){scanf("%s",op);++cnt;if(op[0]=='W')T.a[cnt]=W;else T.a[cnt]=E;int p=T.Find(m+1);T.Splay(p,0);p=n+2;T.fa[cnt]=p;T.t[p][0]=cnt;T.PushUp(cnt);T.PushUp(p);++m;}else if(op[0]=='F'){int l=read(),r=read();l=T.Find(l);r=T.Find(r+2);T.Splay(l,0);T.Splay(r,l);T.PushU(T.t[r][0]);T.Splay(T.t[r][0],0);}else if(op[0]=='R'){int l=read(),r=read();l=T.Find(l);r=T.Find(r+2);T.Splay(l,0);T.Splay(r,l);T.PushR(T.t[r][0]);T.Splay(T.t[r][0],0);}Query();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NetCore下模拟和使用Modbus工业通信协议

Tips&#xff1a;1、目前NetCore下与Modbus通信的框架主要选择了 Modbus.Net https://github.com/parallelbgls/Modbus.Net2、modbus是常用的工业通信协议&#xff0c;在软件调试时可以通过modbus pollslave模拟通信通过达到调试目的&#xff0c;下图是我使用软件1&#xff09…

codeforces:65

文章目录前言CF65A Harry Potter and Three SpellsDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF65B Harry Potter and the History of MagicDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\…

C - Rencontre Gym - 102798C

C - Rencontre Gym - 102798C 参考题解&#xff1a; 参考一 参考二 题意&#xff1a; 有一棵树&#xff0c;树上的点分为三种&#xff0c;&#xff08;一个点可以为多种&#xff09;&#xff0c;现在分别在三种点中随机选一点a&#xff0c;b&#xff0c;c&#xff0c;然后找到…

API标准化成为技术团队面临的最大挑战

调查表明&#xff0c;API 标准化成为了技术团队面临的最大挑战。SmartBear 发布了 2019 年 API 状态报告“The State of API 2019”&#xff0c;此报告旨在为 API 行业建立关于软件团队在 2019 年规划、设计、开发、测试、记录和监控 API 的方法、实践和工具的基准。此次调查有…

线性代数五之高斯消元——[SDOI2010]外星千足虫,[HNOI2013]游走,[HNOI2011]XOR和路径,[hdu 4035]Maze

多类型高斯消元杂题[SDOI2010]外星千足虫descriptionsolutioncode[HNOI2013]游走descriptionsolutioncode[HNOI2011]XOR和路径descriptionsolutioncodeMaze(树上高斯消元)problemsolutioncode[SDOI2010]外星千足虫 description solution 高斯消元的模板题 虽然感觉问了个最…

P6117-[JOI 2019 Final]コイン集め【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/P6117 题目大意 平面上有2n2n2n的硬币&#xff0c;要给每个硬币匹配一个x∈[1,n],y∈[1,2]x\in[1,n],y\in[1,2]x∈[1,n],y∈[1,2]的位置&#xff08;不能重复&#xff09;。 使得所有硬币和它们匹配位置的曼哈顿距离之和最小…

CF788789(div1div2)

文章目录前言CF789A Anastasia and pebblesDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF789B Masha and geometric depressionDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}Cod…

【HDU-2376】Average distance

【HDU-2376】Average distance 题意&#xff1a; 给你一个树&#xff0c;求树上任意两个点之间的距离的平均值 题解&#xff1a; 就是求出任意两点之间的距离和然后除以边数 ”任意两点之间的距离“ 和怎么算&#xff1f; 我们去考虑边的贡献情况&#xff1a; 对于边(u,v)&…

Ocelot 资源汇总

前言最近一两年.NET Core的关注度持续上升, 微服务及云原生应用开发上采用.NET Core也越来越多&#xff0c;Ocelot 作为.NET Core平台下一款开源的API 网关开发库越来越得到社区的认可&#xff0c;应用到生产中的案例也有好几百了。春节抽空整理了现有网上公开的Ocelot相关的资…

P6698-[BalticOI 2020 Day2]病毒【AC自动机,dp,SPFA】

正题 题目链接:https://www.luogu.com.cn/problem/P6698 题目大意 有一个包含0∼G−10\sim G-10∼G−1的字符集&#xff0c;其中有nnn种变换&#xff0c;能够将一个字符ai(ai>1)a_i(a_i>1)ai​(ai​>1)变为一串字符bib_ibi​&#xff0c;当一个字符串中只剩下000和1…

[TJOI2017]城市(未解决)

[TJOI2017]城市 题意&#xff1a; 一棵树&#xff0c;现在要求你将一条边改变他的位置&#xff0c;&#xff08;即改变左右所连接的端点&#xff0c;权值不变&#xff09;&#xff0c;修改后任意两点相互可达&#xff0c;且使得两个点之间的最大交通费用最小 题解: 有O(n^2…

数论三之组合数学Ⅰ-Max-Min Sums,Binomial Coefficient is Fun,Strivore,Bubble Sort,放棋子,LOJ6671,Iroha and a Grid

组合计数我最爱Max-Min SumsdescriptionsolutioncodeBinomial Coefficient is FundescriptionsolutioncodeStrivoredescriptionsolutioncodeBubble Sortdescriptionsolutioncode[HAOI2016]放棋子descriptionsolutioncodeEntropyIncreaser 与 MinecraftdescriptionsolutioncodeD…

12.15模拟:总结

前言 20分 《好耶》 很好的把所有错误都犯了一遍。 8&#xff1a;30写完AB题 11&#xff1a;00还是只写完AB题, T1代码没有提交 T2数组算错空间全RE T3快结束了发现CE了删掉第二档后还交成了之前写的失败版本(结果靠这破玩意水到了仅有的20分) T4考场其实猜到了结论但没证出来…

语言之争与读书有感

移动互联网无处不在的今天&#xff0c;不同的学习方式让我们受益颇多。有人喜欢通过手机阅读各类技术专家的公众号分享&#xff1b;有人喜欢通过逛逛不同的博客&#xff0c;来了解当前时下的技术&#xff1b;也有人喜欢通过社区的形式&#xff0c;跟优秀的导师们一起梳理和发展…

CF566E-Restoring Map【bitset】

正题 题目链接:https://www.luogu.com.cn/problem/CF566E 题目大意 有一棵树&#xff0c;但是你不知道它的形态。你现在只知道距离每个点距离不超过222的点集&#xff0c;但是你不知道每个点集是对应哪个点的。 现在要你求这棵树。 2≤n≤10002\leq n\leq 10002≤n≤1000 解…

所有人都可以是开发人员——《Office 365开发入门指南》视频教程即将上市

今天是春节假期的最后一天&#xff0c;在这里给全国的朋友们拜个晚年&#xff0c;祝大家身体健康&#xff0c;晚年幸福啊。这个春节大家过的怎么样啊&#xff0c;我自己是在老家过的年&#xff0c;家乡的年味还是比较浓的&#xff0c;也再次感谢朋友圈的大家给我看了各地的风光…

CodeForces: 360(div1)361(div2)

文章目录前言CF361A Levko and TableDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF361B Levko and PermutationDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF360A Levko a…

数论三之排列组合Ⅱ——Virus Tree 2,RGB Coloring,123 Triangle,排列计数,排队,卡农

丝且人一口Virus Tree 2descriptionsolutioncodeRGB Coloringdescriptionsolutioncode123 Triangledescriptionsolutioncode[SDOI2016]排列计数descriptionsolutioncode[HNOI2012]排队descriptionsolutioncode[HNOI2011]卡农descriptionsolutioncodeVirus Tree 2 description …

B - Labyrinth Gym - 102798B

B - Labyrinth Gym - 102798B 题意&#xff1a; n * m的地图&#xff0c;有k个障碍物&#xff0c;给你起点到终点&#xff0c;从起点到终点的最短距离 1<n,m<200000 nm<200000 0<k<42 1<q<100000 题解&#xff1a; 如果没有障碍物&#xff0c;两点之间…

P2483-[模板]k短路/[SDOI2010]魔法猪学院【主席树,堆】

正题 题目链接:https://www.luogu.com.cn/problem/P2483 题目大意 给出一个nnn个点mmm条边的一张带权有向图&#xff0c;求一个最大的kkk使得1∼n1\sim n1∼n的前kkk短路径长度和不超过EEE。 2≤n≤5000,1≤m≤2105,1≤E≤1072\leq n\leq 5000,1\leq m\leq 2\times 10^5,1\le…