首页 > 其他分享 >#线段树#CF1371F Raging Thunder

#线段树#CF1371F Raging Thunder

时间:2024-06-05 17:15:32浏览次数:22  
标签:CF1371F rr Raging Thunder ll mid lr max rl

洛谷传送门
CF1371F


分析

其实掉出区间边界或洞内就算消失,最终球只会掉到最左侧的 <,中间的 ><,和最右侧的 >

在线段树上维护左右边界上最长的<,>,<>,><和区间内最长的<>,><即可


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
const int N=500011; int a[N],n,Q,lazy[N<<2];
struct rec{int ll,lr,rl,rr,llr,lrl,rlr,rrl,lrw,rlw;}w[N<<2];
int iut(){
    int ans=0,f=1; char c=getchar();
    while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
    while (isdigit(c)) ans=ans*10+c-48,c=getchar();
    return ans*f;
}
void print(int ans){
    if (ans>9) print(ans/10);
    putchar(ans%10+48);
}
void ptag(int k){
    swap(w[k].ll,w[k].lr);
    swap(w[k].rl,w[k].rr);
    swap(w[k].rlw,w[k].lrw);
    swap(w[k].llr,w[k].lrl);
    swap(w[k].rlr,w[k].rrl);
    lazy[k]^=1;
}
rec pup(rec A,rec B,int l,int mid,int r){
    rec C;
    C.rlw=max(A.rlw,B.rlw);
	if (A.rr&&B.ll) C.rlw=max(C.rlw,A.rr+B.ll);
	if (A.rrl) C.rlw=max(C.rlw,A.rrl+B.ll);
	if (B.lrl) C.rlw=max(C.rlw,B.lrl+A.rr);
	C.lrw=max(A.lrw,B.lrw);
	if (A.rl&&B.lr) C.lrw=max(C.lrw,A.rl+B.lr);
	if (A.rlr) C.lrw=max(C.lrw,A.rlr+B.lr);
	if (B.llr) C.lrw=max(C.lrw,B.llr+A.rl);
    if (A.lr==mid-l+1) C.lr=A.lr+B.lr;
        else C.lr=A.lr;
    if (A.ll==mid-l+1) C.ll=A.ll+B.ll;
        else C.ll=A.ll;
    if (B.rr==r-mid) C.rr=B.rr+A.rr;
        else C.rr=B.rr;
    if (B.rl==r-mid) C.rl=B.rl+A.rl;
        else C.rl=B.rl;
    if (A.llr==mid-l+1) C.llr=A.llr+B.lr;
        else if (A.ll==mid-l+1&&max(B.lr,B.llr)) C.llr=A.ll+max(B.lr,B.llr);
            else C.llr=A.llr;
    if (A.lrl==mid-l+1) C.lrl=A.lrl+B.ll;
        else if (A.lr==mid-l+1&&max(B.ll,B.lrl)) C.lrl=A.lr+max(B.ll,B.lrl);
            else C.lrl=A.lrl;
    if (B.rlr==r-mid) C.rlr=B.rlr+A.rl;
        else if (B.rr==r-mid&&max(A.rl,A.rlr)) C.rlr=B.rr+max(A.rl,A.rlr);
            else C.rlr=B.rlr;
    if (B.rrl==r-mid) C.rrl=B.rrl+A.rr;
        else if (B.rl==r-mid&&max(A.rr,A.rrl)) C.rrl=B.rl+max(A.rr,A.rrl);
            else C.rrl=B.rrl;
    return C;
}
void build(int k,int l,int r){
    if (l==r){
        if (a[l]) w[k].lr=w[k].rr=1;
            else w[k].ll=w[k].rl=1;
        return;
    }
    int mid=(l+r)>>1;
    build(k<<1,l,mid);
    build(k<<1|1,mid+1,r);
    w[k]=pup(w[k<<1],w[k<<1|1],l,mid,r);
}
void update(int k,int l,int r,int x,int y){
    if (l==x&&r==y) {ptag(k); return;}
    int mid=(l+r)>>1;
    if (lazy[k]) ptag(k<<1),ptag(k<<1|1),lazy[k]=0;
    if (y<=mid) update(k<<1,l,mid,x,y);
    else if (x>mid) update(k<<1|1,mid+1,r,x,y);
        else update(k<<1,l,mid,x,mid),update(k<<1|1,mid+1,r,mid+1,y);
    w[k]=pup(w[k<<1],w[k<<1|1],l,mid,r);
}
rec query(int k,int l,int r,int x,int y){
    if (l==x&&r==y) return w[k];
    int mid=(l+r)>>1;
    if (lazy[k]) ptag(k<<1),ptag(k<<1|1),lazy[k]=0;
    if (y<=mid) return query(k<<1,l,mid,x,y);
    else if (x>mid) return query(k<<1|1,mid+1,r,x,y);
        else return pup(query(k<<1,l,mid,x,mid),query(k<<1|1,mid+1,r,mid+1,y),x,mid,y);
}
int main(){
    n=iut(),Q=iut();
    for (int i=1;i<=n;++i){
        char ch=getchar();
        while (ch!='<'&&ch!='>') ch=getchar();
        if (ch=='>') a[i]=1;
    }
    build(1,1,n);
    for (int i=1;i<=Q;++i){
        int l=iut(),r=iut();
        update(1,1,n,l,r);
        rec t=query(1,1,n,l,r);
        print(max(t.rlw,max(t.ll,t.rr))),putchar(10);
    }
    return 0;
}

标签:CF1371F,rr,Raging,Thunder,ll,mid,lr,max,rl
From: https://www.cnblogs.com/Spare-No-Effort/p/18233361

相关文章

  • 各版本USB接口和雷电(Thunderbolt)接口的速度
    USB1.0分为两个版本:USB1.0LowSpeed 理论最高速率为1.5Mbit/s(0.1875MBytes/s)USB1.0FullSpeed 理论最高速率为12Mbit/s(1.5MBytes/s) USB1.1(即USB1.0FullSpeed)理论最高速率为12Mbit/s(1.5MBytes/s) USB2.0分为两个版本:USB2.0FullSpeed(即USB1.1)理论最高......
  • Thunderbolt 3 PCIe Expansion 扩展卡
    计算机目前大部分都能够提供Thunderbolt3接口了。Thunderbolt3的传输速度更快,所以我们需要把Thunderbolt3转换为SASHBA,但市场上没有这个转换设备。后来我们发现有Thunderbolt3PCIeExpansion,就是通过这个设备把Thunderbolt3转换为PCIe卡槽,然后再插上SASHBA卡,......
  • Thunderbolt 3 PCIe Expansion 扩展卡
    计算机目前大部分都能够提供Thunderbolt3接口了。Thunderbolt3的传输速度更快,所以我们需要把Thunderbolt3转换为SASHBA,但市场上没有这个转换设备。后来我们发现有Thunderbolt3PCIeExpansion,就是通过这个设备把Thunderbolt3转换为PCIe卡槽,然后再插上SASHBA......
  • 关闭Thunderbird的自动换行
    参考https://blog.csdn.net/cuma2369/article/details/107667731https://support.mozilla.org/en-US/questions/1307935点击设置->配置编辑器:然后搜索mailnews.wraplength,把值修改为0:......
  • Mozilla Thunderbird如何设置开启密码
    很多人都使用MozillaThunderbird,包括我在内。邮件客户端的好处是,可以高效快捷的收取邮件和进行分类。但是如果开机后就直接能够浏览邮件的话,安全性方面会比较差。如果每次打开前需要密码验证的话,会好一点。还好MozillaThunderbird的插件StartupMaster提供了这样的功能。具体:菜......
  • thunderBird如何选择配置文件
    有时候,thunderBird会出现配置文件太老的提示,然后就不能用了,让你重新配置,这可烦死了。其实配置文件信息还在的,只是需要重新配置,选择配置文件。 只要在windows命令行下,找到thunderBird的安装位置,Programfiles(x86),然后运行命令:thunderBird.exe-ProfileManager然后会跳出一......
  • Ubuntu终端(terminal)及Thunderbird邮件客户端常用的快捷键
    Ubuntu终端常用的快捷键Ubuntu中的许多操作在终端(Terminal)中十分的快捷,记住一些快捷键的操作更得心应手。在Ubuntu中打开终端的快捷键是Ctrl+Alt+T。其他的一些常用的快捷键如下:快捷键功能Tab自动补全Ctrl+a光标移动到开始位置Ctrl+e光标移动到最末尾Ctrl+k删除此处至末尾的所有......
  • 信息搜寻理论-Information Foraging in Information Access Environments
    信息搜寻环境中的信息搜寻P.Pirolli和S.K.CardPeterPirolli,StuartK.Card(1995).InformationForaginginInformationAccessEnvironments.Conference:HumanFactorsinComputingSystems,CHI'95ConferenceProceedings,Denver,Colorado,USA,May7-11,1995摘要......
  • Thunderbird 102修改文字编码
    日期:2023.3.3Thunderbird版本:102.8.0(本文可靠性待验证)最近有同事收我邮件附件显示乱码,基本上确定是文字编码问题,但是Windows新版Thunderbird好像没有修改的地方:进入设置,找到......
  • 虹科方案|将ESXi与适用于Mac的ATTO ThunderLink 适配器启用的Thunderbolt综合使用
    一、引言VMwarevSphere™ESXi5.1将AppleMacPro®引入了VMware硬件认证列表(HCL)。下一代AppleMacPro硬件的更新带来了Thunderbolt技术的引入。随着Apple使用Thunder......