这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录 前一修订版 | |||
|
2020-2021:teams:wangzai_milk:codeforces_round_654_div._2_zars19 [2020/07/17 22:02] zars19 |
2020-2021:teams:wangzai_milk:codeforces_round_654_div._2_zars19 [2020/07/18 01:30] (当前版本) zars19 |
||
|---|---|---|---|
| 行 173: | 行 173: | ||
| for(int i=st;i<res;i++)printf("%d ",i); | for(int i=st;i<res;i++)printf("%d ",i); | ||
| puts(""); | puts(""); | ||
| + | return 0; | ||
| + | } | ||
| + | </code></hidden> | ||
| + | \\ | ||
| + | |||
| + | ====== F. Raging Thunder ====== | ||
| + | |||
| + | 认真读题之后发现其实是给出一个左右串,每次反转(左变右右变左)一个区间查询> > > < < < < <形状最长长度。 | ||
| + | |||
| + | 很明显线段树+lazy tag,维护> > < <形状最长长度、< < < > >形状最长长度、左右两边的两种形状长度、左右两边<和>的长度。 | ||
| + | |||
| + | <hidden><code cpp> | ||
| + | #include<bits/stdc++.h> | ||
| + | #define ll long long | ||
| + | using namespace std; | ||
| + | const int N=5e5+10; | ||
| + | char s[N]; | ||
| + | struct Node | ||
| + | { | ||
| + | int lR,lL,rL,rR,maxn,tmaxn,lz,sz,lmaxn,rmaxn,ltmaxn,rtmaxn; | ||
| + | }t[N*4]; | ||
| + | Node combine(Node a,Node b) | ||
| + | { | ||
| + | Node x; | ||
| + | x.lR=a.lR; | ||
| + | if(x.lR==a.sz)x.lR+=b.lR; | ||
| + | x.lL=a.lL; | ||
| + | if(x.lL==a.sz)x.lL+=b.lL; | ||
| + | x.rR=b.rR; | ||
| + | if(x.rR==b.sz)x.rR+=a.rR; | ||
| + | x.rL=b.rL; | ||
| + | if(x.rL==b.sz)x.rL+=a.rL; | ||
| + | x.maxn=max(max(a.maxn,b.maxn),max(a.rmaxn+b.lL,a.rR+b.lmaxn)); | ||
| + | x.tmaxn=max(max(a.tmaxn,b.tmaxn),max(a.rtmaxn+b.lR,a.rL+b.ltmaxn)); | ||
| + | x.lmaxn=a.lmaxn; | ||
| + | if(x.lmaxn==a.sz)x.lmaxn+=b.lL; | ||
| + | if(a.lR==a.sz)x.lmaxn=max(x.lmaxn,a.sz+b.lmaxn); | ||
| + | x.ltmaxn=a.ltmaxn; | ||
| + | if(x.ltmaxn==a.sz)x.ltmaxn+=b.lR; | ||
| + | if(a.lL==a.sz)x.ltmaxn=max(x.ltmaxn,a.sz+b.ltmaxn); | ||
| + | x.rmaxn=b.rmaxn; | ||
| + | if(x.rmaxn==b.sz)x.rmaxn+=a.rR; | ||
| + | if(b.rL==b.sz)x.rmaxn=max(x.rmaxn,b.sz+a.rmaxn); | ||
| + | x.rtmaxn=b.rtmaxn; | ||
| + | if(x.rtmaxn==b.sz)x.rtmaxn+=a.rL; | ||
| + | if(b.rR==b.sz)x.rtmaxn=max(x.rtmaxn,b.sz+a.rtmaxn); | ||
| + | x.sz=a.sz+b.sz,x.lz=0; | ||
| + | return x; | ||
| + | } | ||
| + | void build(int idx,int l,int r) | ||
| + | { | ||
| + | if(l==r) | ||
| + | { | ||
| + | t[idx].rR=t[idx].lR=(s[l]=='>'); | ||
| + | t[idx].rL=t[idx].lL=(s[l]=='<'); | ||
| + | t[idx].maxn=t[idx].tmaxn=t[idx].lmaxn=t[idx].rmaxn=t[idx].ltmaxn=t[idx].rtmaxn=1; | ||
| + | t[idx].sz=1,t[idx].lz=0; | ||
| + | return; | ||
| + | } | ||
| + | int mid=(l+r)>>1; | ||
| + | build(idx<<1,l,mid),build(idx<<1|1,mid+1,r); | ||
| + | t[idx]=combine(t[idx<<1],t[idx<<1|1]); | ||
| + | } | ||
| + | void rev(int idx) | ||
| + | { | ||
| + | t[idx].lz^=1; | ||
| + | swap(t[idx].lL,t[idx].lR),swap(t[idx].rR,t[idx].rL),swap(t[idx].maxn,t[idx].tmaxn); | ||
| + | swap(t[idx].lmaxn,t[idx].ltmaxn),swap(t[idx].rmaxn,t[idx].rtmaxn); | ||
| + | } | ||
| + | void pushdown(int idx) | ||
| + | { | ||
| + | if(!t[idx].lz)return; | ||
| + | t[idx].lz=0,rev(idx<<1),rev(idx<<1|1); | ||
| + | } | ||
| + | void change(int idx,int l,int r,int a,int b) | ||
| + | { | ||
| + | if(a<=l&&b>=r){rev(idx);return;} | ||
| + | pushdown(idx); | ||
| + | int mid=(l+r)>>1; | ||
| + | if(b<=mid)change(idx<<1,l,mid,a,b); | ||
| + | else if(a>mid)change(idx<<1|1,mid+1,r,a,b); | ||
| + | else change(idx<<1,l,mid,a,b),change(idx<<1|1,mid+1,r,a,b); | ||
| + | t[idx]=combine(t[idx<<1],t[idx<<1|1]); | ||
| + | } | ||
| + | Node query(int idx,int l,int r,int a,int b) | ||
| + | { | ||
| + | if(a<=l&&b>=r)return t[idx]; | ||
| + | pushdown(idx); | ||
| + | int mid=(l+r)>>1; | ||
| + | if(b<=mid)return query(idx<<1,l,mid,a,b); | ||
| + | else if(a>mid)return query(idx<<1|1,mid+1,r,a,b); | ||
| + | else return combine(query(idx<<1,l,mid,a,b),query(idx<<1|1,mid+1,r,a,b)); | ||
| + | } | ||
| + | int main() | ||
| + | { | ||
| + | int n,q; | ||
| + | scanf("%d%d%s",&n,&q,s+1); | ||
| + | build(1,1,n); | ||
| + | for(int i=1;i<=q;i++) | ||
| + | { | ||
| + | int l,r; | ||
| + | scanf("%d%d",&l,&r); | ||
| + | change(1,1,n,l,r); | ||
| + | printf("%d\n",query(1,1,n,l,r).maxn); | ||
| + | } | ||
| return 0; | return 0; | ||
| } | } | ||
| </code></hidden> | </code></hidden> | ||
| \\ | \\ | ||