题目链接:http://codeforces.com/problemset/problem/455/D

题意:给定一个长度为n的序列a[]。 m次操作。共有两种操作 1 l r:将序列的a[l].a[l+1]...a[r]变成a[r].a[l].a[l+1]...a[r-1];2 l r k:求序列a[l].a[l+1]...a[r]中有多少个值为k。 输入的l,r,k都是加密过的。所以要解密一下。规则为 l=(l+ans-1)%n+1  r=(r+ans-1)%n+1 k=(k+ans-1)%n+1. (当解密过后l>r时交换l,r)ans为上一个2操作的结果。初始的ans为0. 即题目要求强制在线。

思路:考虑分块。每块维护一个cnt数组,cnt[i]表示在该块中数字i出现的次数。 再维护一个双端队列deque. 然后对于1操作就暴力来修改就好了。注意如果1操作涉及到多块的时候,要将第i块的最后一个移动到第i+1块的第一个。 然后维护一下cnt即可。

#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<queue>
#include<math.h>
#include<time.h>
#include<vector>
#include<iostream>
#include<map>
using namespace std;
typedef long long int LL;
const int MAXN = + ;
int belong[MAXN], block, num, L[MAXN], R[MAXN];
int n, q, val[MAXN];
struct Node{
deque<int>Q;
int cnt[MAXN];
}Bval[];
void build(){
block = (int)sqrt(n + 0.5);
num = n / block; if (n%block){ num++; }
for (int i = ; i <= num; i++){
memset(Bval[i].cnt, , sizeof(Bval[i].cnt));
Bval[i].Q.clear();
L[i] = (i - )*block + ; R[i] = i*block;
}
R[num] = n;
for (int i = ; i <= n; i++){
belong[i] = ((i - ) / block) + ;
}
for (int i = ; i <= num; i++){
for (int k = L[i]; k <= R[i]; k++){
Bval[i].cnt[val[k]]++;
Bval[i].Q.push_back(val[k]);
}
}
}
void modify(int st, int ed){
deque<int>::iterator it; int v;
if (belong[st] == belong[ed]){
it = Bval[belong[st]].Q.begin();
for (int i = L[belong[st]]; i < ed; i++){
it++;
}
v = *it;
Bval[belong[st]].Q.erase(it);
it = Bval[belong[st]].Q.begin();
for (int i = L[belong[st]]; i<st; i++){
it++;
}
Bval[belong[st]].Q.insert(it, v);
return;
}
it = Bval[belong[ed]].Q.begin();
for (int i = L[belong[ed]]; i < ed; i++){ it++; }
v = *it;
Bval[belong[ed]].Q.erase(it); Bval[belong[ed]].cnt[v]--;
it = Bval[belong[st]].Q.begin();
for (int i = L[belong[st]]; i < st; i++){ it++; }
Bval[belong[st]].Q.insert(it, v); Bval[belong[st]].cnt[v]++;
for (int i = belong[st] + ; i <= belong[ed]; i++){
it = Bval[i - ].Q.end() - ; v = *it;
Bval[i].Q.push_front(v); Bval[i].cnt[v]++;
Bval[i - ].cnt[v]--;
Bval[i - ].Q.erase(it);
}
}
int query(int st, int ed, int v){
int ans = ;
deque<int>::iterator it;
if (belong[st] == belong[ed]){
it = Bval[belong[st]].Q.begin();
for (int i = L[belong[st]]; i<st; i++){
it++;
}
for (int i = st; i <= ed; i++, it++){
ans += ((*it) == v);
}
return ans;
}
it = Bval[belong[st]].Q.begin();
for (int i = L[belong[st]]; i<st; i++){
it++;
}
for (int i = st; i <= R[belong[st]]; i++, it++){
ans += ((*it) == v);
}
for (int i = belong[st] + ; i < belong[ed]; i++){
ans += Bval[i].cnt[v];
}
it = Bval[belong[ed]].Q.begin();
for (int i = L[belong[ed]]; i <= ed; i++, it++){
ans += ((*it) == v);
}
return ans;
}
int main(){
//#ifdef kirito
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
//#endif
// int start = clock();
while (~scanf("%d", &n)){
for (int i = ; i <= n; i++){
scanf("%d", &val[i]);
}
build(); scanf("%d", &q);
int type, l, r, v, ans = ;
for (int i = ; i <= q; i++){
scanf("%d", &type);
if (type == ){
scanf("%d%d", &l, &r);
l = ((l + ans - ) % n) + ; r = ((r + ans - ) % n) + ;
if (l>r){ swap(l, r); }
modify(l, r);
}
else{
scanf("%d%d%d", &l, &r, &v);
l = ((l + ans - ) % n) + ; r = ((r + ans - ) % n) + ; v = ((v + ans - ) % n + );
if (l>r){ swap(l, r); }
printf("%d\n", ans = query(l, r, v));
}
}
}
//#ifdef LOCAL_TIME
// cout << "[Finished in " << clock() - start << " ms]" << endl;
//#endif
return ;
}

CodeForces 455D 分块的更多相关文章

  1. Serega and Fun CodeForces - 455D (分块 或 splay)

    大意:给定n元素序列, 2种操作 将区间$[l,r]$循环右移1位 询问$[l,r]$中有多少个等于k的元素 现在给定q个操作, 输出操作2的询问结果, 强制在线 思路1: 分块 每个块内维护一个链表 ...

  2. Codeforces 455D 分块+链表

    题意: 给定一个长度为 N 的序列两种操作1 l r 将[l,r]的数向右循环移位 2 l r 询问[l,r]内有多少个数等于 k其中 N,Q≤105,ai≤N 强制在线 思路: 1. 每块用一个链表 ...

  3. CodeForces 444C 分块

    题目链接:http://codeforces.com/problemset/problem/444/C 题意:给定一个长度为n的序列a[].起初a[i]=i,然后还有一个色度的序列b[],起初b[i] ...

  4. CodeForces 551E 分块

    题目链接:http://codeforces.com/problemset/problem/551/E 题意:给定一个长度为N的序列. 有2个操作 1 l r v:序列第l项到第r项加v(区间加), ...

  5. CodeForces 103D 分块处理

    题目链接:http://codeforces.com/problemset/problem/103/D 题意:给定一个长度为n的序列.然后q个询问.每个询问为(a,b),表示从序列第a项开始每b项的加 ...

  6. Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) Problem E (Codeforces 828E) - 分块

    Everyone knows that DNA strands consist of nucleotides. There are four types of nucleotides: "A ...

  7. Serega and Fun Codeforces - 455D || queue

    https://codeforces.com/problemset/problem/455/D 其实方法很多,然而当初一个也想不到... 1.分块,块内用链表维护 修改[l,r]就当成删除第r个元素, ...

  8. CodeForces 13E 分块

    题目链接:http://codeforces.com/problemset/problem/13/E 题意:给定n个弹簧和每个弹簧初始的弹力a[].当球落在第i个位置.则球会被弹到i+a[i]的位置. ...

  9. CodeForces - 455D

    Serega loves fun. However, everyone has fun in the unique manner. Serega has fun by solving query pr ...

随机推荐

  1. 学习.Net的经典网站

    学习.Net的经典网站 收藏 还不错推荐给大家 原文-- 名称:快速入门 地址:http://chs.gotdotnet.com/quickstart/ 描述:本站点是微软.NET技术的快速入门网站, ...

  2. 用U盘安装系统的好用的PE系统:通用PE V6.1下载

    用U盘安装系统的好用的PE系统:通用PE V6.1下载 PE是一款用其他介质(我们最常用的是U盘)启动安装电脑系统的简易操作系统,在XP系统中 最经典的是扬州老毛桃出品的只有100多兆的XP内核的PE ...

  3. 前端MVC框架、类库、UI框架选择

    CSS预处理器sass(基于Ruby服务端版)less(客户端版:基于js; 服务端版:基于nodejs) 前端UI框架JqueryMiniUI: http://www.miniui.com/(适用于 ...

  4. IoC/DI基本思想的演变

    ---------------------------------------------------------------------------------- (1)IoC/DI的概念 IoC ...

  5. tyvj1144 股票

    描述 2130年,股神巴菲特投胎了!他投胎到你身上!你作为股神转世,能力比原股神还要强,你可以预测到今后n天的股价.假设刚开始你的手上有1元钱,你想知道n天后你最多可以赚到多少钱.作为股神转世,你准备 ...

  6. vijos1531 食物链

    背景 安徽省芜湖市第二十七中学测试题 NOI 2001 食物链(eat) Description:OfficialData:OfficialProgram:JackDavid127 描述 动物王国中有 ...

  7. bzoj1003 物流运输

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...

  8. codevs1316 文化之旅

    题目描述 Description 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可 ...

  9. [Math & Algorithm] 拉格朗日乘数法

    拉格朗日乘数法(Lagrange Multiplier Method)之前听数学老师授课的时候就是一知半解,现在越发感觉拉格朗日乘数法应用的广泛性,所以特意抽时间学习了麻省理工学院的在线数学课程.新学 ...

  10. Linux C 文件操作,系统调用 -- open()、read() 和 标准I/O库 -- fopen()、fread()

    函数汇总: open().write().read().close() fopen().fwrite().fread().fclose() 一.什么是文件 在讲述文件操作之前,我们首先要知道什么是文件 ...