CodeForces - 455D 分块

Posted walfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces - 455D 分块相关的知识,希望对你有一定的参考价值。

。。wa了一整天,,,死都找不出bug,后来把x-=l[idx],y-=l[idy]就过了= = 

还是分块,用双端队列+数组(map可能会爆内存)维护,每次更新只需要更新两端的队列值和数组里存的值,查询直接暴力查询每个块复杂度O(n*sqrt(n))

技术分享
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 998244353
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1

using namespace std;

const double g=10.0,eps=1e-7;
const int N=100000+10,maxn=400,inf=0x3f3f3f3f;

int l[N],r[N],belong[N];
int m[maxn][N],a[N];
int n,block,num;
deque<int>d[maxn];
void build()
{
    block=(int)sqrt(n+0.5);
    num=n/block;
    if(n%block)num++;
    for(int i=1;i<=num;i++)
        l[i]=(i-1)*block+1,r[i]=i*block;
    r[num]=n;
    for(int i=1;i<=n;i++)
    {
        belong[i]=(i-1)/block+1;
        int x;
        scanf("%d",&x);
        m[(i-1)/block+1][x]++;
        d[(i-1)/block+1].push_back(x);
    }
}
void reblock(int x,int y,int id,int p)
{
    int len=d[id].size();
    for(int i=0;i<len;i++)
        a[i]=d[id][i];
    for(int i=y;i>=x+1;i--)
        a[i]=a[i-1];
    a[x]=p;
    d[id].clear();
    for(int i=0;i<len;i++)
        d[id].push_back(a[i]);
}
void debug()
{
    for(int i=1;i<=num;i++)
    {
        for(int j=0;j<d[i].size();j++)
            cout<<d[i][j]<<" ";
        cout<<endl;
    }
}
int main()
{
    scanf("%d",&n);
    build();
    int q,lastans=0;
    scanf("%d",&q);
    while(q--)
    {
       // debug();
        int x,y,z;
        scanf("%d",&x);
        if(x==1)
        {
            scanf("%d%d",&x,&y);
            x=(x+lastans-1)%n+1;y=(y+lastans-1)%n+1;
            if(x>y)swap(x,y);
            int idx=belong[x],idy=belong[y];
            x-=l[idx];y-=l[idy];
            if(idx==idy)
            {
                reblock(x,y,idx,d[idx][y]);
            }
            else
            {
                int p=d[idy][y];
                m[idx][d[idy][y]]++;m[idx][d[idx][d[idx].size()-1]]--;
                m[idy][d[idy-1][d[idy-1].size()-1]]++,m[idy][d[idy][y]]--;
                for(int i=idy-1;i>=idx+1;i--)
                {
                    m[i][d[i][d[i].size()-1]]--;
                    m[i][d[i-1][d[i-1].size()-1]]++;
                }
                reblock(0,y,idy,d[idy-1][d[idy-1].size()-1]);
                for(int i=idy-1;i>=idx+1;i--)
                {
                    d[i].push_front(d[i-1][d[i-1].size()-1]);
                    d[i].pop_back();
                }
                reblock(x,d[idx].size()-1,idx,p);
            }
        }
        else
        {
            scanf("%d%d%d",&x,&y,&z);
            x=(x+lastans-1)%n+1,y=(y+lastans-1)%n+1,z=(z+lastans-1)%n+1;
            if(x>y)swap(x,y);
            int ans=0;
            int idx=belong[x],idy=belong[y];
            x-=l[idx],y-=l[idy];
            if(idx==idy)
            {
                for(int i=x;i<=y;i++)
                    if(d[idx][i]==z)
                        ans++;
            }
            else
            {
                for(int i=x;i<d[idx].size();i++)
                    if(d[idx][i]==z)
                        ans++;
                for(int i=0;i<=y;i++)
                    if(d[idy][i]==z)
                        ans++;
                for(int i=idx+1;i<=idy-1;i++)
                    ans+=m[i][z];
            }
            printf("%d\n",ans);
            lastans=ans;
        }
    }
    return 0;
}
/********************

********************/
View Code

 

以上是关于CodeForces - 455D 分块的主要内容,如果未能解决你的问题,请参考以下文章

[Codeforces 455D]Serega and Fun-分块|细节

Codeforces 455D - Serega and Fun (Solved by Square Root Decomposition)

Codeforces 1375H Set Merging (分块)

CodeForces 551E 分块

CodeForces 103D 分块处理

CodeForces 1202F(数论,整除分块)