Time Limit: 20 Sec
Memory Limit: 256 MB
http://codeforces.com/contest/455/problem/D
Input
The first line contains integer n (1 ≤ n ≤ 105) — the number of elements of the array. The second line contains n integers a[1], a[2], ..., a[n] (1 ≤ a[i] ≤ n).
The third line contains a single integer q (1 ≤ q ≤ 105) — the number of queries. The next q lines contain the queries.
As you need to respond to the queries online, the queries will be encoded. A query of the first type will be given in format: 1 l'i r'i. A query of the second type will be given in format: 2 l'i r'i k'i. All the number in input are integer. They satisfy the constraints: 1 ≤ l'i, r'i, k'i ≤ n.
To decode the queries from the data given in input, you need to perform the following transformations:
li = ((l'i + lastans - 1) mod n) + 1; ri = ((r'i + lastans - 1) mod n) + 1; ki = ((k'i + lastans - 1) mod n) + 1.
Where lastans is the last reply to the query of the 2-nd type (initially, lastans = 0). If after transformation li is greater than ri, you must swap these values.
Output
For each query of the 2-nd type print the answer on a single line.
Sample Input
7
6 6 2 7 4 2 5
7
1 3 6
2 2 4 2
2 2 4 7
2 2 2 5
1 2 6
1 1 4
2 1 7 3
Sample Output
2
1
0
0
题意
2个操作
1.把a[l],a[l+1]……,a[r]变成 a[r],a[l],a[l+1]……,a[r-1]
2.l,r中等于v的数有多少
要求强制在线
题解:
分块,树套树
还是分块吧,用一个deque
我的代码tle 55……
还是看这个人的代码吧:http://blog.csdn.net/blankcqk/article/details/38468729
写得很清楚
代码
#include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> #include <stack> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define test freopen("test.txt","r",stdin) #define maxn 100005 #define mod 10007 #define eps 1e-9 const int inf=0x3f3f3f3f; const ll infll = 0x3f3f3f3f3f3f3f3fLL; inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } //************************************************************************************** deque<int>::iterator it; struct node { deque<int> q; int num[maxn]; }; node a[500]; int block,p,q; int n,l,r,ans,k,d1,d11,d2,d22,tmp,v; int main() { //test; n=read(); block=int(sqrt(n)); for(int i=0;i<n;i++) { int x=read(); p=i/block; a[p].q.push_back(x); a[p].num[x]++; } q=read(); for(int i=0;i<q;i++) { k=read(),l=read(),r=read(); l=((l+ans-1+n)%n); r=((r+ans-1+n)%n); if(l>r)swap(l,r); d1=l/block,d2=r/block; d11=l%block,d22=r%block; if(k==1) { if(d1==d2) { it=a[d1].q.begin()+d22; tmp=*it; a[d1].q.erase(a[d1].q.begin()+d22); a[d1].q.insert(a[d1].q.begin()+d11,tmp); } else { it=a[d2].q.begin()+d22; tmp=*it; a[d2].q.erase(a[d2].q.begin()+d22); a[d2].num[tmp]--; for(int i=d1;i<d2;i++) { int x=a[i].q.back(); a[i].q.pop_back(); a[i].num[x]--; a[i+1].q.push_front(x); a[i+1].num[x]++; } a[d1].q.insert(a[d1].q.begin()+d11,tmp); a[d1].num[tmp]++; } } else { v=read(); v=((v+ans-1)%n)+1; ans=0; if(d1==d2) { for(it=a[d1].q.begin()+d11;it<=a[d1].q.begin()+d22;it++) if(*it==v) ans++; } else { for(int i=d1+1;i<d2;i++) ans+=a[i].num[v]; for(it=a[d1].q.begin()+d11;it<a[d1].q.end();it++) if(*it==v) ans++; for(it=a[d2].q.begin();it<=a[d2].q.begin()+d22;it++) if(*it==v) ans++; } printf("%d\n",ans); } } return 0; }