题目链接

1.分块(vector)+重构

  1. //直接上vector(本机还是比较慢的...) 某块size较大时O(n)重构
  2. //注意细节
  3. #include <cmath>
  4. #include <cstdio>
  5. #include <cctype>
  6. #include <vector>
  7. #define gc() getchar()
  8. #define pb push_back
  9. typedef long long LL;
  10. const int N=1e5+5;
  11. int n,size,tmp[N<<1],bel;
  12. std::vector<int> v[500];
  13. std::vector<int>::iterator it;
  14. inline int read()
  15. {
  16. int now=0,f=1;register char c=gc();
  17. for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
  18. for(;isdigit(c);now=now*10+c-'0',c=gc());
  19. return now*f;
  20. }
  21. inline int Get_Pos(int &p)
  22. {
  23. for(int i=1; i<=bel; ++i)
  24. if((p-=v[i].size())<=0) {p+=v[i].size(); return i;}
  25. }
  26. void Rebuild()
  27. {
  28. int tot=0;
  29. for(int i=1; i<=bel; ++i)
  30. {
  31. for(it=v[i].begin(); it!=v[i].end(); ++it) tmp[++tot]=*it;
  32. v[i].clear();
  33. }
  34. size=sqrt(tot);
  35. for(int i=1; i<=tot; ++i) bel=(i-1)/size+1, v[bel].pb(tmp[i]);
  36. }
  37. void Insert(int p,int val)
  38. {
  39. int id=Get_Pos(p);
  40. v[id].insert(v[id].begin()+p-1,val);
  41. if(v[id].size()>size*15) Rebuild();
  42. }
  43. int main()
  44. {
  45. n=read(), size=sqrt(n);
  46. for(int i=1; i<=n; ++i) bel=(i-1)/size+1,v[bel].pb(read());
  47. for(int opt,l,r,c,id,i=1; i<=n; ++i)
  48. {
  49. opt=read(),l=read(),r=read(),c=read();
  50. if(opt) id=Get_Pos(r),printf("%d\n",v[id][r-1]);
  51. else Insert(l,r);
  52. }
  53. return 0;
  54. }

2.块状链表

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <cctype>
  4. #include <algorithm>
  5. #define gc() getchar()
  6. typedef long long LL;
  7. const int N=1e5+5;
  8. int n,size,H[N],nxt[N],nxtv[N<<1],A[N<<1],sz[N];//二倍数组!mdzzC++数组越界各种奇葩错误(这指针无语)
  9. inline int read()
  10. {
  11. int now=0,f=1;register char c=gc();
  12. for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
  13. for(;isdigit(c);now=now*10+c-'0',c=gc());
  14. return now*f;
  15. }
  16. inline int New_Node()
  17. {
  18. static int cnt=n;
  19. return ++cnt;
  20. }
  21. inline int New_Block()
  22. {
  23. static int cnt=(n-1)/size+1;
  24. return ++cnt;
  25. }
  26. void Init()
  27. {
  28. for(int i=1; i<=n; ++i) A[i]=read();
  29. int tot=(n-1)/size+1;
  30. H[0]=1;
  31. for(int now=0,i=1; i<tot; ++i)//块整体的链表
  32. H[i]=(i-1)*size+1, nxt[i]=i+1, sz[i]=size;
  33. sz[tot]=n-(tot-1)*size, H[tot]=(tot-1)*size+1;
  34. for(int i=1,tmp=i*size; i<=tot; tmp=++i*size)//块内链表
  35. for(int j=(i-1)*size+1; j<tmp; ++j)
  36. nxtv[j]=j+1;
  37. }
  38. int Get_Pos(int &p)
  39. {
  40. for(int i=H[0]; i; i=nxt[i])
  41. if((p-=sz[i])<=0) {p+=sz[i]; return i;}
  42. }
  43. int Query(int p)
  44. {
  45. int id=Get_Pos(p);
  46. for(int i=H[id]; i; i=nxtv[i])
  47. if(!--p) return A[i];
  48. }
  49. void Insert(int p,int v)
  50. {
  51. int id=Get_Pos(p),pos=New_Node();
  52. A[pos]=v, ++sz[id];
  53. // printf("I pos:%d id:%d p:%d size:%d stdsz:%d sz[id]:%d\n",pos,id,p,size*(id-1)+p,size,sz[id]);
  54. if(!p) nxtv[pos]=H[id], H[id]=pos;
  55. else
  56. for(int i=H[id]; i; i=nxtv[i])
  57. if(!--p) {nxtv[pos]=nxtv[i], nxtv[i]=pos; break;}
  58. if(sz[id] > size<<1)//2倍比较合适
  59. {
  60. p=size;
  61. for(int i=H[id]; i; i=nxtv[i])
  62. if(!(--p)) {pos=nxtv[i], nxtv[i]=0; break;}
  63. int posb=New_Block();
  64. H[posb]=pos, nxt[posb]=nxt[id], nxt[id]=posb, sz[posb]=sz[id]-size, sz[id]=size;
  65. }
  66. }
  67. //void Print()
  68. //{
  69. // puts("Output:");
  70. // for(int i=H[0]; i; i=nxt[i])
  71. // for(int j=H[i]; j; j=nxtv[j])
  72. // printf("%d ",A[j]);
  73. // putchar('\n');
  74. //}
  75. int main()
  76. {
  77. n=read(), size=sqrt(n);
  78. Init();
  79. for(int opt,l,r,c,i=1; i<=n; ++i)
  80. {
  81. opt=read(),l=read(),r=read(),c=read();
  82. if(opt) printf("%d\n",Query(r));
  83. else Insert(l-1,r);
  84. }
  85. return 0;
  86. }

LOJ.6282.数列分块入门6(块状链表/分块)的更多相关文章

  1. LOJ #6282. 数列分块入门 6-分块(单点插入、单点查询、数据随机生成)

    #6282. 数列分块入门 6 内存限制:256 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: hzwer 提交提交记录统计测试数据讨论 1   题目描述 给出 ...

  2. 【函数式权值分块】【块状链表】bzoj3065 带插入区间K小值

    显然是块状链表的经典题.但是经典做法的复杂度是O(n*sqrt(n)*log^2(n))的,出题人明确说了会卡掉. 于是我们考虑每个块内记录前n个块的权值分块. 查询的时候差分什么的,复杂度就是O(n ...

  3. LOJ#6282. 数列分块入门 6

    一个动态的插入过程,还需要带有查询操作. 我可以把区间先分块,然后每个块块用vector来维护它的插入和查询操作,但是如果我现在这个块里的vector太大了,我可能的操作会变的太大,所以这时候我需要把 ...

  4. 题解【loj6277】数列分块入门1

    题目描述 给出一个长为\(n\)的数列,以及\(n\)个操作,操作涉及区间加法,单点查值. 输入格式 第一行输入一个数字\(n\). 第二行输入\(n\)个数字,第\(i\)个数字为\(a_{i}\) ...

  5. ZOJ 2112 Dynamic Rankings(动态区间第 k 大+块状链表)

    题目大意 给定一个数列,编号从 1 到 n,现在有 m 个操作,操作分两类: 1. 修改数列中某个位置的数的值为 val 2. 询问 [L, R] 这个区间中第 k 大的是多少 n<=50,00 ...

  6. 块状链表 bzoj 3343教主的魔法

    //块状链表//分块排序,然后每次查找时在暴力查找头和尾两个块.//中间那些块,因为有序所以只需2分查找即可.我用的是lower_pound();//插入是,也是头和尾暴力插入,中间那些加到一个累计里 ...

  7. [Loj] 数列分块入门 1 - 9

    数列分块入门 1 https://loj.ac/problem/6277 区间加 + 单点查询 #include <iostream> #include <cstdio> #i ...

  8. LOJ——#6277. 数列分块入门 1

    ~~推荐播客~~ 「分块」数列分块入门1 – 9 by hzwer 浅谈基础根号算法——分块 博主蒟蒻,有缘人可直接观摩以上大佬的博客... #6277. 数列分块入门 1 题目大意: 给出一个长为 ...

  9. 数列分块入门九题(二):LOJ6280~6282

    Preface 个人感觉这中间的三题是最水的没有之一 数列分块入门 4--区间加法,区间求和 这个也是很多数据结构完爆的题目线段树入门题,但是练分块我们就要写吗 修改还是与之前类似,只不过我们要维护每 ...

随机推荐

  1. c语言的重构、清理与代码分析图形化浏览工具: CScout

    网址: https://www.spinellis.gr/cscout/ https://www2.dmst.aueb.gr/dds/cscout/index.html https://github. ...

  2. linux系统编译安装软件的通用步骤

    编译安装的步骤: 1.下载源代码,并解压     tar -xf package-version.tar.{gz|bz2|xz} 注意:展开后的目录通常为package-version 2.切换至源码 ...

  3. 转载:gc的概念,如果A和B对象循环引用,是否可以被GC?

    原文:https://www.cnblogs.com/zhchoutai/p/6784929.html ①首先说一下,GC里边在JVM其中是使用的ROOT算法,ROOT算法,什么称作为ROOT呢,就是 ...

  4. 转载:为什么选择Nginx(1.2)《深入理解Nginx》(陶辉)

    原文:https://book.2cto.com/201304/19610.html 为什么选择Nginx?因为它具有以下特点: (1)更快 这表现在两个方面:一方面,在正常情况下,单次请求会得到更快 ...

  5. Java基础100 待续

    1.待续 原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/107 ...

  6. java 运算符 与(&)、非(~)、或(|)、异或(^)逻辑操作符 与(&&) 或(||) 非(!)

    按位与&: 只要对应的二个二进位都为1时,结果位就为1 按位或|:只要对应的二个二进位有一个为1时,结果位就为1 按位异或^:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1) ...

  7. Lavarel - 模块间复用代码

    代码复用在项目中早晚会遇到,这不在用 Laravel 给博客增加 Feed 订阅功能 就到了需要将生成网页 description 的函数提取出来,在文章显示与 Feed 生成的两个 Controll ...

  8. poj1015 01二维背包

    /* 给定辩控双方给每个人的打分p[i],d[i], dp[j][k]表示前i个人有j个被选定,选定的人的辩控双方打分差之和是k,此状态下的最大辩控双方和 按01背包做,体积一维是1,体积二维是辩控双 ...

  9. Fiddler抓包8-打断点(bpu)

    前言 先给大家讲一则小故事,在我们很小的时候是没有手机的,那时候跟女神聊天都靠小纸条.某屌丝A男对隔壁小王的隔壁女神C倾慕已久,于是天天小纸条骚扰,无奈中间隔着一个小王,这样小王就负责传小纸条了.有一 ...

  10. pytest四:fixture_yield 实现 teardown

    既然有 setup 那就有 teardown,fixture 里面的 teardown 用 yield 来唤醒 teardown的执行 在所有用例执行完后执行:yield import pytest ...