首页 > 其他分享 >[Ynoi2011] 初始化

[Ynoi2011] 初始化

时间:2024-08-24 18:48:21浏览次数:12  
标签:pre 初始化 int Ynoi2011 res using mod Mod

题目链接 : [Ynoi2011] 初始化

神仙trick + 卡常题,前缀后缀和根本没听过。

根号分治 + 分块。

对于修改操作,发现是跳着修改,考虑根号分治。

  1. 若\(x \ge \sqrt{n}\),直接暴力更改,复杂度\(O(\sqrt{n})\)。
  2. 反之,可以将序列抽象成一堆大小为\(x\)的段,如图,\(l,r\)是查询的区间。

image

发现\(l\sim r\)中间的整块一定都会被修改到,但是散块会被部分修改。由于题面中有一个重要的性质\(y\le x\),所以\(y\)一定在第一块中。

记两个数组\(pre_{i,j}\)表示记录当以\(i\)为块长分割序列时,前\(j\)个位置被更改的前缀和,\(suf_{i,j}\)为后缀和。

对于一个查询\(l,r\),如果是整块,直接前缀和求差,如果不在同一块,那么直接求\(l\)到其所在块末的后缀和,\(r\)到其所在块的前缀和,还有中间整块的贡献。

由于常数原因,\(x\)的阈值不应设太大,实测大约120左右跑的最快,序列分块时的块长取\(\sqrt{n}\)即可。

本题并不卡常,cin/cout关了同步流就可过。

点此查看代码
#include<bits/stdc++.h>
#include<bits/extc++.h>
// using namespace __gnu_pbds;
// using namespace __gnu_cxx;
using namespace std;
#define infile(x) freopen(x,"r",stdin)
#define outfile(x) freopen(x,"w",stdout)
#define errfile(x) freopen(x,"w",stderr)
using ll=long long;using ull=unsigned long long;
using db = double;using ldb = long double;

const int N = 2e5 + 10,M = 500,mod = 1e9 + 7;
inline void Mod(int &x){if(x > mod) x -= mod;}
int n,m,a[N],len,pos[N],L[M],R[M],sum[M],limit,pre[M][M],suf[M][M],siz;
inline void solve(){
    cin>>n>>m;
    for(int i = 1;i <= n; ++i) cin>>a[i];

    limit = 128;
    len = sqrt(n),siz = n/len;
    for(int i = 1;i <= siz; ++i) L[i] = R[i - 1] + 1,R[i] = L[i] + len - 1;
    if(R[siz] < n) siz++,L[siz] = R[siz - 1] + 1,R[siz] = n;
    for(int i = 1;i <= siz; ++i){
        for(int j = L[i];j <= R[i]; ++j){
            pos[j] = i;
            Mod((sum[i] += a[j]));
        }
    }

    auto update1 = [&](int x,int y,int z)-> void{
        for(int i = y;i <= n;i += x){
            Mod(a[i] += z);
            Mod(sum[pos[i]] += z);
        }
    };
    auto update2 = [&](int x,int y,int z) -> void{
        for(int i = x;i >= y; --i) Mod(pre[x][i] += z);
        for(int i = 1;i <= y; ++i) Mod(suf[x][i] += z);
    };
    auto Q = [&](int left,int right) -> int{
        int p = pos[left],q = pos[right],res = 0;
        if(p == q){
            for(int i = left;i <= right; ++i) Mod(res += a[i]);
            return res;
        }
        for(int i = left;i <= R[p]; ++i) Mod(res += a[i]);
        for(int i = L[q];i <= right; ++i) Mod(res += a[i]);
        for(int i = p + 1;i < q; ++i) Mod(res += sum[i]);
        return res;
    };
    auto query = [&](int left,int right) -> int{
        int res = Q(left,right);
        for(int i = 1;i < limit; ++i){
            const int p = (left - 1)/i+1,q = (right-1)/i+1;
            if(p == q){
                Mod(res += pre[i][(right-1)%i+1]);
                Mod((res -= pre[i][(left-1)%i]) += mod);
            }
            else{
                res = (res + (q - p - 1ll)*pre[i][i]%mod)%mod;
                Mod(res += pre[i][(right-1)%i+1]);
                Mod(res += suf[i][(left-1)%i+1]);
            }
        }
        return res;
    };

    for(int i = 1,op,l,r,x,y,z;i <= m; ++i){
        cin>>op;
        if(op^2){
            cin>>x>>y>>z;Mod(z);
            if(x >= limit) update1(x,y,z);
            else update2(x,y,z);
        }
        else{
            cin>>l>>r;
            cout<<query(l,r)<<'\n';
        }
    }
}
signed main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cout.tie(nullptr)->sync_with_stdio(false);
    solve();
}

标签:pre,初始化,int,Ynoi2011,res,using,mod,Mod
From: https://www.cnblogs.com/hzoi-Cu/p/18378087

相关文章

  • KingbaseES V8R6备份恢复案例之---sys_backup.conf配置异常初始化失败
    案例说明:KingbaseESV8R6数据库执行sys_backup.shinit初始化时,出现“ERROR:cannotconnecttheprimarynode...."错误,初始化失败。适用版本:KingbaseESV8R6一、问题现象如下所示,执行sys_backup.shinit时,出现以下错误”ERROR:cannotconnecttheprimarynode..."。[......
  • Java数组02:数组内存分析、三种初始化方式及特点
    本节内容视频链接:Java数组03:三种初始化及内存分析_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p=53&vd_source=b5775c3a4ea16a5306db9c7c1c1486b51.数组内存分析堆:存放new的对象和数组;可以被所有线程共享,不会存放别的对象引用;栈:存放基本变量类型,会包含......
  • C++ 各种初始化方法总结
    在各种编程语言中,初始化都是非常重要的步骤,用于确保对象在使用前具有确定的初始状态。C++提供了多种初始化方法,每种方法都有其特定的使用场景和注意事项。以下是一些主要的初始化方法及其注意事项:默认初始化(Default-initialization):形如Tobj、newT等方式的初始化,其中T为类......
  • 手动实现 Spring 底层机制【初始化 IOC容器+依赖注入+BeanPostProcessor 机制+AOP】【
    手动实现Spring底层机制【初始化IOC容器+依赖注入+BeanPostProcessor机制+AOP】【任务1-6整合版】引言:Spring框架的ioc容器、依赖注入、BeanPostProcessor后置处理器、AOP面向切面编程等特点为我们的开发带来了极大的便利,但是我们不能只学其中的api,更要懂得Spring的底......
  • vue3在tsx 中使用ElLoading 无效 ,初始化eltable 样式加载丢失
    在plugins目录下创建elementPlus/index.tsimporttype{App}from"vue";//需要全局引入一些组件,如ElScrollbar,不然一些下拉项样式有问题import{ElLoading,ElScrollbar}from"element-plus";constplugins=[ElLoading];constcomponents=[ElScrollbar];e......
  • C安全编程教学-声明和初始化-声明具有正确存储持续期的对象(三)
    注:本课程参考文献《C安全编码标准》 欢迎关注我......
  • 1.Controller的初始化
    controller接口逻辑图实验拓扑:sw3560:iproutingvlan2namecontrollervlan3nameacsvlan4nameapintg0/24swaccvlan4intg0/22swaccvlan3spanning-treeportfastintg0/23swtrunkendot1qswmodetrunkintvlan2ipadd10.1.2.254255.255.255.......
  • 使用 onNuxtReady 进行异步初始化
    title:使用onNuxtReady进行异步初始化date:2024/8/16updated:2024/8/16author:cmdragonexcerpt:摘要:本文详细介绍了Nuxt.js框架中的onNuxtReady函数用途、使用场景及其实现步骤,并通过集成分析库的示例代码,指导开发者如何在应用初始化完成后执行异步操作,以优化用户体......
  • Efficient DETR:别再随机初始化了,旷视提出单解码层的高效DETR | CVPR 2021
    EfficientDETR结合密集检测和稀疏集合检测的优点,利用密集先验来初始化对象容器,弥补单层解码器结构与6层解码器结构的差距。在MSCOCO上进行的实验表明,仅3个编码器层和1个解码器层即可实现与最先进的目标检测方法竞争的性能,在CrowdHuman密集数据集上的性能也远远优于其它检......
  • limu|P10-14|多层感知机、激活函数、模型选择、欠拟合、过拟合、权重衰减、dropout、
    从感知机到多层感知机:感知机:只能产生线性分割面,不能拟合XOR为突破线性模型的限制,可以通过在网络中加入一个/多个隐藏层,即多层感知机MLP。但是如果只是单纯添加隐藏层,还是等价于一个线性模型(仿射变换的仿射变换还是仿射变换),没有带来益处!此时,需要加入额外因素以激发多层架构的潜......