T1 语言

比较简单的题,然后就瞎写了,所以考场上就我一个写了线段树的,所以我的常数。。。。

所以就枚举动词的位置,找前面后面有没有出现$4$即可

 1 #include<bits/stdc++.h>
2 using namespace std;
3 inline int read(){
4 int x=0,f=1;char ch=getchar();
5 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
6 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
7 return x*f;
8 }
9 const int NN=100005;
10 int T,w[27],n,a[NN];
11 char s[NN];
12 struct SNOWtree{
13 #define lid (id<<1)
14 #define rid (id<<1|1)
15 int ll[NN<<2],rr[NN<<2],sm[NN<<2][8];
16 inline void pushup(int id){
17 if(ll[id]==rr[id]) return;
18 for(int i=1;i<=7;++i) sm[id][i]=sm[lid][i]+sm[rid][i];
19 }
20 inline void build(int id,int l,int r){
21 ll[id]=l; rr[id]=r;
22 if(l==r){
23 ++sm[id][a[l]];return;
24 }int mid=l+r>>1;
25 build(lid,l,mid); build(rid,mid+1,r);
26 pushup(id);
27 }
28 inline int query(int id,int l,int r,int opt){
29 if(l<=ll[id]&&rr[id]<=r)return sm[id][opt];
30 int mid=ll[id]+rr[id]>>1,ans=0;
31 if(l<=mid) ans+=query(lid,l,r,opt);
32 if(r>mid) ans+=query(rid,l,r,opt);
33 return ans;
34 }
35 }tr;
36 inline bool check(int i,int x){
37 if(i-1==0||i==n) return 0;
38 if(x==1||x==2||x==3) return 0;
39 if(a[i-1]==1||a[i-1]==4||a[i-1]==5) return 0;
40 if(tr.query(1,1,i-2,4)!=0||tr.query(1,i+1,n-1,4)!=0) return 0;
41 return 1;
42 }
43 namespace WSN{
44 inline short main(){
45 // freopen("in.in","r",stdin);
46 freopen("language.in","r",stdin);
47 freopen("language.out","w",stdout);
48 T=read();
49 while(T--){
50 memset(a,0,sizeof(a));
51 for(int i=1;i<=26;i++)w[i]=read();
52 scanf("%s",s+1);n=strlen(s+1);
53 for(int i=1;i<=n;i++){
54 int ch=s[i]-'a'+1;
55 a[i]=w[ch];
56 }
57 if(a[n]!=2&&a[n]!=3&&a[n]!=6&&a[n]!=7){puts("No");continue;}
58 memset(tr.ll,0,sizeof(tr.ll));
59 memset(tr.rr,0,sizeof(tr.rr));
60 memset(tr.sm,0,sizeof(tr.sm));
61 tr.build(1,1,n); bool flag=0;
62 for(int i=1;i<=n;i++)
63 if(check(i,a[i])){flag=1;break;}
64 puts(flag?"Yes":"No");
65 }
66 return 0;
67 }
68 }
69 signed main(){return WSN::main();}

T2 色球

珂朵莉树写错一句话,就惨挂$30pts$,非常悲伤

于是先贴一个珂朵莉树的暴力

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 inline int read(){
5 int x=0,f=1;char ch=getchar();
6 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
7 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
8 return x*f;
9 }
10 const int NN=200005;
11 int n,m,top[NN],tp;
12 char ch[5];
13 namespace Chtholly{
14 #define sit set<node>::iterator
15 struct node{
16 int l,r; mutable int v;
17 node(int l,int r=0,int v=0):l(l),r(r),v(v){}
18 bool operator<(const node&a)const{return l<a.l;}
19 };
20 set<node> s[NN];
21 inline sit split(int i,int pos){
22 sit it=s[i].lower_bound(pos);
23 if(it!=s[i].end()&&it->l==pos) return it;
24 --it; if(it->r<pos) return s[i].end();
25 int L=it->l,R=it->r,V=it->v;
26 s[i].erase(it);
27 s[i].insert(node(L,pos-1,V));
28 return s[i].insert(node(pos,R,V)).first;
29 }
30 inline void assign(int i,int l,int r,int v){
31 sit itr=split(i,r+1),itl=split(i,l);
32 s[i].erase(itl,itr);
33 s[i].insert(node(l,r,v));
34 }
35 }using namespace Chtholly;
36 namespace WSN{
37 inline short main(){
38 freopen("color.in","r",stdin);
39 freopen("color.out","w",stdout);
40 n=read(); m=read();
41 for(int i=1;i<=n;i++) s[i].insert(node(0,1e18,0));
42 while(m--){
43 scanf("%s",ch);
44 if(ch[2]=='s'){
45 int x=read(),y=read(),z=read();
46 assign(z,top[z]+1,top[z]+x,y);
47 top[z]+=x;
48 }
49 if(ch[2]=='p'){
50 int x=read(),z=read(),l=top[z]-x+1,r=top[z];
51 sit itr=split(z,r+1),itl=split(z,l);
52 printf("%lld\n",itl->v);
53 assign(z,l,r,0); top[z]-=x;
54 }
55 if(ch[2]=='t'){
56 int u=read(),v=read();
57 sit it=s[u].end();
58 if(it!=s[u].begin()) --it;
59 while(it!=s[u].begin()){
60 if(it->v==0) {--it;continue;}
61 assign(v,top[v]+1,top[v]+it->r-it->l+1,it->v);
62 top[v]+=it->r-it->l+1; --it;
63 }
64 if(it->v!=0){
65 assign(v,top[v]+1,top[v]+it->r-it->l+1,it->v);
66 top[v]+=it->r-it->l+1;
67 }
68 top[u]=0;s[u].clear();s[u].insert(node(0,1e18,0));
69 }
70 }
71 return 0;
72 }
73 }
74 signed main(){return WSN::main();}

然后考虑双端队列的暴力,因为他可以优化成正解,

在直接双端队列的基础上使用启发式合并就行啦

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 inline int read(){
5 int x=0;char ch=getchar();
6 while(ch<'0'||ch>'9'){ch=getchar();}
7 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
8 return x;
9 }
10 const int NN=200005;
11 int n,m,top[NN];
12 bool rev[NN];
13 char ch[10];
14 struct node{
15 int num,col;
16 };deque<node> q[NN];
17 namespace WSN{
18 inline short main(){
19 freopen("color.in","r",stdin);
20 freopen("color.out","w",stdout);
21 n=read(); m=read();
22 for(int i=1;i<=n;i++)top[i]=i;
23 int u,v,x,y,z;
24 while(m--){
25 cin>>ch;
26 if(ch[2]=='s'){
27 x=read(),y=read(),z=read();
28 if(!rev[z]) q[top[z]].push_back(node{x,y});
29 else q[top[z]].push_front(node{x,y});
30 }
31 if(ch[2]=='p'){
32 x=read(),z=read(); node now;
33 if(!rev[z]){
34 z=top[z];
35 while(x&&!q[z].empty()){
36 now=q[z].back(); q[z].pop_back();
37 if(now.num>x){
38 now.num-=x; q[z].push_back(node{now.num,now.col});
39 printf("%lld\n",now.col);
40 break;
41 }
42 x-=now.num; if(!x) printf("%lld\n",now.col);
43 }
44 }
45 else{
46 z=top[z];
47 while(x&&!q[z].empty()){
48 now=q[z].front(); q[z].pop_front();
49 if(now.num>x){
50 now.num-=x; q[z].push_front(node{now.num,now.col});
51 printf("%lld\n",now.col);
52 break;
53 }
54 x-=now.num; if(!x) printf("%lld\n",now.col);
55 }
56 }
57 }
58 if(ch[2]=='t'){
59 u=read(),v=read(); bool flag=false;
60 if(q[top[u]].size()>q[top[v]].size())
61 swap(top[u],top[v]),swap(rev[u],rev[v]),flag=true;
62 if(!rev[u]&&!rev[v]) while(q[top[u]].size()) q[top[v]].push_back (q[top[u]].back()), q[top[u]].pop_back();
63 else if(rev[u]&&!rev[v]) while(q[top[u]].size()) q[top[v]].push_back (q[top[u]].front()),q[top[u]].pop_front();
64 else if(!rev[u]&&rev[v]) while(q[top[u]].size()) q[top[v]].push_front(q[top[u]].back()), q[top[u]].pop_back();
65 else while(q[top[u]].size()) q[top[v]].push_front(q[top[u]].front()),q[top[u]].pop_front();
66 if(flag) rev[v]^=1;
67 }
68 }
69 return 0;
70 }
71 }
72 signed main(){return WSN::main();}

T3 斐波

考场上推出来了个$f_i^2+f_{i+1}^2=f_{2i+1}$,但不知道怎么用,然后题解里的那个也没推出来,就死掉了

就咕咕咕

$UPD2021.10.26$这题卡常卡的我爽了,现在非常亢奋

按照题解说的维护矩阵$B_i=I+A^a_i$,那么答案就是$\sum\limits_{i=l}^{r}\sum\limits_{j=i}^{r}\prod\limits_{k=i}^{j}B_k \times \overrightarrow{g_0}$

其中$\overrightarrow{g_0}$初始化为$\begin{vmatrix}0&1&1\end{vmatrix}$

然后如果直接按照以上式子维护的话可获得$50pts$

 1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 inline int read(){
5 int x=0,f=1;char ch=getchar();
6 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
7 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
8 return x*f;
9 }
10 const int NN=100005,mod=998244353;
11 int n,q,a[NN],fib[NN];
12 namespace Matrix{
13 struct Ma{
14 int m[4][4];
15 Ma(){memset(m,0,sizeof(m));}
16 inline void pre(){m[1][1]=m[2][2]=m[3][3]=1;}
17 inline void print(){
18 for(int i=1;i<=3;i++){
19 for(int j=1;j<=3;j++){
20 cout<<m[i][j]<<" ";
21 }cout<<endl;
22 }
23 }
24 Ma operator*(const Ma&a)const{ Ma c;
25 for(int i=1;i<=3;i++) for(int j=1;j<=3;j++)
26 for(int k=1;k<=3;k++) c.m[i][j]=(c.m[i][j]+m[i][k]*a.m[k][j]%mod)%mod;
27 return c;
28 }
29 Ma operator+(const Ma&a)const{ Ma c;
30 for(int i=1;i<=3;i++) for(int j=1;j<=3;j++)
31 for(int k=1;k<=3;k++) c.m[i][j]=(m[i][j]+a.m[i][j])%mod;
32 return c;
33 }
34 };
35 struct Li{
36 int l[4];
37 Li(){memset(l,0,sizeof(l));}
38 Li operator*(const Ma&a)const{ Li c;
39 for(int i=1;i<=3;i++) for(int j=1;j<=3;j++)
40 c.l[i]=(c.l[i]+l[j]*a.m[i][j]%mod)%mod;
41 return c;
42 }
43 Li operator+(const Li&a)const{ Li c;
44 for(int i=1;i<=3;i++) c.l[i]=(l[i]+a.l[i])%mod;
45 return c;
46 }
47 };
48 inline Ma ksm(Ma a,int b){
49 Ma ans; ans.pre();
50 for(;b;b>>=1,a=a*a)if(b&1)ans=ans*a;
51 return ans;
52 }
53 }using namespace Matrix;
54 Ma A,I,B[NN];
55 Li g;
56 inline void prework(){
57 fib[1]=1;fib[2]=1; I.pre();
58 for(int i=3;i<NN;i++)fib[i]=(fib[i-1]+fib[i-2])%mod;
59 A.m[1][1]=A.m[1][2]=2;A.m[2][1]=A.m[3][2]=1;A.m[1][3]=-1;
60 g.l[1]=0;g.l[2]=1;g.l[3]=1;
61 for(int i=1;i<=n;i++) B[i]=I+ksm(A,a[i]);
62 }
63 namespace WSN{
64 inline short main(){
65 // freopen("in.in","r",stdin);
66 freopen("fib.in","r",stdin);freopen("fib.out","w",stdout);
67 n=read();q=read();for(int i=1;i<=n;i++)a[i]=read();
68 prework();
69 while(q--){
70 int opt=read();
71 if(opt==1){
72 int p=read(),v=read();
73 B[p]=I+ksm(A,v);
74 }
75 if(opt==2){
76 int l=read(),r=read(),an=0;
77 for(int i=l;i<=r;i++){
78 for(int j=i;j<=r;j++){
79 Ma ans;Li f;ans.pre();
80 for(int k=i;k<=j;k++) ans=ans*B[k];
81 f=g*ans;
82 an=(an+f.l[1]%mod)%mod;
83 }
84 }
85 printf("%lld\n",(an+mod)%mod);
86 }
87 }
88 return 0;
89 }
90 }
91 signed main(){return WSN::main();}

然后考虑用线段树维护答案,那么需要在线段树内维护四个矩阵,具体的$pushup$会比较妙

inline void pushup(int id){
if(ll[id]==rr[id])return;
ms[id]=ms[lid]*ms[rid];
sum[id]=sum[lid]+sum[rid]+ls[rid]*rs[lid];
ls[id]=ls[lid]+ms[lid]*ls[rid];
rs[id]=rs[rid]+ms[rid]*rs[lid];
}

然后查询的时候使用那种带跨越区间合并的查询方式,就可以得到一段区间的答案,这样的复杂度是$O(3^3qlogn)$,预计得分$70pts$(???)

没错,就是只有$70$,常数大斩了!!!!

剩下的就只有卡常,$\huge{只有卡常!!}$

  1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 inline int read(){
5 int x=0,f=1;char ch=getchar();
6 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
7 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
8 return x*f;
9 }
10 const int NN=100005,mod=998244353;
11 int n,q,a[NN];
12 namespace Matrix{
13 struct Ma{
14 int m[3][3];
15 Ma(){memset(m,0,sizeof(m));}
16 inline void pre(){m[0][0]=m[1][1]=m[2][2]=1;}
17 Ma operator*(const Ma&a)const{ Ma c;
18 for(int i=0;i<3;++i) for(int j=0;j<3;++j){
19 for(int k=0;k<3;++k) c.m[i][j]+=m[i][k]*a.m[k][j]%mod;
20 c.m[i][j]%=mod;
21 } return c;
22 }
23 Ma operator+(const Ma&a)const{ Ma c;
24 for(int i=0;i<3;++i) for(int j=0;j<3;++j)
25 c.m[i][j]=(m[i][j]+a.m[i][j])%mod;
26 return c;
27 }
28 };
29 struct Li{
30 int l[3];
31 Li(){memset(l,0,sizeof(l));}
32 Li operator*(const Ma&a)const{ Li c;
33 for(int i=0;i<3;++i){
34 for(int j=0;j<3;++j) c.l[i]+=l[j]*a.m[i][j]%mod;
35 c.l[i]%=mod;
36 } return c;
37 }
38 Li operator+(const Li&a)const{ Li c;
39 for(int i=0;i<3;i++) c.l[i]=(l[i]+a.l[i])%mod;
40 return c;
41 }
42 };
43 auto ksm=[](Ma a,int b){
44 Ma ans; ans.pre();
45 for(;b;b>>=1,a=a*a)if(b&1)ans=ans*a;
46 return ans;
47 };
48 }using namespace Matrix;
49 Ma A,I,B[NN];
50 Li g;
51 auto prework=[](){
52 I.pre(); g.l[0]=0;g.l[1]=1;g.l[2]=1;
53 A.m[0][0]=A.m[0][1]=2;A.m[1][0]=A.m[2][1]=1;A.m[0][2]=-1;
54 for(int i=1;i<=n;i++) B[i]=I+ksm(A,a[i]);
55 };
56 struct SNOWtree{
57 #define lid (id<<1)
58 #define rid (id<<1|1)
59 int ll[NN<<2],rr[NN<<2];
60 Ma sum[NN<<2],ls[NN<<2],rs[NN<<2],ms[NN<<2];
61 inline void pushup(int id){
62 if(ll[id]==rr[id])return;
63 ms[id]=ms[lid]*ms[rid];
64 sum[id]=sum[lid]+sum[rid]+ls[rid]*rs[lid];
65 ls[id]=ls[lid]+ms[lid]*ls[rid];
66 rs[id]=rs[rid]+ms[rid]*rs[lid];
67 }
68 inline void build(int id,int l,int r){
69 ll[id]=l;rr[id]=r;if(l==r) return ls[id]=rs[id]=ms[id]=sum[id]=B[l],void();
70 int mid=l+r>>1; build(lid,l,mid); build(rid,mid+1,r); pushup(id);
71 }
72 inline void update(int id,int pos,int v){
73 if(ll[id]==rr[id]) return sum[id]=ls[id]=rs[id]=ms[id]=I+ksm(A,v),void();
74 int mid=ll[id]+rr[id]>>1;if(pos<=mid)update(lid,pos,v);else update(rid,pos,v);
75 pushup(id);
76 }
77 struct answer{Ma ms,sum,ls,rs;};
78 inline answer query(int id,int l,int r){
79 if(l<=ll[id]&&rr[id]<=r) return answer{ms[id],sum[id],ls[id],rs[id]};
80 int mid=ll[id]+rr[id]>>1;answer ans;
81 if(r<=mid)return query(lid,l,r);if(l>mid)return query(rid,l,r);
82 answer t1=query(lid,l,mid),t2=query(rid,mid+1,r);
83 return answer{t1.ms*t2.ms,t1.sum+t2.sum+t1.rs*t2.ls,t1.ls+t1.ms*t2.ls,t2.rs+t2.ms*t1.rs};
84 }
85 }tr;
86 Ma tmp;Li res;
87 int opt,l,r,p,v;
88 namespace WSN{
89 inline short main(){
90 // freopen("in.in","r",stdin);
91 freopen("fib.in","r",stdin);freopen("fib.out","w",stdout);
92 n=read();q=read();for(int i=1;i<=n;i++)a[i]=read();
93 prework(); tr.build(1,1,n);
94 while(q--){
95 opt=read();
96 if(opt==1) p=read(),v=read(),tr.update(1,p,v);
97 if(opt==2){
98 l=read(),r=read();
99 tmp=tr.query(1,l,r).sum; res=g*tmp;
100 printf("%lld\n",(res.l[0]+mod)%mod);
101 }
102 }
103 return 0;
104 }
105 }
106 signed main(){return WSN::main();}

TLE70(更可读)

  1 %:pragma GCC optimize(3)
2 #include<bits/stdc++.h>
3 #define int long long
4 const int NN=100001,mod=998244353;
5 namespace AE86{
6 auto read=[](){
7 int x=0,f=1;char ch=getchar();
8 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
9 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
10 return x*f;
11 };
12 auto write=[](int x,char opt='\n'){
13 char ch[20];short len=0;if(x<0)x=~x+1,putchar('-');
14 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
15 for(short i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);
16 };
17 }using namespace AE86;
18 signed n,q,a[NN];
19 namespace Matrix{
20 struct Ma{
21 int m[3][3];
22 Ma(){memset(m,0,sizeof(m));}
23 inline void pre(){m[0][0]=m[1][1]=m[2][2]=1;}
24 inline Ma operator*(const Ma&a)const{ Ma c;
25 c.m[0][0]=c.m[0][0]+m[0][0]*a.m[0][0]%mod;
26 c.m[0][0]=c.m[0][0]+m[0][1]*a.m[1][0]%mod;
27 c.m[0][0]=c.m[0][0]+m[0][2]*a.m[2][0]%mod; c.m[0][0]%=mod;
28 c.m[0][1]=c.m[0][1]+m[0][0]*a.m[0][1]%mod;
29 c.m[0][1]=c.m[0][1]+m[0][1]*a.m[1][1]%mod;
30 c.m[0][1]=c.m[0][1]+m[0][2]*a.m[2][1]%mod; c.m[0][1]%=mod;
31 c.m[0][2]=c.m[0][2]+m[0][0]*a.m[0][2]%mod;
32 c.m[0][2]=c.m[0][2]+m[0][1]*a.m[1][2]%mod;
33 c.m[0][2]=c.m[0][2]+m[0][2]*a.m[2][2]%mod; c.m[0][2]%=mod;
34 c.m[1][0]=c.m[1][0]+m[1][0]*a.m[0][0]%mod;
35 c.m[1][0]=c.m[1][0]+m[1][1]*a.m[1][0]%mod;
36 c.m[1][0]=c.m[1][0]+m[1][2]*a.m[2][0]%mod; c.m[1][0]%=mod;
37 c.m[1][1]=c.m[1][1]+m[1][0]*a.m[0][1]%mod;
38 c.m[1][1]=c.m[1][1]+m[1][1]*a.m[1][1]%mod;
39 c.m[1][1]=c.m[1][1]+m[1][2]*a.m[2][1]%mod; c.m[1][1]%=mod;
40 c.m[1][2]=c.m[1][2]+m[1][0]*a.m[0][2]%mod;
41 c.m[1][2]=c.m[1][2]+m[1][1]*a.m[1][2]%mod;
42 c.m[1][2]=c.m[1][2]+m[1][2]*a.m[2][2]%mod; c.m[1][2]%=mod;
43 c.m[2][0]=c.m[2][0]+m[2][0]*a.m[0][0]%mod;
44 c.m[2][0]=c.m[2][0]+m[2][1]*a.m[1][0]%mod;
45 c.m[2][0]=c.m[2][0]+m[2][2]*a.m[2][0]%mod; c.m[2][0]%=mod;
46 c.m[2][1]=c.m[2][1]+m[2][0]*a.m[0][1]%mod;
47 c.m[2][1]=c.m[2][1]+m[2][1]*a.m[1][1]%mod;
48 c.m[2][1]=c.m[2][1]+m[2][2]*a.m[2][1]%mod; c.m[2][1]%=mod;
49 c.m[2][2]=c.m[2][2]+m[2][0]*a.m[0][2]%mod;
50 c.m[2][2]=c.m[2][2]+m[2][1]*a.m[1][2]%mod;
51 c.m[2][2]=c.m[2][2]+m[2][2]*a.m[2][2]%mod; c.m[2][2]%=mod;
52 return c;
53 }
54 inline Ma operator+(const Ma&a)const{ Ma c;
55 c.m[0][0]=m[0][0]+a.m[0][0];c.m[0][0]%=mod;
56 c.m[0][1]=m[0][1]+a.m[0][1];c.m[0][1]%=mod;
57 c.m[0][2]=m[0][2]+a.m[0][2];c.m[0][2]%=mod;
58 c.m[1][0]=m[1][0]+a.m[1][0];c.m[1][0]%=mod;
59 c.m[1][1]=m[1][1]+a.m[1][1];c.m[1][1]%=mod;
60 c.m[1][2]=m[1][2]+a.m[1][2];c.m[1][2]%=mod;
61 c.m[2][0]=m[2][0]+a.m[2][0];c.m[2][0]%=mod;
62 c.m[2][1]=m[2][1]+a.m[2][1];c.m[2][1]%=mod;
63 c.m[2][2]=m[2][2]+a.m[2][2];c.m[2][2]%=mod;
64 return c;
65 }
66 };
67 struct Li{
68 int l[3];
69 Li(){memset(l,0,sizeof(l));}
70 inline Li operator*(const Ma&a)const{ Li c;
71 c.l[0]=c.l[0]+l[0]*a.m[0][0]%mod;
72 c.l[0]=c.l[0]+l[1]*a.m[0][1]%mod;
73 c.l[0]=c.l[0]+l[2]*a.m[0][2]%mod;c.l[0]%=mod;
74 c.l[1]=c.l[1]+l[0]*a.m[1][0]%mod;
75 c.l[1]=c.l[1]+l[1]*a.m[1][1]%mod;
76 c.l[1]=c.l[1]+l[2]*a.m[1][2]%mod;c.l[1]%=mod;
77 c.l[2]=c.l[2]+l[0]*a.m[2][0]%mod;
78 c.l[2]=c.l[2]+l[1]*a.m[2][1]%mod;
79 c.l[2]=c.l[2]+l[2]*a.m[2][2]%mod;c.l[2]%=mod;
80 return c;
81 }
82 };
83 auto ksm=[](Ma a,signed b){
84 Ma ans; ans.pre();
85 for(;b;b>>=1,a=a*a)if(b&1)ans=ans*a;
86 return ans;
87 };
88 }using namespace Matrix;
89 Ma A,I,B[NN];
90 Li g;
91 auto prework=[](){
92 I.pre(); g.l[0]=0;g.l[1]=1;g.l[2]=1;
93 A.m[0][0]=A.m[0][1]=2;A.m[1][0]=A.m[2][1]=1;A.m[0][2]=-1;
94 for(signed i=1;i<=n;++i) B[i]=I+ksm(A,a[i]);
95 };
96 struct SNOWtree{
97 #define lid (id<<1)
98 #define rid (id<<1|1)
99 signed ll[NN<<2],rr[NN<<2];
100 Ma sum[NN<<2],ls[NN<<2],rs[NN<<2],ms[NN<<2];
101 inline void pushup(signed id){
102 if(ll[id]==rr[id])return;
103 ms[id]=ms[lid]*ms[rid];
104 sum[id]=sum[lid]+sum[rid]+ls[rid]*rs[lid];
105 ls[id]=ls[lid]+ms[lid]*ls[rid];
106 rs[id]=rs[rid]+ms[rid]*rs[lid];
107 }
108 inline void build(signed id,signed l,signed r){
109 ll[id]=l;rr[id]=r;if(l==r) return ls[id]=rs[id]=ms[id]=sum[id]=B[l],void();
110 signed mid=l+r>>1; build(lid,l,mid); build(rid,mid+1,r); pushup(id);
111 }
112 inline void update(signed id,signed pos,signed v){
113 if(ll[id]==rr[id]) return sum[id]=ls[id]=rs[id]=ms[id]=I+ksm(A,v),void();
114 signed mid=ll[id]+rr[id]>>1;if(pos<=mid)update(lid,pos,v);else update(rid,pos,v);
115 pushup(id);
116 }
117 struct answer{Ma ms,sum,ls,rs;};
118 inline answer query(signed id,signed l,signed r){
119 if(l<=ll[id]&&rr[id]<=r) return answer{ms[id],sum[id],ls[id],rs[id]};
120 signed mid=ll[id]+rr[id]>>1; answer ans;
121 if(r<=mid)return query(lid,l,r);if(l>mid)return query(rid,l,r);
122 answer t1=query(lid,l,mid),t2=query(rid,mid+1,r);
123 return answer{t1.ms*t2.ms,t1.sum+t2.sum+t1.rs*t2.ls,t1.ls+t1.ms*t2.ls,t2.rs+t2.ms*t1.rs};
124 }
125 }tr;
126 Ma tmp;Li res;
127 signed opt,l,r,p,v;
128 namespace WSN{
129 inline short main(){
130 freopen("fib.in","r",stdin);freopen("fib.out","w",stdout);
131 n=read();q=read();for(signed i=1;i<=n;++i)a[i]=read();
132 prework(); tr.build(1,1,n);
133 while(q--){
134 opt=read();
135 if(opt==1) p=read(),v=read(),tr.update(1,p,v);
136 else l=read(),r=read(),tmp=tr.query(1,l,r).sum,res=g*tmp,write((res.l[0]+mod)%mod);
137 }
138 return 0;
139 }
140 }
141 signed main(){return WSN::main();}

看了会死100

T4 偶数

咕咕咕

Noip模拟81 2021.10.20的更多相关文章

  1. Noip模拟70 2021.10.6

    T1 暴雨 放在第一道的神仙题,不同的做法,吊人有的都在用线段树维护$set$预处理 我是直接$dp$的,可能代码的复杂度比那种的稍微小一点 设$f[i][j][p][0/1]$表示考虑了前$i$列, ...

  2. Noip模拟69 2021.10.5

    考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...

  3. Noip模拟76 2021.10.14

    T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...

  4. Noip模拟83 2021.10.26

    T1 树上的数 有手就能在衡中$OJ$上过,但是$WaitingCoders$不行,就是这样 必须使用$O(n)$算法加上大力卡常,思路就是找子树内没更新的更新,更新过了直接$return$ 1 #i ...

  5. Noip模拟80 2021.10.18

    预计得分:5 实际得分:140?????????????? T1 邻面合并 我考场上没切掉的大水题....(证明我旁边的cty切掉了,并觉得很水) 然而贪心拿了六十,离谱,成功做到上一篇博客说的有勇气 ...

  6. Noip模拟79 2021.10.17(题目名字一样)

    T1 F 缩点缩成个$DAG$,然后根据每个点的度数计算期望值 1 #include<cstdio> 2 #include<cstring> 3 #include<vec ...

  7. Noip模拟74 2021.10.11

    T1 自然数 考场上当我发现我的做法可能要打线段树的时候,以为自己百分之百是考虑麻烦了 但还是打了,还过掉了所有的样例,于是十分自信的就交了 正解还真是线段树,真就第一题数据结构 但是包括自己造的小样 ...

  8. Noip模拟72 2021.10.9

    T1 出了个大阴间题 真就以为他出了个大阴间题就没写,打个暴力就跑了 数据范围显然摆明是状压 设$f[sta][0/1]$表示在已经选择的集合$sta$中,$A$的最大值是$A$还是$A+1$ 然后按 ...

  9. Noip模拟71 2021.10.7

    T1 签到题 结论题,找到规律就会做 规律是每个点的度数$\mod$颜色种数,如果不是$0$则贡献一个答案 1 #include<bits/stdc++.h> 2 #define int ...

随机推荐

  1. java9的JShell小工具和编译器两种自动优化

    一.按顺序逐步执行的脚本程序: 二.编译器自动优化 1.不超数据类型范围编译器自动添加强转操作: 2.一但发生运算,byte/short/char都会自动提升为Int,当只有常量参与运算时,编译器会先 ...

  2. Spring Boot 入门系列(二十八) JPA 的实体映射关系,一对一,一对多,多对多关系映射!

    前面讲了Spring Boot 使用 JPA,实现JPA 的增.删.改.查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用.JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层 ...

  3. [推荐]MyBatis 核心技术与面试 34 讲

    MyBatis 核心技术与面试 34 讲 职业生涯中常被问到: 如何成为某方面的高手? 如何快速搞定某项技术? 我现在的水平处于什么阶段? -- 我暗暗想,我们从小学到中学到大学,经历了大考三六九.小 ...

  4. 使用 VSCode 开发调试 STM32 单片机尝试

    使用 VSCode 开发调试 STM32 单片机尝试 本文记录基于 Windows + DAP-Link 开发 STM32F103C8T6 的实践过程,其他操作系统或芯片应该也只是大同小异的问题. 注 ...

  5. 【PHP数据结构】其它排序:简单选择、桶排序

    这是我们算法正式文章系列的最后一篇文章了,关于排序的知识我们学习了很多,包括常见的冒泡和快排,也学习过了不太常见的简单插入和希尔排序.既然今天这是最后一篇文章,也是排序相关的最后一篇,那我们就来轻松一 ...

  6. 使用阿里云CDN后,php使用$_SERVER['HTTP_VIA']判断是否是移动端会出错

    使用阿里云CDN后,php使用$_SERVER['HTTP_VIA']判断是否是移动端会出错 if (isset ($_SERVER['HTTP_VIA'])) return stristr($_SE ...

  7. VMware虚拟机常见问题(针对目前我所学的而言,还会不断更新)

    VMware虚拟机常见问题(针对目前我所学的而言,还会不断更新) 自己电脑的telnet Client是否打开 在控制面板->程序->打开或关闭Windows功能 虚拟机的telnet是否 ...

  8. kubelet源码分析——监控Pod变更

    前言 前文介绍Pod无论是启动时还是关闭时,处理是由kubelet的主循环syncLoop开始执行逻辑,而syncLoop的入参是一条传递变更Pod的通道,显然syncLoop往后的逻辑属于消费者一方 ...

  9. openEuler 20.03/21.03 - 华为欧拉开源版(CentOS 8 华为版开源版)下载

    开始 openEuler 之旅吧 openEuler 通过社区合作,打造创新平台,构建支持多处理架构.统一和开放的操作系统,推动软硬件应用生态繁荣发展. 好玩的活动停不下来 openEuler 社区不 ...

  10. T-SQL——透视PIVOT动态获取待扩展元素集

    目录 0.背景说明 1.准备测试数据 2.示例1--利用SELECT循环赋值 3.示例2--使用游标 4.示例3--使用FOR XML PATH() 5. 参考 志铭-2021年10月8日 00:57 ...