loj 6282 数列分块入门 6
题解:块状链表。最简陋的块状链表就能过。
代码:
#include<bits/stdc++.h> using namespace std; const int maxn=100005; int n,block,cnt,w[maxn]; vector<int> v[maxn]; int get(int x); void insert(int l,int r); int check(int r); int main() { int i,op,l,r,c; scanf("%d",&n); block=sqrt(n); if(n%block) cnt=n/block+1; else cnt=n/block; for(i=1;i<=n;i++) { scanf("%lld",&w[i]); v[get(i)].push_back(w[i]); } for(i=0;i<n;i++) { scanf("%d%d%d%d",&op,&l,&r,&c); if(op==0) insert(l,r); else printf("%d\n",check(r)); } system("pause"); return 0; } int get(int x) {return (x-1)/block+1;} void insert(int l,int r) { for(int i=1;i<=cnt;i++) { if(l<=v[i].size()) { v[i].insert(v[i].begin()+l-1,r); break; } else l-=v[i].size(); } } int check(int r) { for(int i=1;i<=cnt;i++) { if(r<=v[i].size()) return v[i][r-1]; else r-=v[i].size(); } }