首页 > 其他分享 >#根号分治,分块#洛谷 5309 [Ynoi2011] 初始化

#根号分治,分块#洛谷 5309 [Ynoi2011] 初始化

时间:2024-02-21 19:11:06浏览次数:29  
标签:5309 洛谷 10 int long ans include 161 根号

题目传送门


分析

如果 \(x\) 比较大那么可以暴力修改,\(x\) 比较小的话可以用数组打标记

查询的时候对于暴力修改的部分可以分块,暴力修改的同时需要给块打标记

如果 \(x\) 比较小的情况,一段区间相当于是中间很多段周期加上前后缀(当然可以直接区间减但是我被卡常了)

我调的块长是160然后询问的时候开了long long最后取模,惊险卡过


代码

#include <cstdio>
#include <cctype>
#include <cmath>
#include <algorithm>
using namespace std;
const int N=200011,mod=1000000007;
int n,m,bl,a[N],s[1331],pre[161][161],suf[161][161],pos[N];
int iut(){
    int ans=0; char c=getchar();
    while (!isdigit(c)) c=getchar();
    while (isdigit(c)) ans=ans*10+c-48,c=getchar();
    return ans;
}
void print(int ans){
    if (ans>9) print(ans/10);
    putchar(ans%10+48);
}
void Mo(int &x,int y){x=x+y>=mod?x+y-mod:x+y;}
int query(int x,int y){
    long long ans=0;
    for (int i=1;i<=bl;++i){
        int px=(x-1)/i+1,py=(y-1)/i+1;
        int Px=(x-1)%i+1,Py=(y-1)%i+1;
        if (px==py) ans+=pre[i][Py]-pre[i][Px-1];
            else ans+=((py-px-1ll)*pre[i][i]+suf[i][Px]+pre[i][Py])%mod;
    }
    return (ans%mod+mod)%mod;
}
int main(){
    n=iut(),m=iut(),bl=160;
    for (int i=1;i<=n;++i){
        a[i]=iut();
        if (a[i]==mod) a[i]=0;
        pos[i]=(i-1)/bl+1,Mo(s[pos[i]],a[i]);
    }
    for (int i=1;i<=m;++i)
    if (iut()==1){
        int x=iut(),y=iut(),z=iut();
        if (z==mod) continue;
        if (x>bl) for (int i=y;i<=n;i+=x) Mo(s[pos[i]],z),Mo(a[i],z);
        else{
            for (int i=y;i<=x;++i) Mo(pre[x][i],z);
            for (int i=1;i<=y;++i) Mo(suf[x][i],z);
        }
    }else{
        int l=iut(),r=iut();
        long long ans=query(l,r);
        if (pos[l]==pos[r]){
            for (int j=l;j<=r;++j) ans+=a[j];
        }else{
            for (int j=l;j<=pos[l]*bl;++j) ans+=a[j];
            for (int j=pos[l]+1;j<pos[r];++j) ans+=s[j];
            for (int j=r;j>(pos[r]-1)*bl;--j) ans+=a[j];
        }
        print(ans%mod),putchar(10);
    }
    return 0;
}

标签:5309,洛谷,10,int,long,ans,include,161,根号
From: https://www.cnblogs.com/Spare-No-Effort/p/18026034

相关文章

  • 洛谷P4447题解
    md这篇反正不交题解的,随便写,不管它格式题意简化下,给你N个数,求出连续值分组人数最小的那组的人数最大值。这个题目还挺经典的,原本23年8月份过了到现在来又不会了(划掉,bushi对于这种,很容易想到的是输入,之后排序,然后分组这种模板就不多说了,就在我24年2月份重温这道题再打一遍代码......
  • 洛谷题单指南-递推与递归-P1228 地毯填补问题
    原题链接:https://www.luogu.com.cn/problem/P1228题意解读:用4种毯子铺满2^k*2^k的区域,留出一个公主位置,输出所有毯子拐角的坐标以及哪种毯子,看起来有点无从下手,可以从k=1,k=2,k=3入手去依次考虑,找到规律,用分治法解决。解题思路:1、当k=1时,即2*2的区域,对于任意一个位置是公主,都......
  • 洛谷题单指南-递推与递归-P1010 [NOIP1998 普及组] 幂次方
    原题链接:https://www.luogu.com.cn/problem/P1010题意解读:输出一个正整数的2的幂次方表示,需要用到二进制数学知识,将整数拆解成2的次幂之和,幂次方也要进行拆解,因此容易想到通过递归处理。解题思路:先看样例,给定整数137,要拆解成2的幂次方之和,先考虑i使得刚好137>=2^i时,i取7,因此2......
  • 洛谷P1160
    队列安排题目描述一个学校里老师要将班上\(N\)个同学排成一列,同学被编号为\(1\simN\),他采取如下的方法:先将\(1\)号同学安排进队列,这时队列中只有他一个人;\(2\simN\)号同学依次入列,编号为\(i\)的同学入列方式为:老师指定编号为\(i\)的同学站在编号为\(1\sim(i-......
  • 洛谷P1996
    约瑟夫问题题目描述\(n\)个人围成一圈,从第一个人开始报数,数到\(m\)的人出列,再由下一个人重新从\(1\)开始报数,数到\(m\)的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。注意:本题和《深入浅出-基础篇》上例题的表述稍有不同。书上表述是给出淘汰\(n-1\)......
  • 洛谷题单指南-递推与递归-P1259 黑白棋子的移动
    原题链接:https://www.luogu.com.cn/problem/P1259题意解读:要打印最终的状态,关键在找到一些变化的规律,直接的暴力搜索复杂度太高。解题思路:从样例出发ooooooo*******--oooooo--******o*oooooo******--o*ooooo--*****o*o*ooooo*****--o*o*oooo--****o*o*o*oooo****--o*o*o*ooo--......
  • 【解题报告】【比赛复现】洛谷入门赛 #17 题解
    洛谷入门赛#17题解今日推歌:《春嵐feat.初音ミク》john感觉这首都快成周榜战神了(Before关于我做入门赛的精神状态:没做T4,因为题面读得我头疼……而且大模拟不想做(虽然也不是多大的模拟展开目录目录洛谷入门赛#17题解BeforeA食堂B数学选择题AfterC风球E式神考核Af......
  • 洛谷题单指南-递推与递归-P3612 [USACO17JAN] Secret Cow Code S
    原题链接:https://www.luogu.com.cn/problem/P3612题意解读:字符串加长的时候,是先把最后一个字符接上,再拼接其余字符,注意不是翻转,要找第n个字符,就要看字符串加长几次后长度能超过n,然后在加长后的字符串中找第n个字符。解题思路:如果直接通过模拟法,字符串长度太长,且要找的第n个数......
  • 洛谷P10179 题解
    题意简述给定\(n\)个点,要求构造出一棵树,同时有\(m\)个事件,第\(i\)个事件要求\(u_i\)和\(v_i\)用两条树边连接,即当中相隔一个点。若存在构造方案,输出Yes并输出其中一种方案,否则输出No。思维路径首先简化问题,假如我们想让一堆点互相相隔一个点,我们的做法。考虑菊花......
  • 洛谷-P3380/LibreOJ-106/BZOJ-3196题解
    题意简述给定一个数列,支持以下操作:查询\(k\)在区间内的排名(区间内比\(k\)小的数的个数\(+1\))查询区间内排名为\(k\)的值修改某一位值上的数值查询\(k\)在区间内的前驱(前驱定义为严格小于\(k\),且最大的数,若不存在输出-2147483647)查询\(k\)在区间内的......