bzoj 1513 POI2006 Tet-Tetris 3D 二维线段树+标记永久化
1511: [POI2006]OKR-Periods of Words
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 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
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=0,f=1;char ch=getchar(); 16 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} 17 while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} 18 return x*f; 19 } 20 inline void write(int x) 21 { 22 if(x<0) putchar('-'),x=-x; 23 if (x==0) putchar(48); 24 int num=0;char c[15]; 25 while(x) c[++num]=(x%10)+48,x/=10; 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)>>1; 42 if (y<=mid) change(ls,l,mid,x,y,z); 43 else if (x>mid) change(rs,mid+1,r,x,y,z); 44 else change(ls,l,mid,x,mid,z),change(rs,mid+1,r,mid+1,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)>>1,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+1,r,x,y)); 52 else res=max(res,max(query(ls,l,mid,x,mid),query(rs,mid+1,r,mid+1,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(1,1,S,qd,qu,z); 62 if (l==x&&y==r){tag[p].change(1,1,S,qd,qu,z);return;} 63 int mid=(l+r)>>1; 64 if (y<=mid) change(ls,l,mid,x,y,z); 65 else if (x>mid) change(rs,mid+1,r,x,y,z); 66 else change(ls,l,mid,x,mid,z),change(rs,mid+1,r,mid+1,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(1,1,S,qd,qu); 71 int mid=(l+r)>>1,res=tag[p].query(1,1,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+1,r,x,y)); 74 else res=max(res,max(query(ls,l,mid,x,mid),query(rs,mid+1,r,mid+1,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=1;i<=n;i++) 86 { 87 d=read(),s=read(),w=read(),x=read(),y=read(); 88 ql=x+1,qr=x+d,qd=y+1,qu=y+s; 89 int ans=T.query(1,1,D,ql,qr); 90 T.change(1,1,D,ql,qr,ans+w); 91 } 92 qd=1,qu=S; 93 write(T.query(1,1,D,1,D)); 94 }