CodeForces 455D 分块
题目链接: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 分块的更多相关文章
- Serega and Fun CodeForces - 455D (分块 或 splay)
大意:给定n元素序列, 2种操作 将区间$[l,r]$循环右移1位 询问$[l,r]$中有多少个等于k的元素 现在给定q个操作, 输出操作2的询问结果, 强制在线 思路1: 分块 每个块内维护一个链表 ...
- Codeforces 455D 分块+链表
题意: 给定一个长度为 N 的序列两种操作1 l r 将[l,r]的数向右循环移位 2 l r 询问[l,r]内有多少个数等于 k其中 N,Q≤105,ai≤N 强制在线 思路: 1. 每块用一个链表 ...
- CodeForces 444C 分块
题目链接:http://codeforces.com/problemset/problem/444/C 题意:给定一个长度为n的序列a[].起初a[i]=i,然后还有一个色度的序列b[],起初b[i] ...
- CodeForces 551E 分块
题目链接:http://codeforces.com/problemset/problem/551/E 题意:给定一个长度为N的序列. 有2个操作 1 l r v:序列第l项到第r项加v(区间加), ...
- CodeForces 103D 分块处理
题目链接:http://codeforces.com/problemset/problem/103/D 题意:给定一个长度为n的序列.然后q个询问.每个询问为(a,b),表示从序列第a项开始每b项的加 ...
- 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 ...
- Serega and Fun Codeforces - 455D || queue
https://codeforces.com/problemset/problem/455/D 其实方法很多,然而当初一个也想不到... 1.分块,块内用链表维护 修改[l,r]就当成删除第r个元素, ...
- CodeForces 13E 分块
题目链接:http://codeforces.com/problemset/problem/13/E 题意:给定n个弹簧和每个弹簧初始的弹力a[].当球落在第i个位置.则球会被弹到i+a[i]的位置. ...
- CodeForces - 455D
Serega loves fun. However, everyone has fun in the unique manner. Serega has fun by solving query pr ...
随机推荐
- Win7 64位下PowerDesigner连接64位Oracle11g数据库
操作系统:WIN7 64旗舰版 Oracle版本:64位11g PowerDesigner版本:15.1 问题描述:因为PowerDesigner是32的程序,连接数据库会默认开启32位的ODBC,因 ...
- IOS热更新-JSPatch实现原理+Patch现场恢复
关于HotfixPatch 在IOS开发领域,由于Apple严格的审核标准和低效率,IOS应用的发版速度极慢,稍微大型的app发版基本上都在一个月以上,所以代码热更新(HotfixPatch)对于IO ...
- spring mvc统一异常处理(@ControllerAdvice + @ExceptionHandler)
spring 封装了非常强大的异常处理机制.本文选取@ControllerAdvice + @ExceptionHandler 这种零配置(全注解),作为异常处理解决方案! @ControllerAd ...
- 短信接口API
/** * Created by bingone on 15/12/16. */ import org.apache.http.HttpEntity; import org.apache.http.N ...
- C# 发送电子邮件
网上找到的发送邮件的类,改了一点点,在此谢谢原作者的奉献. 1.源码: public class CSendMail { private MailMessage mailMessage; privat ...
- PHP代码编写规范
一. 变量命名 a) 所有字母都使用小写 b) 首字母根据变量值类型指定 i. 整数i ii. 浮点数f iii. 字符串s iv. 布尔值b v. 数组a vi. 对象o vii. 资源r viii ...
- (PPT)Linux服务器基础
- Java Native Interface 编程系列一
本文是<Java Native Interface Programmer's Guide and Specification>的读书笔记 Java Native Interface可以让编 ...
- EL操作 web 对象的常用方法
11个常见的web对象 pageScope :获得pageContext对象中存的数据 requestScope :获得request对象中存的数据 sessionScope :获得session对象 ...
- vux 中popup 组件 Mask 遮罩在最上层问题的解决
1. 问题描述:popup弹出层在遮罩层下面的 2.原因:因为滚动元素和mask遮罩层在同一级,vux框架默认把遮罩层放在body标签下的 3.解决方法:更改一下源码,把mask遮罩层放在popup同 ...