首页 > 其他分享 >P9108 [PA2020] Malowanie płotu

P9108 [PA2020] Malowanie płotu

时间:2024-09-03 10:16:58浏览次数:15  
标签:s2 sum st dp PA2020 define otu Malowanie mod

题意:

给定 \(n,m\),一个区间序列 \(\{[L_1,R_1],[L_2,R_2],\cdots,[L_n,R_n]\}\) 被称为好的当且仅当:

  • \(\forall i \in [1,n],1 \le L_i \le R_i \le m\)。

  • \(\forall i \in [1,n-1],[L_i,R_i] \cup [L_{i+1},R_{i+1}] \ne \emptyset\)。

输出好的序列个数对给定质数 \(p\) 取模的结果

\(nm \le 10^7\)。

思路:

考虑动态规划算法,定义 \(dp_{i,l,r}\) 表示第 \(i\) 次为 \([l,r]\),则状态转移方程为:

\[dp_{i,l,r} = \sum_{L=1}^r \sum_{R=\max(L,l)}^m dp_{L,R} \]

这种是不好转移的,考虑做一个容斥,用总的减去与 \(L \le R < l\) 或 \(r< L \le R\) 的贡献,记 \(s_i\) 表示所有 \(dp_{i,l,r}\) 的和:

\[dp_{i,l,r} = s_{i-1} - \sum_{L=1}^{l-1} \sum_{R=L}^{l-1} dp_{L,R} - \sum_{L=r+1}^m \sum_{R=L}^m dp_{L,R} \]

我们可以记 \(f_{i,j}\) 表示所有满足 \(r \le j\) 的 \(dp_{i,l,r}\) 的和,记 \(g_{i,j}\) 满足所有 \(j \le l\) 的 \(dp_{i,l,r}\) 的和,则状态转移方程更新为:

\[dp_{i,l,r} = f_{i-1,m} - f_{i-1,l-1} - g_{i-1,r+1} \]

时间复杂度通过前缀和优化至 \(O(nm^2)\),考虑继续优化。

考虑如何快速求 \(f_{i,j}\) 和 \(g_{i,j}\),可以直接爆推:

\[\begin{aligned} f_{i,j} &= \sum_{l=1}^j \sum_{r=l}^j dp_{i,l,r} \\ &= \sum_{l=1}^j \sum_{r=l}^j f_{i-1,m} - f_{i-1,l-1} - g_{i-1,r+1} \\ & = \frac{j(j+1)}{2} f_{i-1,m} - \Big( \sum_{l=1}^j \sum_{r=l}^j f_{i-1,l-1} + g_{i-1,r+1} \Big) \\ &= \frac{j(j+1)}{2} f_{i-1,m} - \sum_{l=1}^j (j-l+1) \times f_{i-1,l-1} - \sum_{r=1}^j r \times g_{i-1,r+1} \\ &= \frac{j(j+1)}{2} f_{i-1,m} - \sum_{r=1}^j r \times g_{i-1,r+1} - \Big( \sum_{l=1}^j j \times f_{i-1,l-1} - \sum_{l=1}^j (l-1) \times f_{i-1,l-1} \Big) \\ &= \frac{j(j+1)}{2} f_{i-1,m} - \sum_{r=1}^j r \times g_{i-1,r+1} - j\sum_{l=1}^j f_{i-1,l-1} + \sum_{l=1}^j (l-1) \times f_{i-1,l-1} \end{aligned} \]

\[\begin{aligned} g_{i,j} &= \sum_{l=j}^m \sum_{r=l}^m dp_{i,l,r} \\ &= \sum_{l=j}^m \sum_{r=l}^m f_{i-1,m} - f_{i-1,l-1} - g_{i-1,r+1} \\ &= \frac{(m+j)(m-j+1)}{2} f_{i-1,m} - \Big(\sum_{l=j}^m \sum_{r=l}^m f_{i-1,l-1} + g_{i-1,r+1} \Big) \\ &= \frac{(m+j)(m-j+1)}{2} f_{i-1,m} - \sum_{l=j}^m (m-l+1) f_{i-1,l-1}-\sum_{r=j}^m (r-j + 1) g_{i-1,r+1} \\ & = \frac{(m+j)(m-j+1)}{2} f_{i-1,m} - \sum_{l=j}^m (m-l+1) f_{i-1,l-1} - \sum_{r=j}^m r \times g_{i-1,r+1} + (j-1) \sum_{r=j}^m g_{i-1,r+1} \end{aligned} \]

这样时间复杂度优化为 \(O(nm)\)。

完整代码:

#include<bits/stdc++.h>
#define Add(x,y) (x+y>=mod)?(x+y-mod):(x+y)
#define lowbit(x) x&(-x)
#define pi pair<ll,ll>
#define pii pair<ll,pair<ll,ll>>
#define iip pair<pair<ll,ll>,ll>
#define ppii pair<pair<ll,ll>,pair<ll,ll>>
#define fi first
#define se second
#define full(l,r,x) for(auto it=l;it!=r;it++) (*it)=x
#define Full(a) memset(a,0,sizeof(a))
#define open(s1,s2) freopen(s1,"r",stdin),freopen(s2,"w",stdout);
#define For(i,l,r) for(register int i=l;i<=r;i++)
#define _For(i,l,r) for(register int i=r;i>=l;i--)
using namespace std;
typedef double db;
typedef unsigned long long ull;
typedef long long ll;
bool Begin;
const int N=1e7+10; 
inline int read(){
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')
          f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return x*f;
}
inline void write(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9)
	  write(x/10);
	putchar(x%10+'0');
}
int n,m,st,s1,s2,s3,s4,mod;
int f[2][N],g[2][N];
bool End;
int main(){
	n=read(),m=read(),mod=read();
	For(i,1,m)
	  f[0][i]=(f[0][i-1]+i)%mod;
	_For(i,1,m)
	  g[0][i]=(g[0][i+1]+m-i+1)%mod;
	For(i,2,n){
		st^=1;
		For(j,0,m+1)
		  f[st][j]=g[st][j]=0; 
		s1=s2=s3=s4=0;
		For(j,1,m){
			s1=(s1+j)%mod;
			s2=(s2+1ll*g[st^1][j+1]*j%mod)%mod;
			s3=(s3+f[st^1][j-1])%mod;
			s4=(s4+1ll*f[st^1][j-1]*(j-1)%mod)%mod;
			f[st][j]=(1ll*s1*f[st^1][m]%mod-s2-1ll*s3*j%mod+s4+mod*2ll)%mod;
		}
		s1=s2=s3=s4=0;
		_For(j,1,m){
			s1=(s1+m-j+1)%mod;
			s2=(s2+1ll*f[st^1][j-1]*(m-j+1)%mod)%mod;
			s3=(s3+1ll*g[st^1][j+1]*j%mod)%mod;
			s4=(s4+g[st^1][j+1])%mod;
			g[st][j]=(1ll*s1*f[st^1][m]%mod-s2-s3+1ll*s4*(j-1)%mod+mod*2)%mod;
		}
	}
	write(f[st][m]);
	cerr<<'\n'<<abs(&Begin-&End)/1048576<<"MB";
	return 0;
}

标签:s2,sum,st,dp,PA2020,define,otu,Malowanie,mod
From: https://www.cnblogs.com/rgw2010/p/18394036

相关文章

  • 利用蓝莲花BlueLotus通过XSS获取Cookie
    蓝莲花BlueLotus_XSSReceiver清华大学蓝莲花战队做的一个平台,优点是足够小,不需要数据库,只要有个能运行php的环境就可以了,缺点是一般只适合一个人用。配置蓝莲花拉取dockerdockerpullromeoz/docker-apache-php:5.6上传文件文件下载地址:https://github.com/trysec/......
  • 0008、基于51单片机protues仿真的双机通信设计(仿真图、源代码、讲解视频)
    0008、基于51单片机protues仿真的双机通信设计(仿真图、源代码、讲解视频)该设计为51单片机protues仿真的双机通信设计,实现双机通信、数据交互等功能;功能实现如下:使用51单片机实现双机通信,T1作为波特率发生器,使用工作模式1,中断实现,在PROTEUS上仿真实现.要求如下:1、单片机1发......
  • 0007、基于51单片机protues仿真的农田自动灌溉系统的设计(仿真图、源代码)
    0007、基于51单片机protues仿真的农田自动灌溉系统的设计(仿真图、源代码)该设计为51单片机protues仿真的农田自动灌溉系统,实现农田自动灌溉;功能实现如下:1、系统使用51单片机为核心控制;2、SHT10温湿度传感器实现温湿度采集;3、LCD12864实现相关信息显示;4、继电器控制电机转......
  • 0006、基于51单片机protues仿真的控制四个伺服电机的采摘机械手(仿真图、源代码)
    0006、基于51单片机protues仿真的控制四个伺服电机的采摘机械手(仿真图、源代码)该设计为51单片机protues仿真的控制四个伺服电机的采摘机械手,实现采摘机械手;功能实现如下:1、使用51单片机为核心控制;2、按键和可调电阻控制电机运动;3、四个伺服电机模拟机械手采摘;4、LED指示......
  • 0005、基于51单片机protues仿真的红外遥控编解码无线系统设计(仿真图、源代码)
    0005、基于51单片机protues仿真的红外遥控编解码无线系统设计(仿真图、源代码)功能介绍如下:   红外线编码是数据传输和家用电器遥控常用的一种通讯方法,其实质是一种脉宽调制的串行通讯。家电遥控中常用的红外线编码电路有μPD6121G型HT622型和7461型等。  这里就以......
  • 51单片机嵌入式开发:Protues开发板仿真平台制作
    Protues开发板仿真平台制作1软件配置2软件配置3初步建的工程及所用器件列表4测试代码5Protues中常用器件对应位置。Protues开发板51开发板的制作1软件配置2软件配置新建protues工程在所有的.C文件夹中,在仿真时可以看到执行的代码位置,目前按路径观察到......
  • R:OTU根据分类级别拆分
    输入文件输出文件rm(list=ls())setwd("C:\\Users\\Administrator\\Desktop\\microtable")#设置工作目录library(dplyr)library(tidyr)library(readr)#读取文件data<-readLines('1.txt')#定义分类等级的前缀和列名prefixes<-c("k__","......
  • Protues的串口工具Virtual Terminal
    用Protues来验证ARM的串口发送,有两种办法,一种是用Protues的串口工具VirtualTerminal第二种是用串口助手(此种方法,需要下载并安装虚拟串口软件,然后用虚拟串口连接虚拟硬件和串口助手,比较麻烦) (第二种方法需要虚拟串口软件,比较麻烦,因此,建议大家使用Protues的串口工具VirtualTermi......
  • 已经调试成功的Protues工程用了一段时间后不能用的问题
    已经调试成功的Protues工程,经过一段时间后不能用的问题主要现象:(1)可以打开,运行时没有效果;(2)可以打开,运行时闪退解决办法:(1)删除原ARM芯片;(2)重新找到ARM芯片,重新加载;(3)重新连线;(4)装载hex文件;(5)运行调试 一点提示:Protues仿真时,不需要按键防抖动程序程序段: ......
  • Pytorch学习笔记-(xiaotudui)
    常用的包importtorchimporttorchvisionfromtorchimportnnfromtorch.utils.dataimportDataLoaderfromtorch.nnimportConv2d,MaxPool2d,Flatten,Linear,Sequentialfromtorch.utils.tensorboardimportSummaryWriterPytorchpytorch安装准备环境安装Anco......