首先因为固定询问长度,所以我们可以将整个长度为n的数列hash成长度为n-k+1的数列,每次询问的序列也hash成一个数,然后询问这个数是不是在某个区间中出现过,这样我们可以根据初始数列的权值建立可持久化线段树,对于每个询问先二分判断是否出现在数列中过,然后再判断是否在区间内出现过。也可以离线将询问和数列建立可持久化线段树,那么直接判断就可以了,但是空间消耗会大些。

  反思:偷懒直接用的map判的是否出现,然后改了hash用long long存之后map_insert没有改,然后就一直WA。

     不知道数据的范围,开大了数组好多。

  1. /**************************************************************
  2. Problem: 3207
  3. User: BLADEVIL
  4. Language: C++
  5. Result: Accepted
  6. Time:6580 ms
  7. Memory:130804 kb
  8. ****************************************************************/
  9.  
  10. //By BLADEVIL
  11. #include <map>
  12. #include <cstdio>
  13. #include <cstring>
  14. #include <algorithm>
  15. #define maxn 500010
  16. #define LL long long
  17.  
  18. using namespace std;
  19.  
  20. struct segment {
  21. int left,right,cnt;
  22. int son[];
  23. segment() {
  24. left=right=cnt=;
  25. memset(son,,sizeof son);
  26. }
  27. }t[*maxn];
  28.  
  29. struct rec {
  30. int num,key;
  31. LL hash;
  32. rec() {
  33. hash=num=key=;
  34. }
  35. }a[maxn];
  36.  
  37. int n,m,k,sum,tot;
  38. int rot[maxn];
  39. map<LL,int>tree;
  40.  
  41. bool cmp1(rec x,rec y) {
  42. return x.hash<y.hash;
  43. }
  44.  
  45. bool cmp2(rec x,rec y) {
  46. return x.num<y.num;
  47. }
  48.  
  49. void map_insert(LL x,int y) {
  50. if (tree.find(x)==tree.end()) tree.insert(pair<LL,int>(x,y));
  51. }
  52.  
  53. void build(int &x,int l,int r) {
  54. if (!x) x=++tot;
  55. t[x].left=l; t[x].right=r;
  56. if (l==r) return ;
  57. int mid=t[x].left+t[x].right>>;
  58. build(t[x].son[],l,mid); build(t[x].son[],mid+,r);
  59. }
  60.  
  61. void insert(int &x,int rot,int y) {
  62. if (!x) x=++tot;
  63. t[x].left=t[rot].left; t[x].right=t[rot].right;
  64. if (t[x].left==t[x].right) {
  65. t[x].cnt=t[rot].cnt+;
  66. return ;
  67. }
  68. int mid=t[x].left+t[x].right>>;
  69. if (y>mid) {
  70. t[x].son[]=t[rot].son[];
  71. insert(t[x].son[],t[rot].son[],y);
  72. } else {
  73. t[x].son[]=t[rot].son[];
  74. insert(t[x].son[],t[rot].son[],y);
  75. }
  76. t[x].cnt=t[rot].cnt+;
  77. }
  78.  
  79. int query(int lx,int rx,int y) {
  80. if (t[lx].left==t[lx].right) return t[rx].cnt-t[lx].cnt;
  81. int mid=t[lx].left+t[lx].right>>;
  82. if (y>mid) return query(t[lx].son[],t[rx].son[],y); else return query(t[lx].son[],t[rx].son[],y);
  83. }
  84.  
  85. int main() {
  86. scanf("%d%d%d",&n,&m,&k);
  87. for (int i=;i<=n;i++) scanf("%d",&a[i].key);
  88. n=n-k+;
  89. for (int i=;i<=n;i++)
  90. for (int j=i;j<=i+k-;j++) a[i].hash=a[i].hash*+a[j].key;
  91. for (int i=;i<=n;i++) a[i].num=i;
  92. sort(a+,a+n+,cmp1); sum=; LL cur=a[].hash;
  93. //for (int i=1;i<=n;i++) printf("%d ",a[i].hash); printf("\n");
  94. for (int i=;i<=n;i++)
  95. if (a[i].hash==cur) a[i].key=sum; else cur=a[i].hash,a[i].key=++sum;
  96. sort(a+,a+n+,cmp2);
  97. //for (int i=1;i<=n;i++) printf("%d ",a[i].key); printf("\n");
  98. for (int i=;i<=n;i++) map_insert(a[i].hash,a[i].key);
  99. build(rot[],,sum);
  100. for (int i=;i<=n;i++) insert(rot[i],rot[i-],a[i].key);
  101. while (m--) {
  102. int l,r; scanf("%d%d",&l,&r); if (r>n) r=n;
  103. LL ha=;
  104. for (int i=;i<=k;i++) {
  105. int x; scanf("%d",&x);
  106. ha=ha*+x;
  107. }
  108. map<LL,int>::iterator p=tree.find(ha);
  109. if (p==tree.end()) {
  110. printf("Yes\n");
  111. continue;
  112. }
  113. int y=p->second;
  114. if (query(rot[l-],rot[r],y)>) printf("No\n"); else printf("Yes\n");
  115. //printf("%d\n",query(rot[l-1],rot[r],y));
  116. }
  117. return ;
  118. }

bzoj 3207 可持久化线段树的更多相关文章

  1. bzoj 3207 可持久化线段树+hash

    这道题要看出来这个做法还是比较容易说一下细节 1.因为要用hash的区间值域来建树,而hash为了不冲突要开的很大,所以值域就会比较的大,不过这道题好的一点是没有修改,所以直接离散一下就会小很多 2. ...

  2. bzoj 3123 可持久化线段树启发式合并

    首先没有连边的操作的时候,我们可以用可持久化线段树来维护这棵树的信息,建立权值可持久化线段树,那么每个点继承父节点的线段树,当询问为x,y的时候我们可以询问rot[x]+rot[y]-rot[lca( ...

  3. bzoj 3524 可持久化线段树

    我们可以先离散化,然后建立权值的可持久化线段树,记录每个数出现的次数,对于区间询问直接判断左右儿子的cnt是不是大于(r-k+1)/2,然后递归到最后一层要是还是大于就有,否则不存在. 反思:挺简单一 ...

  4. BZOJ 2588: Spoj 10628. Count on a tree-可持久化线段树+LCA(点权)(树上的操作) 无语(为什么我的LCA的板子不对)

    2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MBSubmit: 9280  Solved: 2421 ...

  5. [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】

    题目链接:BZOJ - 3207 题目分析 先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x . 这一步可以使用可持久化线段树来做,虽然感觉可以有更 ...

  6. [BZOJ 3218] A + B Problem 【可持久化线段树 + 网络流】

    题目连接:BZOJ - 3218 题目分析 题目要求将 n 个点染成黑色或白色,那么我们可以转化为一个最小割模型. 我们规定一个点 i 最后属于 S 集表示染成黑色,属于 T 集表示染成白色,那么对于 ...

  7. BZOJ.4771.七彩树(可持久化线段树)

    BZOJ 考虑没有深度限制,对整棵子树询问怎么做. 对于同种颜色中DFS序相邻的两个点\(u,v\),在\(dfn[u],dfn[v]\)处分别\(+1\),\(dfn[LCA(u,v)]\)处\(- ...

  8. BZOJ.2653.[国家集训队]middle(可持久化线段树 二分)

    BZOJ 洛谷 求中位数除了\(sort\)还有什么方法?二分一个数\(x\),把\(<x\)的数全设成\(-1\),\(\geq x\)的数设成\(1\),判断序列和是否非负. 对于询问\(( ...

  9. BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)

    BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...

随机推荐

  1. css那些事儿2 盒子模型

    盒子模型是网页元素所占据页面窗口的矩形范围,是网页布局的核心基础之一,这里的盒子模型与我们平常收到的包裹类似. 一个包裹从内到外,分为真实物品部分,物品与外壳之间的填充区,外壳的厚度,当多个包裹放置在 ...

  2. Vue于React特性简单对比(一)

    一,对象实体对比 vue的对象实体依然是html,而react的对象实体已经变味jsx,一种新的语法结构. vue的html与react的jsx都可以进行拆分,拆分成更细小的组件,组件之间可以传值. ...

  3. 【hdu4507】吉哥系列故事——恨7不成妻 数位dp

    题目描述 求 $[L,R]$ 内满足:数位中不包含7.数位之和不是7的倍数.本身不是7的倍数 的所有数的平方和 mod $10^9+7$ . 输入 输入数据的第一行是case数T(1 <= T ...

  4. 【hdu4734】F(x) 数位dp

    题目描述 对于一个非负整数 $x=​​\overline{a_na_{n-1}...a_2a_1}$ ,设 $F(x)=a_n·2^{n-1}+a_{n-1}·2^{n-2}+...+a_2·2^1+ ...

  5. Django 2.0 学习(13):Django模板继承和静态文件

    Django模板继承和静态文件 模板继承(extend) Django模板引擎中最强大也是最复杂的部分就是模板继承了,模板继承可以让我们创建一个基本的"骨架"模板,它可以包含网页中 ...

  6. 【题解】CF#24 D-Broken Robots

    在某次考试的时候用过的办法,懒人必备……[笑哭] 一个非常显然的 dp,我们用 \(f[i][j]\) 表示第 \(i\) 行第 \(j\) 列的格子走到最后一排的期望步数转移即为 \(f[i][j] ...

  7. [NOIP2015 TG D2T3]运输计划

    题目大意: 给你一棵n个节点的树,有边权,有多个任务,每个要求从ui号节点到 vi号节点去.m 个计划, 这 m 个计划会同时开始.当这 m 个任务都完成时,工作完成. 现在可以把任意一个边的边权变为 ...

  8. CodeForces.5A Chat Server's Outgoing Traffic

    Chat Server's Outgoing Traffic 点我挑战提目 考察点 模拟 字符串 Time Mem Len Lang 30 0 543 c++ 题意分析 给出类似一个群的即时通讯系统, ...

  9. 最近经历的一些大数据(Spark/Hadoop)面试题

    1.简答说一下hadoop的map-reduce编程模型 首先map task会从本地文件系统读取数据,转换成key-value形式的键值对集合 使用的是hadoop内置的数据类型,比如longwri ...

  10. maven根据不同的运行环境,打包不同的配置文件(转载)

    使用maven管理项目中的依赖,非常的方便.同时利用maven内置的各种插件,在命令行模式下完成打包.部署等操作,可方便后期的持续集成使用. 但是每一个maven工程(比如web项目),开发人员在开发 ...