[BZOJ3939][Usaco2015 Feb]Cow Hopscotch(cdq分治)
来源:互联网 发布:安装windows 2003灰色 编辑:程序博客网 时间:2024/06/08 02:04
题目描述
传送门
题解
把一个一个的点都拆开
按横坐标分治,每一次按纵坐标排序,然后搞一个数组统计一下标号就行了
因为这里的横坐标是严格小于,所以分治的时候要保证左右两个区间不能有x相同的点
sort太慢了,都改成了归并排序的版本,时间是
代码
#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 755#define Mod 1000000007int n,m,k,cnt;struct data{int x,y,z;}q[N*N],p[N*N],np[N*N];int calc[N*N],L[N*N],R[N*N],f[N][N],ch[N*N];int cmpx(data a,data b){ return a.x<b.x;}int cmpy(data a,data b){ return a.y<b.y||(a.y==b.y&&a.x<b.x);}void cdq(int l,int r){ if (q[l].x==q[r].x) return; int mid=(l+r)>>1; if (L[mid]!=l) mid=L[mid]-1; else mid=R[mid]; int pl,pr,now; pl=l,pr=mid+1; for (int i=l;i<=r;++i) if (p[i].x<=q[mid].x) np[pl++]=p[i]; else np[pr++]=p[i]; for (int i=l;i<=r;++i) p[i]=np[i]; cdq(l,mid); pl=l,pr=mid+1; int tot=0,sum=0; while (pr<=r) { while (pl<=mid&&p[pl].y<p[pr].y) { sum=(sum+f[p[pl].x][p[pl].y])%Mod; calc[p[pl].z]=(calc[p[pl].z]+f[p[pl].x][p[pl].y])%Mod; ch[++tot]=p[pl].z; ++pl; } int now=(sum-calc[p[pr].z]+Mod)%Mod; f[p[pr].x][p[pr].y]=(f[p[pr].x][p[pr].y]+now)%Mod; ++pr; } for (int i=1;i<=tot;++i) calc[ch[i]]=0; cdq(mid+1,r); pl=l,pr=mid+1,now=l; while (pl<=mid&&pr<=r) { if (p[pl].y<=p[pr].y) np[now++]=p[pl++]; else np[now++]=p[pr++]; } while (pl<=mid) np[now++]=p[pl++]; while (pr<=r) np[now++]=p[pr++]; for (int i=l;i<=r;++i) p[i]=np[i];}int main(){ scanf("%d%d%d",&n,&m,&k); for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) { int x;scanf("%d",&x); q[++cnt].x=i,q[cnt].y=j,q[cnt].z=x; } f[1][1]=1; sort(q+1,q+cnt+1,cmpx); for (int i=1;i<=cnt;++i) if (q[i].x!=q[i-1].x) L[i]=i; else L[i]=L[i-1]; for (int i=cnt;i>=1;--i) if (q[i].x!=q[i+1].x) R[i]=i; else R[i]=R[i+1]; for (int i=1;i<=cnt;++i) p[i]=q[i]; sort(p+1,p+cnt+1,cmpy); cdq(1,cnt); f[n][m]=(f[n][m]+Mod)%Mod; printf("%d\n",f[n][m]);}
0 0
- [BZOJ3939][Usaco2015 Feb]Cow Hopscotch(cdq分治)
- BZOJ3939 [Usaco2015 Feb]Cow Hopscotch
- BZOJ3939: [Usaco2015 Feb]Cow Hopscotch
- bzoj 3939: [Usaco2015 Feb]Cow Hopscotch (CDQ分治+DP)
- bzoj3939 【USACO 2015 FEB GOLD 】cow hopscotch
- BZOJ 3939 [Usaco2015 Feb] Cow Hopscotch
- BZOJ3939 BSOJ4853 【USACO 2015 FEB GOLD 】cow hopscotch
- bzoj3939 Cow Hopscotch
- BZOJ 3939 [Usaco2015 Feb]Cow Hopscotch 线段树
- [BZOJ]4991: [Usaco2017 Feb]Why Did the Cow Cross the Road III CDQ分治+树状数组
- 【2015の复活】Hopscotch——CDQ分治
- bzoj 3942: [Usaco2015 Feb]Censoring (kmp)
- [BZOJ3942][Usaco2015 Feb]Censoring(栈+kmp)
- (bzoj 3943 [Usaco2015 Feb]SuperBull)<>
- [BZOJ3942][Usaco2015 Feb]Censoring(kmp)
- [BZOJ3942][Usaco2015 Feb]Censoring(栈+kmp)
- 时间分治(cdq分治)
- bzoj3943【Usaco2015 Feb】SuperBull
- 高精度加法(c++)
- Linux系统常见目录说明
- 266 Palindrome Permutation
- 堆
- OD脱壳-再次载入-软件无法找到入口
- [BZOJ3939][Usaco2015 Feb]Cow Hopscotch(cdq分治)
- java日志组件介绍(common-logging,log4j,slf4j,logback )
- HDU 3068 最长回文 (回文自动机)
- 数据结构—Problem B: 删除区间内的元素(线性表)
- Python3 基础语法,从入门到精通一
- Python3 基础语法 从入门到精通二
- Python3基础语法 从入门到精通三
- Codeforces 763B Timofey and rectangles(四色定理)(思维)
- C++之Set