ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF455D Serega and Fun(deque+分块)

2021-03-28 23:34:37  阅读:235  来源: 互联网

标签:Serega deque int pos ans Fun idx1 block pos1


这道题强制在线,那么考虑在线算法

好像复杂度低的可以使用平衡树,但是我们这里使用分块算法 因为数据量不是特别大

因为是在前面加一个后面删一个,所以我们考虑使用双端队列来维护这个信息

这样修改的时候,可以把前面的块的末尾加到后面的块,这样每块的大小都不会发生改变

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int N=1e5+10;
const int mod=1e9+7;
int block;
deque<int> q[330];
int a[N],cnt[330][N];
int n;
void init(){
    int i;
    for(i=1;i<=n;i++){
        int pos=(i-1)/block+1;
        cnt[pos][a[i]]++;
        q[pos].push_back(a[i]);
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin>>n;
    block=sqrt(n);
    int i;
    for(i=1;i<=n;i++)
        cin>>a[i];
    init();
    int qu;
    cin>>qu;
    ll ans=0;
    while(qu--){
        int opt,l,r,k;
        cin>>opt>>l>>r;
        l=((l+ans-1)%n)+1;
        r=((r+ans-1)%n)+1;
        if(l>r)
            swap(l,r);
        int idx1=(l-1)/block+1;
        int idx2=(r-1)/block+1;
        if(opt==1){
            if(idx1==idx2){
                int pos=l-(idx1-1)*block-1;
                int pos1=r-(idx1-1)*block-1;
                int x=q[idx1][pos1];
                q[idx1].erase(q[idx1].begin()+pos1);
                q[idx1].insert(q[idx1].begin()+pos,x);
            }
            else{
                for(i=idx1;i<idx2;){
                    int x=q[i].back();
                    q[i].pop_back();
                    cnt[i][x]--;
                    i++;
                    q[i].push_front(x);
                    cnt[i][x]++;
                }
                int pos=r-(idx2-1)*block;
                int x=q[idx2][pos];
                q[idx2].erase(q[idx2].begin()+pos),cnt[idx2][x]--;
                pos=l-(idx1-1)*block-1;
                q[idx1].insert(q[idx1].begin()+pos,x),cnt[idx1][x]++;
            }
        }
        else{
            cin>>k;
            k=((k+ans-1)%n)+1;
            ans=0;
            if(idx1==idx2){
                int pos=l-(idx1-1)*block-1;
                int pos1=r-(idx1-1)*block-1;
                for(i=pos;i<=pos1;i++){
                    if(q[idx1][i]==k){
                        ans++;
                    }
                }
            }
            else{
                int pos=l-(idx1-1)*block-1;
                int pos1=r-(idx2-1)*block-1;
                for(i=pos;i<q[idx1].size();i++){
                    if(q[idx1][i]==k)
                        ans++;
                }
                for(i=0;i<=pos1;i++){
                    if(q[idx2][i]==k)
                        ans++;
                }
                for(i=idx1+1;i<idx2;i++){
                    ans+=cnt[i][k];
                }
            }
            cout<<ans<<endl;
        }
    }
}
View Code

 

标签:Serega,deque,int,pos,ans,Fun,idx1,block,pos1
来源: https://www.cnblogs.com/ctyakwf/p/14590579.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有