首页 > 其他分享 >洛谷P3713 [BJOI2017] 机动训练 题解

洛谷P3713 [BJOI2017] 机动训练 题解

时间:2023-10-12 19:36:45浏览次数:40  
标签:now int 题解 x1 BJOI2017 x2 P3713 y1 y2

机动训练

这题的瓶颈,在于把 \(a_i^2\) 看作 \(\sum\limits_{i=1}^{a_i}\sum\limits_{j=1}^{a_i}1\),然后我们就可以看成“两两相同的机动路径都能贡献 1”。于是我们设 \(f_{x1,y1,x2,y2}\) 表示两条起点为 \((x1,y1)\) 和 \((x2,y2)\) 的相同路径的数量,然后分别枚举两条路径的方向(左上/左下/右下/右上)即可 DP。

但需要注意的是,平行于坐标轴的方向会被重复计算,所以我们应该容斥一下。

代码:

#include<bits/stdc++.h>
using namespace std;
#define y1 _19260817
#define y2 _17680321
const int mod=1e9+9;
const int N=35;
int n,m,res,d1,d2,lim;
int dx1[N],dy1[N],dx2[N],dy2[N],f[N][N][N][N];
int dx[8]={1,1,0,-1,-1,-1,0,1},dy[8]={0,1,1,1,0,-1,-1,-1};
char s[N][N];
int dfs(int x1,int y1,int x2,int y2){
    int &now=f[x1][y1][x2][y2];
    if(now!=-1) return now;
    if(s[x1][y1]!=s[x2][y2]) return now=0;
    now=1;
    for(int i=1;i<=lim;i++){
        int X1=x1+dx1[i],Y1=y1+dy1[i],X2=x2+dx2[i],Y2=y2+dy2[i];
        if(X1>=1&&X1<=n&&Y1>=1&&Y1<=m&&X2>=1&&X2<=n&&Y2>=1&&Y2<=m){
			(now+=dfs(X1,Y1,X2,Y2))%=mod;
		}
    }
    return now;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
    for(int d1=0;d1<8;d1++){
		for(int d2=0;d2<8;d2++){
		    memset(f,-1,sizeof(f));
			lim=0;
		    for(int i=(d1&1?(d1+7)%8:d1);(i+7)%8!=(d1&1?(d1+1)%8:d1);i++,i%=8){
				for(int j=(d2&1?(d2+7)%8:d2);(j+7)%8!=(d2&1?(d2+1)%8:d2);j++,j%=8){
					lim++;
					dx1[lim]=dx[i],dy1[lim]=dy[i];
					dx2[lim]=dx[j],dy2[lim]=dy[j];
				}
			}
		    int lam=((d1&1)^(d2&1))?-1:1;
		    for(int x1=1;x1<=n;x1++){
				for(int y1=1;y1<=m;y1++){
					for(int x2=1;x2<=n;x2++){
						for(int y2=1;y2<=m;y2++){
							(res+=(mod+lam*dfs(x1,y1,x2,y2))%mod)%=mod;
						}
					}
				}
			}
		}
	}
    printf("%d\n",res);
    return 0;
}

标签:now,int,题解,x1,BJOI2017,x2,P3713,y1,y2
From: https://www.cnblogs.com/xuantianhao/p/17760356.html

相关文章

  • [AGC013E] Placing Squares 题解
    PlacingSquares关键是将问题从抽象的“正方形面积”转为具象的形式:一段长度为\(d\)的区间,有两个不同的小球要放进去,则总放置方案就是\(d^2\),且不同的区间间方案是通过乘法原理结合的,刚好是题目中\(\prodd^2\)的形式。于是我们可以设计DP:设\(f_{i,j}\)表示前\(i\)个......
  • 洛谷P3118 [USACO15JAN] Moovie Mooving G 题解
    MoovieMoovingG设\(f[i][S]\)表示在第\(i\)场(注意是场,不是部)电影时,已经看了\(S\)里面的电影是否合法。然后贪心地取\(|S|\)最小的状态保存。光荣MLE了,\(21\%\)。发现当一场电影结束后,无论这一场是在哪里看的都没关系。因此我们设\(f[S]\)表示只看集合\(S\)里......
  • CF908D New Year and Arbitrary Arrangement 题解
    NewYearandArbitraryArrangement思路:期望题果然还是恶心呀!我们设\(f[i][j]\)表示当串中有\(i\)个\(a\)和\(j\)个\(ab\)时的方案数。为了方便,设\(A=\dfrac{P_a}{P_a+P_b},B=\dfrac{P_b}{P_a+P_b}\)。显然,可以这样转移:\[f[i][j]=f[i+1][j]\timesA+f[i][i+j]\ti......
  • CF264B Good Sequences 题解
    GoodSequences状态很显然,设\(f[i]\)表示位置\(i\)的最长长度。关键是转移,暴力转移是\(O(n^2)\)的,我们必须找到一个更优秀的转移。因为一个数的质因子数量是\(O(\logn)\)的,而只有和这个数具有相同质因子的数是可以转移的;因此我们可以对于每个质数\(p\),设一个\(mx_p......
  • 题解 AtCoder wtf22_day1_b【Non-Overlapping Swaps】
    题解AtCoderwtf22_day1_b【Non-OverlappingSwaps】problem给定一个排列,要求交换最多\(n-1\)对元素,使得这个排列变成[1,2,...,n]的有序排列。当然没有那么简单,对于交换还是有限制的,对于相邻的两次交换,不妨叫做\((l_i,r_i)\)和\((l_{i+1},r_{i+1})\),必须满足这两个交......
  • 题解 CF486D Valid Sets
    题目链接相当牛逼。这种找数量的题型,确定树形\(dp\)没跑了。首先思考常规树形\(dp\),不难想到设\(f_{u,a,b}\)表示以\(u\)为根节点的子树内(包括点\(u\)),最大值是\(a\),最小值是\(b\)的连通子图数量,转移很容易,但是这样时间空间复杂度是\(\rmO(n^3)\),而且无论是状态上......
  • Debian12安装elasticsearch实践及问题解决方案
    一、安装安装其实很简单,直接上官网链接:下载地址,官网提供了所有安装方式,总一款适合你。我的目标系统是Debian12,包管理是apt-get,所以就以这个为示例,仅供参考。1、先选择需要安装的版本2、导入ElasticsearchPGP密钥wget-qO-https://artifacts.elastic.co/GPG-KEY-elastic......
  • 原创题题解
    实时更新。众所周知的,原创题就是即原神又创人的题。当然有的题不会放,等考了在放。波特问题描述流水线上有\(n\)个波特,每个波特有一个工作效能\(a_i\)。对于每一个波特,当它遇到一个工件时,它会对其进行加工,耗费\(1\)个单位时间,然后把它传递给它前面中工作效能最大的波特,......
  • #9134. 翻转硬币 题解
    首先考虑一些简单的情况,比如\(m=1\)。容易发现操作1和操作2的顺序不会影响结果,于是可以钦定所有操作1在操作2之前。并且可以发现,进行完所有1后2的次数即为\((\text{连续段个数}-1)\)。然后考虑将\(m>1\)的情况。显然最后序列上每\(m\)长度分一段,则每一段都相......
  • [CF1098E] Fedya the Potter 题解
    [CF1098E]FedyathePotter题解前言一道类欧好题。题解这道题让求\(c\)数组的中位数,那么有一个比较套路的方法就是二分答案\(mid\)然后计算\(b\)数组中区间和小于\(mid\)的区间个数进行\(check\)。但是\(b\)数组总共有\(\mathcal{O}(n^2)\)项,考虑如何优化。因......