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 ...
随机推荐
- WIN10 CMD 启动虚拟WIFI
1.以管理员身份运行命令提示符: 快捷键win+R→输入cmd→回车 2.启用并设定虚拟WiFi网卡: 运行命令:netsh wlan set hostednetwork mode=allow ssi ...
- no module named flask.ext.login
在用安装了flask-login后使用时发现了问题,查了许多资料尝试了许多办法: 1.以为是文件结构的问题,因为flask-login包中没有__init__.py结果编译后还是不行 2.以为是路径问 ...
- jquery 判断网络资源,网络文件是否存在
前提是,不能跨域访问引入jquery库<script src="jQuery.js" type="text/javascript"></scr ...
- [Nhibernate]sqlite数据库基本使用
目录 写在前面 操作步骤 总结 写在前面 昨天有朋友问我在nhibernate中如何使用sqlite数据库,当时实在忙的不可开交,下周要去山西出差,实在没空,按我的说法使用sqlite跟使用sqlse ...
- Top 15 Java Utility Classes
In Java, a utility class is a class that defines a set of methods that perform common functions. Thi ...
- ActiveMQ结合Spring开发
---------------------------------------------------------------------------- Spring结合ActiveMQ开发 : 发送 ...
- 二叉树的层序遍历 BFS
二叉树的层序遍历,或者说是宽度优先便利,是经常考察的内容. 问题一:层序遍历二叉树并输出,直接输出结果即可,输出格式为一行. #include <iostream> #include &l ...
- AndroidStudio导入Library
1.把它像Module一样导入. File >New >ImportModule(选择你要导入的Library). 如果出现了下面的情况,意思是跟项目中的Module重名,改个名字就行了. ...
- cf723d Lakes in Berland
The map of Berland is a rectangle of the size n × m, which consists of cells of size 1 × 1. Each cel ...
- oracle创建用户
--首先用管理员的帐户登录(要有修改用户的权限)system,默认数据库orcl. CREATE USER lcs IDENTIFIED BY lcs default tablespace lics_ ...