首页 > 其他分享 >2024/4/4 分块补题

2024/4/4 分块补题

时间:2024-04-04 21:45:42浏览次数:28  
标签:ch 分块 int else 2024 read while maxn 补题

2024/4/4 分块补题

P3203 [HNOI2010] 弹飞绵羊

分块跳跳跳,核心是每次跳出当前块,用 \(to[i]\) 表示跳到的位置。

#include <bits/stdc++.h>
using namespace std;
#define ld long double
template <typename T>
inline T read(){
    T x=0;char ch=getchar();bool fl=false;
    while(!isdigit(ch)){if(ch=='-')fl=true;ch=getchar();}
    while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return fl?-x:x;
}
#define read() read<int>()
const int maxn = 2e5 + 10;
int be[maxn],L[maxn],R[maxn],cnt,B;
int n,m,a[maxn];
int to[maxn],f[maxn];
inline int query(int x){
    int res=0;
    while(x<=n){
        res+=f[x];x=to[x];
    }
    return res;
}
int main(){
    n=read();B=sqrt(n);
    for(int i=1;i<=n;i++){
        a[i]=read();
        be[i]=(i-1)/B+1;
        if(!L[be[i]])L[be[i]]=i,cnt++;
        R[be[i]]=i;
    }
    for(int i=n;i>=1;i--){
        if(i+a[i]>R[be[i]]){
            to[i]=i+a[i];
            f[i]=1;
        }
        else to[i]=to[i+a[i]],f[i]=f[i+a[i]]+1;
    }
    m=read();
    while(m--){
        int op=read(),pos=read()+1;
        if(op==1)printf("%d\n",query(pos));
        else {
            int x=read();a[pos]=x;
            for(int i=pos;i>=L[be[pos]];i--){
                if(i+a[i]>R[be[i]]){
                    to[i]=i+a[i];
                    f[i]=1;
                }
                else to[i]=to[i+a[i]],f[i]=f[i+a[i]]+1;
            }
        }
    }
    return 0;
}

P4168 [Violet] 蒲公英

\(m\) 次询问,每次询问区间 \([L,R]\) 的众数,强制在线。

处理出整块 \(f_{i,j}\) 的众数是谁。

对于边角块出现的数,强行计数,用前缀和来处理整块的该数出现的次数。

#include <bits/stdc++.h>
using namespace std;
#define ld long double
template <typename T>
inline T read(){
    T x=0;char ch=getchar();bool fl=false;
    while(!isdigit(ch)){if(ch=='-')fl=true;ch=getchar();}
    while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return fl?-x:x;
}
#define read() read<int>()
const int maxn = 40000 + 10;
const int maxm = 200 + 10;
int be[maxn],L[maxn],R[maxn],B,tot,cnt[maxn];
int n,m,a[maxn],tmp[maxn],mp[maxn];
int mx[maxm][maxm],f[maxm][maxn];
inline int query(int l,int r){
    if(be[l]==be[r]){
        for(int i=l;i<=r;i++)cnt[a[i]]=0;
        for(int i=l;i<=r;i++)cnt[a[i]]++;
        int maxx=0,res=0;
        for(int i=l;i<=r;i++){
            if(maxx<cnt[a[i]])maxx=cnt[a[i]],res=a[i];
            else if(maxx==cnt[a[i]])res=min(res,a[i]);
        }
        return mp[res];
    }
    int res1=mx[be[l]+1][be[r]-1],maxx1=f[be[r]-1][res1]-f[be[l]][res1];
    int res2=0,maxx2=0;
    for(int i=l;i<=R[be[l]];i++)cnt[a[i]]=0;
    for(int i=L[be[r]];i<=r;i++)cnt[a[i]]=0;
    for(int i=l;i<=R[be[l]];i++){
        cnt[a[i]]++;
        if(a[i]==res1)maxx1++;
        int temp=cnt[a[i]]+f[be[r]-1][a[i]]-f[be[l]][a[i]];
        if(maxx2<temp)maxx2=temp,res2=a[i];
        else if(maxx2==temp)res2=min(res2,a[i]);
    }
    for(int i=L[be[r]];i<=r;i++){
        cnt[a[i]]++;
        if(a[i]==res1)maxx1++;
        int temp=cnt[a[i]]+f[be[r]-1][a[i]]-f[be[l]][a[i]];
        if(maxx2<temp)maxx2=temp,res2=a[i];
        else if(maxx2==temp)res2=min(res2,a[i]);
    }
    //cerr<<maxx1<<" "<<maxx2<<endl;//
    //cerr<<res1<<" "<<res2<<endl;//
    if(maxx1>maxx2)return mp[res1];
    else if(maxx1==maxx2)return min(mp[res1],mp[res2]);
    else return mp[res2];
}
int main(){
    n=read();m=read();B=sqrt(n);
    for(int i=1;i<=n;i++)a[i]=read(),tmp[i]=a[i];
    sort(tmp+1,tmp+1+n);
    tot=unique(tmp+1,tmp+1+n)-(tmp+1);
    for(int i=1;i<=n;i++){
        be[i]=(i-1)/B+1;
        if(!L[be[i]])L[be[i]]=i;
        R[be[i]]=i;
        int x=lower_bound(tmp+1,tmp+1+tot,a[i])-tmp;
        mp[x]=a[i];a[i]=x;
    }
    for(int i=1;i<=be[n];i++){
        for(int j=L[i];j<=R[i];j++)f[i][a[j]]++;
        for(int j=1;j<=tot;j++)f[i][j]+=f[i-1][j];
    }
    for(int i=1;i<=be[n];i++){
        memset(cnt,0,sizeof cnt);
        int maxx=0,res=0;
        for(int j=i;j<=be[n];j++){
            for(int k=L[j];k<=R[j];k++){
                cnt[a[k]]++;
                if(cnt[a[k]]>maxx)maxx=cnt[a[k]],res=a[k];
                else if(cnt[a[k]]==maxx)res=min(res,a[k]);
            }
            mx[i][j]=res;
        }
    }
    int x=0;
    while(m--){
        int l0=read(),r0=read();
        int l=(l0+x-1)%n+1,r=(r0+x-1)%n+1;
        if(l>r)swap(l,r);
        x=query(l,r);
        printf("%d\n",x);
    }
    return 0;
}

标签:ch,分块,int,else,2024,read,while,maxn,补题
From: https://www.cnblogs.com/Liang-sheng/p/18114967

相关文章

  • 2024-04-04
    2024-04-04gcd上午模拟赛T1考场上写了\(O(n^2)\)的暴力,但是有的时候跑不满,\(10^5\)的大数据跑的飞快(100ms)考完没多久就想出来正解了观察到值域\(V\)只有\(100\),考虑把他放到时间复杂度里面枚举最大公约数\(g\)只有一段区间内所有的数都是\(g\)的倍数的时候才......
  • 2024年华为OD机试题-火星文计算
    题目描述:已知火星人使用的运算符为#、$,其与地球人的等价公式如下:x#y=2x+3y+4x$y=3*x+y+2其中x、y是无符号整数地球人公式按C语言规则计算火星人公式中,$的优先级高于#,相同的运算符,按从左到右的顺序计算现有一段火星人的字符串报文,请你来翻译并计算结果。输入描述:火......
  • 2024年华为OD机试题-提取字符串中的最长数学表达式并计算
    提取字符串中的最长数学表达式并计算题目描述提取字符串中的最长合法简单数学表达式,字符串长度最长的,并计算表达式的值。如果没有,则返回0。简单数学表达式只能包含以下内容0-9数字,符号+-*说明1、所有数字,计算结果都不超过long2、如果有多个长度一样的,请返回第一个表达式......
  • 红明谷初赛2024-web-wp
    这次队里我们仨发挥中规中矩,排14名。只能说最后unauth那道会错了意,然后卡住了,后面才发现是原题秒出的那种.....确实是我傻逼了....ezphp可以用endoafr报错拿到文件内容,然后就是一个匿名类的读取。<?phphighlight_file(__FILE__);//flag.phpif(isset($_POST['f'])......
  • 人是否应该以貌取人 英语作文 四级备考 20240404
    题目:Doyouagreeordisagreewiththefollowingstatement?Oneshouldneverjudgeapersonbyexternalappearances.Usespecificreasonsanddetailstosupportyouropinion.(150words)作文:Ifirmlybelievethatoneshouldneverjudgeapersonsolelybyt......
  • 少儿编程 2024年3月电子学会图形化编程等级考试Scratch一级真题解析(选择题)
    2024年3月scratch编程等级考试一级真题选择题(共25题,每题2分,共50分)1、单击下列哪个按钮,能够让舞台变为“全屏模式”A、B、C、D、答案:C考点分析:考查scratch平台的使用,四个选项分别是:开始程序,停止程序,全屏模式,恢复正常模式,答案C2、下列哪个选项可以将当前背景换成第二......
  • 2024.3.30 模拟赛
    A数列删除至少删除\(m\)个数,意思就是最多保留\(n-m\)个数。删除的总和最小,意思就是保留的总和最大。非降子序列问题可以用经典的动态规划来解决。用\(f[i][j]\)表示,当前选的最后一个数是\(a[i]\),一共选了\(j\)个数,选的数总和最大是多少。转移就是枚举上一个数\(a[......
  • 2024SD一轮省集游记
    Day0中午\(12:00\)不准时出发,下午四点多准时到达。感觉宾馆环境难以评价(它有有水壶但没有矿泉水,卫生间干湿不分离,没有吹风机,水壶十分“干净”等优点),垂直于窗户的墙甚至没有封死,导致可以和隔壁房间的fqr与Potato进行线下交流,音质严格优于电话,且只要两个房间有任一一人没睡......
  • 萤瓴优选——2024短视频创业变现新潮流
    短视频新时代,掌握8个变现方法,让你赚钱走在潮流前沿! 随着短视频行业的迅猛发展,越来越多的个人开始关注如何将自己的创作转化为可观的收益。在这个充满机遇的短视频新时代,掌握以下8种变现方法【jcj5123456】,让你稳步赚钱并一直走在潮流的前沿! 1.广告营销:通......
  • 西安理工大学2024年程序设计校赛
    西安理工大学2024年程序设计校赛(校外同步赛)_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ(nowcoder.com)A:签到篇.上voidsolve(){strings;cin>>s;if(s=="A"||s=="B"||s=="C")cout<<"YES\n";elsecout......