之江学院第0届校赛 Problem I: qwb VS 去污棒(可持久化01字典树)

本文介绍了一道关于序列操作的问题,涉及序列的异或运算、查询最大值等操作,并给出了解决方案。采用可持久01字典树来维护前缀,通过样例输入输出展示了解题过程。

Problem I: qwb VS 去污棒
Time Limit: 2 Sec Memory Limit: 256 MB
Submit: 84 Solved: 28
[Submit][Status][Web Board]
Description
qwb表白学姐失败后,郁郁寡欢,整天坐在太阳底下赏月。在外人看来,他每天自言自语,其实他在和自己的影子“去污棒”聊天。
去污棒和qwb互相出题考验对方,去污棒问了qwb这样一个问题:
现已知一个有n个正整数的序列a[1],a[2]…a[n],接下来有m个操作
操作一共有两种:

1.在序列末尾添加一个数x。

2.查询suf[p] xor x的最大值,其中xor是异或 ,l<=p<=r,
suf[t]表示从t开始的后缀的异或和,即suf[t]=a[t] xor a[t+1] xor …xor a[len],len为序列长度。

Input
第一行一个整数T(<=5),表示一共有T组数据。

每组数据第一行两个整数n(<=200000),m(<=200000),意义如上所述。

随后一行有n个数,表示初始序列。
随后m行,每行表示一个操作。
操作有两种,1: x 表示在末尾添加一个x,2: l r x表示查询suf[p] xor x的最大值,其中l<= p <= r,
所有数及x不超过224 且保证所有操作合法。
Output
每组测试数据的第一行输出”Case x:”,x为数据组数的标号,从1开始。

接下来,对每个操作2输出一行答案。

Sample Input
1
5 5
1 2 3 4 5
2 1 3 4
1 10
1 7
2 4 4 5
2 1 5 19
Sample Output
Case 1:
6
9
31
题解:
ans=suf[p]^x, suf[p]=sum(异或和)^pre[p-1](前缀异或和)。
则 ans=sum^pre[p-1]^x;
所以我们通过可持久01字典树维护前缀即可。
代码:

#include <bits/stdc++.h>
typedef long long int LL;
using namespace std;

#define abs(x) (((x)>0)?(x):-(x))

const int N = 400000+10;
const int MOD  = 1e8;

int read(){
    int x=0;char ch = getchar();
    while('0'>ch||ch>'9')ch=getchar();
    while('0'<=ch&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return x;
}

/**********************************/

int trie[N*40][2],sz[N*40],rt[N];
int n,m,cnt,sum;
char s[10];

int update(int pre,int i,int x){
    int now=++cnt;
    if(0==i){
        trie[now][0]=trie[now][1]=0;
        sz[now]=sz[pre]+1;
        return now;
    }
    int bt=((x>>(i-1))&1);
    trie[now][1-bt]=trie[pre][1-bt];
    trie[now][bt]=update(trie[pre][bt],i-1,x);
    sz[now]=sz[trie[now][0]]+sz[trie[now][1]];
    return now;
}

int query(int rt1,int rt2,int i,int x){
    if (i==0) return 0;
    int bt=((x>>(i-1))&1);
    if (sz[trie[rt2][1-bt]]-sz[trie[rt1][1-bt]])
        return (1<<(i-1))+query(trie[rt1][1-bt],trie[rt2][1-bt],i-1,x);
    else
        return query(trie[rt1][bt],trie[rt2][bt],i-1,x);
}

int main(){
    int _=read(),kcase=0;
    while(_--){
        n=read(),m=read();
        rt[0]=trie[0][0]=trie[0][1]=sz[0]=sum=0;
        rt[0]=update(rt[0],25,0);
        for (int i=1;i<=n;i++){
            sum^=read();
            rt[i]=update(rt[i-1],25,sum);
        }

        printf("Case %d:\n",++kcase);
        while (m--){
            int l,r;
            scanf("%s",s+1);
            if (s[1]=='1'){
                sum^=read();
                n++;rt[n]=update(rt[n-1],25,sum);
            }
            else{
                l=read()-1,r=read()-1;
                printf("%d\n",query(rt[l-1],rt[r],25,sum^read()));
            }
        }
    }
    return 0;
}
内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值