1511: [POI2006]OKR-Periods of Words

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 351  Solved: 220
[Submit][Status][Discuss]

Description

一个串是有限个小写字符的序列,特别的,一个空序列也可以是一个串. 一个串P是串A的前缀, 当且仅当存在串B, 使得 A = PB. 如果 P A 并且 P 不是一个空串,那么我们说 P 是A的一个proper前缀. 定义Q 是A的周期, 当且仅当Q是A的一个proper 前缀并且A是QQ的前缀(不一定要是proper前缀). 比如串 abab 和 ababab 都是串abababa的周期. 串A的最大周期就是它最长的一个周期或者是一个空串(当A没有周期的时候), 比如说, ababab的最大周期是abab. 串abc的最大周期是空串. 给出一个串,求出它所有前缀的最大周期长度之和.

Input

第一行一个整数 k ( 1 k 1 000 000) 表示串的长度. 接下来一行表示给出的串.

Output

输出一个整数表示它所有前缀的最大周期长度之和.

Sample Input

8
babababa

Sample Output

24
 
题目大意:给定一个矩阵,初始每个位置上的元素都是0,每次选择一个子矩形,将这个子矩形内的值修改为这个子矩形内的最大值+h,
求最终所有位置上的最大
 
题解:维护一个数据结构标记永久化,二维线段树即可。
 
  1. #include<cstring>
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<algorithm>
  5. #include<iostream>
  6.  
  7. #define N 3007
  8.  
  9. #define Wb putchar(' ')
  10. #define We putchar('\n')
  11. #define rg register int
  12. using namespace std;
  13. inline int read()
  14. {
  15. int x=,f=;char ch=getchar();
  16. while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
  17. while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
  18. return x*f;
  19. }
  20. inline void write(int x)
  21. {
  22. if(x<) putchar('-'),x=-x;
  23. if (x==) putchar();
  24. int num=;char c[];
  25. while(x) c[++num]=(x%)+,x/=;
  26. while(num) putchar(c[num--]);
  27. }
  28.  
  29. int D,S,n;
  30. int ql,qr,qd,qu;
  31.  
  32. #define ls p<<1
  33. #define rs p<<1|1
  34. struct segx
  35. {
  36. int v[N],tag[N];
  37. void change(int p,int l,int r,int x,int y,int z)
  38. {
  39. v[p]=max(v[p],z);
  40. if (l==x&&y==r){tag[p]=max(tag[p],z);return;}
  41. int mid=(l+r)>>;
  42. if (y<=mid) change(ls,l,mid,x,y,z);
  43. else if (x>mid) change(rs,mid+,r,x,y,z);
  44. else change(ls,l,mid,x,mid,z),change(rs,mid+,r,mid+,y,z);
  45. }
  46. int query(int p,int l,int r,int x,int y)
  47. {
  48. if (l==x&&y==r) return v[p];
  49. int mid=(l+r)>>,res=tag[p];
  50. if (y<=mid) res=max(res,query(ls,l,mid,x,y));
  51. else if (x>mid) res=max(res,query(rs,mid+,r,x,y));
  52. else res=max(res,max(query(ls,l,mid,x,mid),query(rs,mid+,r,mid+,y)));
  53. return res;
  54. }
  55. };
  56. struct segy
  57. {
  58. segx v[N],tag[N];
  59. void change(int p,int l,int r,int x,int y,int z)
  60. {
  61. v[p].change(,,S,qd,qu,z);
  62. if (l==x&&y==r){tag[p].change(,,S,qd,qu,z);return;}
  63. int mid=(l+r)>>;
  64. if (y<=mid) change(ls,l,mid,x,y,z);
  65. else if (x>mid) change(rs,mid+,r,x,y,z);
  66. else change(ls,l,mid,x,mid,z),change(rs,mid+,r,mid+,y,z);
  67. }
  68. int query(int p,int l,int r,int x,int y)
  69. {
  70. if (l==x&&y==r) return v[p].query(,,S,qd,qu);
  71. int mid=(l+r)>>,res=tag[p].query(,,S,qd,qu);
  72. if (y<=mid) res=max(res,query(ls,l,mid,x,y));
  73. else if (x>mid) res=max(res,query(rs,mid+,r,x,y));
  74. else res=max(res,max(query(ls,l,mid,x,mid),query(rs,mid+,r,mid+,y)));
  75. return res;
  76. }
  77. }T;
  78. #undef ls
  79. #undef rs
  80.  
  81. int main()
  82. {
  83. D=read(),S=read(),n=read();
  84. rg d,s,w,x,y;
  85. for (rg i=;i<=n;i++)
  86. {
  87. d=read(),s=read(),w=read(),x=read(),y=read();
  88. ql=x+,qr=x+d,qd=y+,qu=y+s;
  89. int ans=T.query(,,D,ql,qr);
  90. T.change(,,D,ql,qr,ans+w);
  91. }
  92. qd=,qu=S;
  93. write(T.query(,,D,,D));
  94. }

bzoj 1513 POI2006 Tet-Tetris 3D 二维线段树+标记永久化的更多相关文章

  1. 洛谷P3437 [POI2006]TET-Tetris 3D(二维线段树 标记永久化)

    题意 题目链接 Sol 二维线段树空间复杂度是多少啊qwqqq 为啥这题全网空间都是\(n^2\)还有人硬要说是\(nlog^2n\)呀.. 对于这题来说,因为有修改操作,我们需要在外层线段树上也打标 ...

  2. BZOJ4785 [Zjoi2017]树状数组 【二维线段树 + 标记永久化】

    题目链接 BZOJ4785 题解 肝了一个下午QAQ没写过二维线段树还是很难受 首先题目中的树状数组实际维护的是后缀和,这一点凭分析或经验或手模观察可以得出 在\(\mod 2\)意义下,我们实际求出 ...

  3. 洛谷 P3688 - [ZJOI2017]树状数组(二维线段树+标记永久化)

    题面传送门 首先学过树状数组的应该都知道,将树状数组方向写反等价于前缀和 \(\to\) 后缀和,因此题目中伪代码的区间求和实质上是 \(sum[l-1...n]-sum[r...n]=sum[l-1 ...

  4. 【BZOJ1513】[POI2006]Tet-Tetris 3D 二维线段树

    [BZOJ1513][POI2006]Tet-Tetris 3D Description Task: Tetris 3D "Tetris" 游戏的作者决定做一个新的游戏, 一个三维 ...

  5. 洛谷.3437.[POI2006]TET-Tetris 3D(二维线段树)

    题目链接 下落一个d*s的方块,则要在这个平面区域找一个最高的h' 更新整个平面区域的值为h+h' 对于本题,维护最大高度h和all 对于平面的x轴维护一棵线段树t1,每个t1的节点维护对应y轴的两棵 ...

  6. BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树

    题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...

  7. BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

    题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...

  8. BZOJ 3489 A simple rmq problem 可持久化KDtree/二维线段树

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题意概述: 给出一个序列,每次询问一个序列区间中仅出现了一次的数字最大是多少,如果 ...

  9. [BZOJ4785][ZJOI2017]树状数组(概率+二维线段树)

    4785: [Zjoi2017]树状数组 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 297  Solved: 195[Submit][Status ...

随机推荐

  1. K-近邻算法入门

    K-近邻算法的直观理解就是:给定一个训练集合,对于新的实例,在训练集合中找到k个与该实例最近的邻居,然后根据“少数服从多数”原则判断该实例归属于哪一类,又称“随大流” K-近邻算法的三大要素:K值得选 ...

  2. 【Pthon入门学习】99乘法表

    学习知识点: 1. string.join(seq): 以string字符串作为分隔符,将seq的所有元素拼接成一个新的字符串 s = ['%d * %d = %d' % (y, 4, 4*y) fo ...

  3. python实现lower_bound和upper_bound

    由于对于二分法一直都不是很熟悉,这里就用C++中的lower_bound和upper_bound练练手.这里用python实现 lower_bound和upper_bound本质上用的就是二分法,lo ...

  4. Python最简编码规范

    前言 本文是阅读<Python Coding Rule>之后总结的最为精华及简单的编码规范,根据每个人不同喜好有些地方会有不同的选择,我只是做了对自己来说最简单易行的选择,仅供大家参考. ...

  5. 如何计算FOB价格

    FOB价格是国际贸易术语常有的一种算法,针对不同的对象,FOB价格也有不一样的算法.对于做外贸生意的朋友,需要了解FOB价格以及各项费用名称,以及如何计算FOB价格. FOB价格是国际FOB价格语常有 ...

  6. 第八次ScrumMeeting博客

    第八次ScrumMeeting博客 本次会议于11月2日(四)22时整在3公寓725房间召开,持续20分钟. 与会人员:刘畅.辛德泰.窦鑫泽.张安澜.赵奕.方科栋. 1. 每个人的工作(有Issue的 ...

  7. Pythagorean Triples毕达哥斯拉三角(数学思维+构造)

    Description Katya studies in a fifth grade. Recently her class studied right triangles and the Pytha ...

  8. python struct详解

    转载:https://www.cnblogs.com/gala/archive/2011/09/22/2184801.html 有的时候需要用python处理二进制数据,比如,存取文件,socket操 ...

  9. MacBook Pro 15寸常见问题及修复

    苹果MacBook Pro更换SSD硬盘攻略教程 MacBook pro开机黑屏解决 苹果电脑 MAC PRO 开机黑屏了 MacBook Pro 开机后黑屏,怎么办啊 如果 Mac 无法开机 Mac ...

  10. 跨域写cookie

    假设a站想往b站写cookie,那么目前有两种方案,参考如下: 第一种(使用jsonp): a站js代码如下: $.ajax({ url: 'http://www.b.com/jsonp.jsp?do ...