11/13周总结

本周博主深入学习了莫队算法,通过Codeforces上的题目实践了结合线段树的莫队解决方案,同时探讨了如何在复杂题目中结合树状数组和二分查找。此外,还提到了莫队算法的优化技巧,尽管存在一定的困难和挑战,但通过不断的学习和练习,博主期待在未来的考试中能够更好地应用这些知识。
摘要由CSDN通过智能技术生成

这周继续学习莫队相关的算法,相比于上周,这周比较多的时间都在看一些综合性的题目和代码然后在开始几天写了几道比较基础的题目,看博客从Codeforces上面之路了一些莫队的题目,(Codeforces 633H Fibonacci-ish II)比如这道就利用了线段树和莫队:

给出一个长度为n的数列a。对于一个询问lj和rj,将a[lj]到a[rj]从小到大排序后并去重,设得到的新数列为b,长度为k,求F1*b1+F2*b2+F3*b3+...+Fk*bk,其中F为斐波那契数列,F1=F2=1。对每个询问输出答案模m。

这道题出题人给的标答是用莫队做的(但是还是暴力比较适合我:)贴个暴力,莫队方法再编译。。。

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5+7;

pair<int,int> a[maxn];

int ans[maxn],step[maxn],f[maxn],l[maxn],r[maxn],last[maxn];
 
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        {cin>>a[i].first;
        a[i].second=i;
        }
    sort(a+1,a+1+n);
    f[0]=1,f[1]=1;
    for(int i=2;i<=n;i++)
        f[i]=(f[i-1]+f[i-2])%m;
    int q;
    cin>>q;
    for(int i=1;i<=q;i++)
    {
        cin>>l[i]>>r[i];
        last[i]=-1;
    }
    for(int i=1;i<=n;i++)
    {
        int d = a[i].first % m;
        for(int j=1;j<=q;j++)
        {
            if(a[i].second<l[j]||a[i].second>r[j])continue;
            if(a[i].first==last[j])continue;
            ans[j]=(ans[j]+f[step[j]++]*d)%m;
            last[j]=a[i].first;
        }
    }
    for(int i=1;i<=q;i++)
        cout<<ans[i]<<endl;
}

然后综合题目的话也遇到比较好的题目,它就综合了最近学的很多内容,莫队、树状数组和二分查找都有涉及,大致就是在一个长度为n的序列a中,有m次询问,每次求(l,r)区间内最大的h,使得至少h个数的值都大于等于h。 做这个题其实我几乎完全是看着标答写完,过程中其实莫队部分建树分块都是模版,然后树状数组转化,一方面很难想到,二方面代码量很长,感觉现在的水平真到考试中估计也就能写板子题。

另外在上篇博客里有写关于莫队的优化,毕竟是大数暴力的算法,优化还是蛮重要,但是优化的方法基本都沾点玄学。。

在看博客的过程中有非常多的莫队都与树状数组紧密相连([AHOI2013]作业 - 洛谷​​​​​​​)另外就是继续学习了二次离线的莫队(luoguP5047 ),在碰到一些问题的时候如果只用莫队的话每次查询移动的话就会让时间复杂度变得很大,但是先利用树状数组前缀和进行计算,将每一个区间都保存在前缀和上,在后续处理的时候直接处理前缀和和后面坠的一段区间,将时间复杂度降低。其实二次离线现在也不是很明白,大致操作思路是懂的,洛谷的题解中的代码写的比较详细,

莫队和其他知识杂糅在一起的题目对我来说是难度非常大的。。这周学习的东西不是很多,忙了点其他的事情,下周就开始线下了,网课期间的状态还是有点慵懒的,码量和之前线下的时候差了很多。下周继续把莫队看完,主席树也开始看了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值