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();
  }
}

 

posted @ 2019-08-06 00:15  Vivid-BinGo  阅读(163)  评论(0编辑  收藏  举报