题解 P7809【[JRKSJ R2] 01 序列】

Link

算法 1

针对 Subtask 1

显然对于询问 1,答案为 rl+1,对于询问 2,答案为 1

时间复杂度 O(n+m)。期望得分 5pts

算法 2

暴力求区间最长不降/上升子序列,时间复杂度 O(mn2)。期望得分 10pts,结合算法 1 可得 15pts

算法 3

prex,i=j=1i[ai=x],(0x11in)。

第一问:

其实本质是求 maxi=lrpre0,ipre0,l1+pre1,rpre1,i

怎么理解这个柿子呢?显然 pre 是前缀和的形式,所以 pre0,ipre0,l1j=li[ai=0]pre1,rpre1,ij=i+1r[ai=1]。我们可以理解 i 为分界线,分界线前选 0,分界线后选 1,枚举所有 lir,显然可以取到最大值,时间复杂度 O(mn)

还需要特判只选 1 的情况,当然你也可以看为求 maxi=l1rpre0,ipre0,l1+pre1,rpre1,i

第二问:

显然有答案为 12,答案为 2 时只有在有 0 在最后一个 1 前面,否则为 1

于是我们考虑维护 befiai=1i 前最后一个 0 所在的位置,否则为 0

答案显然为 1+[(maxi=lrbefi)l],暴力枚举,时间复杂度 O(mn)

总时间复杂度 O(mn)。期望得分 25pts

算法 4

上面那个东西可以套路ST表处理,时间复杂度 O(nlogn+m),期望得分 100pts

当然开 2 个ST表常数较大。

+1-1RMQ 可以做到严格 O(n+m),常数较大,不做为本题最优做法。

这里还有一个后来发现的一个减小常数方法:

发现第二问只有 12 两种答案,要有 2 则区间中必须出现连续的 01,于是我们维护 01 出现次数的前缀和,如果左端点前缀和等于右端点前缀和,则答案为 1,否则为 2。可以大大减小常数,如果实现优秀,则可以所有点进 1s。

#include<bits/stdc++.h>
using namespace std;
namespace IO{//by cyffff

}
const int N=1e6+10;
int n,m,st[20][N],lg[N],a[N],pre[N],pp[N];
inline int query(int l,int r){
    int q=lg[r-l+1];
    return max(st[q][l],st[q][r-(1<<q)+1]);
}
int main(){
    n=read(),m=read();
    for(int i=1;i<=n;i++){
        a[i]=read();
    }
    a[0]=2;
    int sum=0,o=0,z=0;
    for(int i=1;i<=n;i++){
        if(a[i]) sum--,o++;
        else sum++,z++;
        st[0][i]=z-o;
        pp[i]=o;
        pre[i]=pre[i-1]+(a[i]==1&&a[i-1]==0);
    }
    for(int i=2;i<=n;i++)
        lg[i]=lg[i>>1]+1;
    for(int i=1;i<=19;i++)
        for(int j=1;j+(1<<i)-1<=n;j++)
            st[i][j]=max(st[i-1][j],st[i-1][j+(1<<i-1)]);
    for(int i=1;i<=m;i++){
        int opt=read(),l=read(),r=read();
        if(opt==1)
            write(max(pp[r]-pp[l-1],query(l,r)-(l-1-pp[l-1])+pp[r]));
        else
            write(1+!(pre[l]==pre[r]));
        putc('\n');
    }
    flush();
    return 0;
}

再见 qwq~

upd:好像赛时还被线段树过了,考虑加入主题库后缩小时限。

posted @   ffffyc  阅读(43)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示