codeforces 232D Fence
来源:互联网 发布:学arm用先学单片机吗 编辑:程序博客网 时间:2024/06/05 07:52
敲了1个小时左右,sb错误调了2个小时。。。真是醉了,各种报警
题解的话这儿的写的不错,但是我是看了个大概思路然后自己想的,这种东西还是自己想想比较好呢
点击打开链接
注释上各种错误。。。
#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <cmath>#include <queue>#include <vector>using namespace std;#define N 200010#define INF 0x7fffffffint Last_n,tot,q,t1,t2;int Ws[N],Wv[N],sa[N],Rank[N],f[N][30];int Use_a[N],Use_b[N],r[N],height[N],go[N];char S[N];struct Node{ int value,id; bool operator < (const Node &a) const{ return value<a.value; }}A[N*2];struct Bjzy{ int L,R; int sum;}t[N*25]; //记得不是*4。。。int root[N];inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();} return x*f;}void Updata(int &i,int l,int r,int pos){ t[++tot]=t[i];i=tot; t[i].sum++; if(l==r) return; int mid=(l+r)/2; if(pos<=mid) Updata(t[i].L,l,mid,pos); else Updata(t[i].R,mid+1,r,pos);}int Query(int i,int j,int l,int r,int left,int right){ if(l>=left&&r<=right) { return t[i].sum-t[j].sum; } int mid=(l+r)/2; if(right<=mid) return Query(t[i].L,t[j].L,l,mid,left,right); else if(left>mid) return Query(t[i].R,t[j].R,mid+1,r,left,right); else { return Query(t[i].L,t[j].L,l,mid,left,mid)+Query(t[i].R,t[j].R,mid+1,r,mid+1,right); } //j打成了i真是日了狗}bool Cmp(int *r,int a,int b,int len){ return r[a]==r[b]&&r[a+len]==r[b+len];}void Suf_work(int n,int m){ int *x=Use_a,*y=Use_b,*t; for(int i=0;i<m;i++)Ws[i]=0; for(int i=0;i<n;i++)Ws[x[i]=r[i]]++; for(int i=1;i<m;i++)Ws[i]+=Ws[i-1]; for(int i=n-1;i>=0;i--)sa[--Ws[x[i]]]=i; for(int j=1,p=1;p<n;j<<=1,m=p) { p=0; for(int i=n-j;i<n;i++) y[p++]=i; for(int i=0;i<n;i++)if(sa[i]>=j)y[p++]=sa[i]-j; for(int i=0;i<n;i++) Wv[i]=x[y[i]]; for(int i=0;i<m;i++) Ws[i]=0; for(int i=0;i<n;i++) Ws[Wv[i]]++; for(int i=1;i<m;i++) Ws[i]+=Ws[i-1]; for(int i=n-1;i>=0;i--) sa[--Ws[Wv[i]]]=y[i]; t=x;x=y;y=t;p=1;x[sa[0]]=0; for(int i=1;i<n;i++) x[sa[i]]=Cmp(y,sa[i-1],sa[i],j)?p-1:p++; }}void Calheight(int n){ int k=0,j; for(int i=1;i<=n;i++)Rank[sa[i]]=i; for(int i=0;i<n;height[Rank[i++]]=k) for(k?k--:0,j=sa[Rank[i]-1];r[i+k]==r[j+k];k++);}void RMQ(){ for(int i=1;i<=Last_n;i++) f[i][0]=height[i]; for(int j=1;j<=25;j++) for(int i=1;i<=Last_n;i++) { if(i+(1<<j)-1<=Last_n) f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]); }}int Get_min(int a,int b){ int x1=Rank[a],x2=Rank[b]; int l=min(x1,x2),r=max(x1,x2); l++; int qwer=(int)(log(r-l+1.0)/log(2.0)); return min(f[l][qwer],f[r-(1<<qwer)+1][qwer]);}void Find(int k,int len){ int l,r; if(k==1||Get_min(sa[k-1],sa[k])<len) t1=k; else { l=1;r=k-1; while(l<r) { int mid=(l+r)/2; if(Get_min(sa[mid],sa[k])>=len) r=mid; else l=mid+1; } t1=r; } if(k==Last_n||Get_min(sa[k],sa[k+1])<len) //特判应该放在或之前 t2=k; else { l=k+1;r=Last_n+1; //二分边界错误。。右边界设为Last_n while(l<r) { int mid=(l+r)/2; if(Get_min(sa[k],sa[mid])>=len) //把mid打成了k+1 { if(l==mid) break; l=mid; } else r=mid; } t2=l; }}int main(){ Last_n=read(); int last=read();Last_n--; for(int i=1;i<=Last_n;i++) { int x=read(); r[i-1]=x-last;last=x; A[++tot].value=r[i-1];A[tot].id=tot; A[++tot].value=-r[i-1];A[tot].id=tot; } sort(A+1,A+tot+1); A[0].value=-INF; int qwer=0; for(int i=1;i<=tot;i++) { if(A[i].value!=A[i-1].value) { go[A[i].id]=++qwer; } else go[A[i].id]=qwer; } int qqq=Last_n; for(int i=1;i<=qqq;i++) r[i-1]=go[2*(i-1)+1]; r[Last_n++]=0; for(int i=1;i<=qqq;i++) r[Last_n++]=go[2*i]; Last_n--; Suf_work(Last_n+1,qwer+10); Calheight(Last_n); RMQ();tot=0; for(int i=qqq+1;i<=Last_n;i++) { int now=i-qqq; root[now]=root[now-1]; Updata(root[now],1,Last_n,Rank[i]); } q=read(); for(int i=1;i<=q;i++) { int l=read(),r=read(); if(l==r) printf("%d\n",qqq); else { int Ans=0;int len=r-l; Find(Rank[l-1],r-l); if(l-len-1>=1) //len当做1 Ans+=Query(root[l-len-1],root[0],1,Last_n,t1,t2); if(r+1<=qqq) Ans+=Query(root[qqq],root[r],1,Last_n,t1,t2); printf("%d\n",Ans); } } return 0;}
0 0
- codeforces 232D. Fence
- codeforces 232D Fence
- CF 232D Fence
- codeforces #145 B Fence
- codeforces 448CPainting Fence
- C. Painting Fence codeforces
- Codeforces 234 F. Fence
- CodeForces - 363B Fence
- codeforces 234F - Fence
- CodeForces 363B - Fence
- codeforces C. Painting Fence
- Codeforces 363B Fence
- codeforces 363B Fence
- CodeForces 232D
- codeforces Wooden Fence 简单DP
- codeforces 240B - Fence DP
- Codeforces 270A - Fancy Fence
- Codeforces 448 C. Painting Fence
- Logstash+ElasticSearch+Kibana日志分析系统
- 提交spark sample作业失败
- Android WebView 加载本地SD卡的html
- Extjs TreeStore无限制加载数据的问题
- Media foundation——Media source:Writing a Custom Media Source
- codeforces 232D Fence
- PHP中return 和 exit 、break和contiue 区别与用法
- 43. Multiply Strings
- intellij的link with editor功能
- SpringMVC实现JSON数据的请求与响应
- Python 连接 MySQL数据库
- Ofbiz Web详解(Ofbiz后门页)
- 宏的使用__VA_ARGS__, __FILE__, __FUNCTION__,__TIME__等
- 【第八章】 对ORM的支持 之 8.4 集成JPA ——跟我学spring3