zoukankan      html  css  js  c++  java
  • bzoj4241/AT1219 历史研究(回滚莫队)

    bzoj4241/AT1219 历史研究(回滚莫队)

    bzoj它爆炸了。

    luogu

    题解时间

    我怎么又在做水题。

    就是区间带乘数权众数。

    经典回滚莫队,一般对于延长区间简单而缩短区间难的莫队题可以考虑。

    思路就是对于所有l在同一块的询问,只记录在这一块以外的扩展贡献,而对于在块内的部分每次暴力记录贡献。

    可以证明还是 $ O(n sqrt {n} ) $ 。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long lint;
    struct pat{int x,y;pat(int x=0,int y=0):x(x),y(y){}bool operator<(const pat &p)const{return x==p.x?y<p.y:x<p.x;}};
    template<typename TP>inline void read(TP &tar)
    {
    	TP ret=0,f=1;char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
    	tar=ret*f;
    }
    template<typename TP,typename... Args>inline void read(TP& t,Args&... args){read(t),read(args...);}
    namespace RKK
    {
    const int N=100011,m=10;
    const int mo=1000000007;void doadd(int &a,const int &b){if((a+=b)>=mo) a-=mo;}
    int add(int a,const int &b){return (a+=b)>=mo?a-mo:a;}
    char str[N];int n,qaq;
    int sum[N][m],isum[N][m];
    int a[m][m],b[m][m];
    void init()
    {
    	for(int i=0;i<m;i++) a[i][i]=b[i][i]=sum[0][i]=1;
    	for(int i=1,c=str[i]-'a';i<=n;i++,c=str[i]-'a')for(int j=0;j<m;j++)
    	{
    		sum[i][j]=add(add(sum[i-1][j],sum[i-1][j]),mo-a[c][j]),a[c][j]=sum[i-1][j];
    		isum[i][j]=b[c][j],b[c][j]=add(add(b[c][j],b[c][j]),mo-isum[i-1][j]);
    	}
    }
    int main()
    {
    	scanf("%s",str+1),n=strlen(str+1),init();
    	read(qaq);for(int rkk=1,l,r;rkk<=qaq;rkk++)
    	{
    		read(l,r);int ans=add(sum[r][9],mo-1);
    		for(int i=0;i<m-1;i++) doadd(ans,mo-1ll*sum[r][i]*isum[l-1][i]%mo);
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    }
    int main(){return RKK::main();}
    
  • 相关阅读:
    详解Codis安装与部署
    停车场地图开发
    dlib换脸
    海康相机官网硬触发设置
    python操作数据库
    心率和血氧测量
    音乐模块
    flask网页显示图片
    树莓派识别二维码
    树莓派python获取自身IP
  • 原文地址:https://www.cnblogs.com/rikurika/p/13215442.html
Copyright © 2011-2022 走看看