BZOJ3939 [Usaco2015 Feb]Cow Hopscotch

来源:互联网 发布:淘宝网旗袍 编辑:程序博客网 时间:2024/06/05 19:18

考虑分治,一个点只会受到他左半边和上半边的影响,所以像cdq分治一样,先递归左半边,然后处理左半边对右半边的影响,再递归右半边

记录一个全局和和每个颜色的和即可

#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<algorithm>#include<iomanip>#include<vector>#include<stack>#include<queue>#include<map>#include<set>#include<bitset>using namespace std;#define MAXN 1010#define MAXM 1010#define ll long long#define INF 1000000000#define MOD 1000000007#define eps 1e-8ll f[MAXN][MAXN];ll a[MAXN][MAXN];ll n,m,k;ll vis[MAXN*MAXN];ll s[MAXN*MAXN];ll T;inline void ck(ll x){if(vis[x]!=T){s[x]=0;}vis[x]=T;}void xrf(ll l,ll r){if(l==r){return ;}ll i,j;ll mid=l+r>>1;xrf(l,mid);ll sum=0;T++;for(i=2;i<=n;i++){for(j=l;j<=mid;j++){(sum+=f[i-1][j])%=MOD;ck(a[i-1][j]);(s[a[i-1][j]]+=f[i-1][j])%=MOD;}for(j=mid+1;j<=r;j++){ck(a[i][j]);(f[i][j]+=sum-s[a[i][j]]+MOD)%=MOD;}}xrf(mid+1,r);}int main(){ll i,j;scanf("%lld%lld%lld",&n,&m,&k);f[1][1]=1;for(i=1;i<=n;i++){for(j=1;j<=m;j++){scanf("%lld",&a[i][j]);}}xrf(1,m);printf("%lld\n",f[n][m]);return 0;}/**/


0 0
原创粉丝点击