题目链接: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. 上传github代码

    github 自己理解的使用方法 摸索了半天时间了,连查再找 百度 GOOGLE的 真是费了不少劲呀,不过 网上的这个教程 那个教程 看的真是一头雾水呀,很多都是贴过来贴过去 ,不过 还是帮助我不少, ...

  2. 使用css打造形形色色的形状!

    使用css打造形形色色的形状! css是非常强大的工具,如果我们掌握的好,那么许多复杂的形状不需要使用图片而直接使用css完成即可,这不仅有利于减少http请求以增强性能还便于日后的管理和维护,一举两 ...

  3. HTML-一个网页的头部的大概框架(完善ing)

    正常情况下,一个头部(考虑兼容.响应.title图标的需求),所要填写的内容如下: <!DOCTYPE html> <html> <head> <meta c ...

  4. The RAII Programming Idiom

    https://www.hackcraft.net/raii/ https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization

  5. thinkphp分页二,分装到funciton.php

    function.php代码 <?php /* 全局分页 * $table 数据表名 * $order 排序 * $pagesize 每页显示N个 * $where 查询条件 * $rollPp ...

  6. can't open a connection to site 'syb_backup'

    sp_configure "allow update",1 go update sysservers  set srvname='SYB_BACKUP', srvnetname=' ...

  7. 在Application中集成Microsoft Translator服务之优化

    在一篇文章中我们已经实现了功能,但是一个明显的问题是响应时间非常长,用户体验非常糟糕,这篇文章将带你找出问题所在并进行优化 为了找出追魁祸首,这里使用 System.Diagnostics.Stopw ...

  8. php如何防止图片盗用/盗链的两种方法

    如今的互联网,采集网站非常多,很多网站都喜欢盗链/盗用别人网站的图片,这样不仅侵犯网权,还导致被盗链的网站消耗大量的流量,给服务器造成比较大的压力,本文章向大家介绍php如何防止图片盗用/盗链的两种方 ...

  9. 微博RPC框架motan入门笔记

    Motan 是一套高性能.易于使用的分布式远程服务调用(RPC)框架. 功能 支持通过spring配置方式集成,无需额外编写代码即可为服务提供分布式调用能力. 支持集成consul.zookeeper ...

  10. bzoj1045 糖果传递

    escription 老师准备了一堆糖果, 恰好n个小朋友可以分到数目一样多的糖果. 老师要n个小朋友去拿糖果, 然后围着圆桌坐好, 第1个小朋友的左边是第n个小朋友, 其他第i个小朋友左边是第i-1 ...