【JZOJ6230】【20190625】梦批糼
题目
一个$n\times m \times l $的立方体,有一些位置有障碍
一次操作会随机选择一个立方体,共有\(w\)次操作
询问所有操作都不选到障碍点,被选到至少一次的点的期望
$n ,m,l \le 60\ , \ w \le 10^9 $
题解
只需要计算不包含障碍且包含一个点的立方体个数
40pts
枚举每一个立方体,前缀和判断一个立方体中是否有障碍,差分统计一个点被多少个立方体包含
时间复杂度:\(O(n^6)\)
100pts
\(dp[0-7][x][y][z]\) 表示八个方向的立方体个数
枚举立方体层的范围,将这些层的障碍或起来压成一层
变成在二维上统计矩形的个数,用单调栈即可
前缀和之后可以求出\(dp\),答案可以用\(dp\)统计
时间复杂度:\(O(n^4)\)
\(O(n^6)\)
#include<bits/stdc++.h>
#define mod 998244353
const int N=100;
using namespace std;
int n,m,l,w,a[N][N][N],s[N][N][N],ans,cnt,v[N][N][N],c[N][N][N];
void inc(int&x,int y){x+=y;if(x>=mod)x-=mod;} int pw(int x,int y){
int re=1;
while(y){
if(y&1)re=1ll*re*x%mod;
y>>=1;x=1ll*x*x%mod;
}return re;
} int cal1(int x){return x*(x+1)/2;}
int cal2(int i1,int j1,int k1,int i2,int j2,int k2){
return s[i2][j2][k2]
-s[i1-1][j2][k2]-s[i2][j1-1][k2]-s[i2][j2][k1-1]
+s[i1-1][j1-1][k2]+s[i1-1][j2][k1-1]+s[i2][j1-1][k1-1]
-s[i1-1][j1-1][k1-1];
}
void put(int i1,int j1,int k1,int i2,int j2,int k2){
c[i1][j1][k1]++;
c[i2+1][j1][k1]--;c[i1][j2+1][k1]--;c[i1][j1][k2+1]--;
c[i2+1][j2+1][k1]++;c[i2+1][j1][k2+1]++;c[i1][j2+1][k2+1]++;
c[i2+1][j2+1][k2+1]--;
}
void pre(){
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
for(int k=1;k<=l;++k){
s[i][j][k] =
a[i][j][k]
+s[i-1][j][k]+s[i][j-1][k]+s[i][j][k-1]
-s[i-1][j-1][k]-s[i-1][j][k-1]-s[i][j-1][k-1]
+s[i-1][j-1][k-1];
}
for(int i1=1;i1<=n;++i1)
for(int j1=1;j1<=m;++j1)
for(int k1=1;k1<=l;++k1){
for(int i2=i1;i2<=n;++i2){
if(cal2(i1,j1,k1,i2,j1,k1))break;
for(int j2=j1;j2<=m;++j2){
if(cal2(i1,j1,k1,i2,j2,k1))break;
for(int k2=k1;k2<=l;++k2){
if(cal2(i1,j1,k1,i2,j2,k2))break;
put(i1,j1,k1,i2,j2,k2);
cnt++;
}
}
}
}
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
for(int k=1;k<=l;++k){
c[i][j][k] =
c[i][j][k]
+c[i-1][j][k]+c[i][j-1][k]+c[i][j][k-1]
-c[i-1][j-1][k]-c[i-1][j][k-1]-c[i][j-1][k-1]
+c[i-1][j-1][k-1];
}
}
int main(){
freopen("dream.in","r",stdin);
freopen("dream.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&l,&w);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
for(int k=1;k<=l;++k)scanf("%d",&a[i][j][k]),a[i][j][k]^=1;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
for(int k=1;k<=l;++k)scanf("%d",&v[i][j][k]);
pre();
int ip=pw(1ll*cal1(n)*cal1(m)%mod*cal1(l)%mod,mod-2);
int tmp=pw(1ll*cnt*ip%mod,w);
for(int I=1;I<=n;++I)
for(int J=1;J<=m;++J)
for(int K=1;K<=l;++K)if(!a[I][J][K]){
a[I][J][K]=1;
inc(ans,1ll*v[I][J][K]*(tmp-pw(1ll*(cnt-c[I][J][K]+mod)*ip%mod,w)+mod)%mod);
a[I][J][K]=0;
}
cout<<ans<<endl;
}
\(O(n^4)\)
#include<bits/stdc++.h>
#define mod 998244353
#define ll long long
using namespace std;
const int N=110;
int n,m,l,w,a[N][N][N],v[N][N][N],s[8][N][N][N],c[N][N],d[N],st[N],f[N],tp,sum,ans;
void inc(int&x,int y){x+=y;if(x>=mod)x-=mod;}
int pw(int x,int y){
int re=1;
while(y){
if(y&1)re=(ll)re*x%mod;
y>>=1;x=(ll)x*x%mod;
}return re;
}
void ins(int x){
while(tp&&d[x]<=d[st[tp]])tp--;
sum=f[tp]+abs(x-st[tp])*d[x];
st[++tp]=x,f[tp]=sum;
}
void cal1(int t,int i1,int j1,int k1){
int i2=t&1?i1+1:i1-1,j2=t&2?j1+1:j1-1,k2=t&4?k1+1:k1-1;
s[t][i1][j1][k1]=
(0ll+
s[t][i1][j1][k1]
+s[t][i2][j1][k1]+s[t][i1][j2][k1]+s[t][i1][j1][k2]
-s[t][i1][j2][k2]-s[t][i2][j1][k2]-s[t][i2][j2][k1]
+s[t][i2][j2][k2]
)%mod;
}
//三维前缀和
int cal2(int i1,int j1,int k1){
ll re=
s[6][i1-1][1][1]+s[7][i1+1][1][1]
+s[5][1][j1-1][1]+s[7][1][j1+1][1]
+s[3][1][1][k1-1]+s[7][1][1][k1+1]
-s[2][i1-1][1][k1-1]-s[3][i1+1][1][k1-1]-s[7][i1+1][1][k1+1]-s[6][i1-1][1][k1+1]
-s[4][i1-1][j1-1][1]-s[5][i1+1][j1-1][1]-s[7][i1+1][j1+1][1]-s[6][i1-1][j1+1][1]
-s[1][1][j1-1][k1-1]-s[3][1][j1+1][k1-1]-s[7][1][j1+1][k1+1]-s[5][1][j1-1][k1+1]
+s[0][i1-1][j1-1][k1-1]+s[1][i1+1][j1-1][k1-1]+s[2][i1-1][j1+1][k1-1]+s[3][i1+1][j1+1][k1-1]
+s[4][i1-1][j1-1][k1+1]+s[5][i1+1][j1-1][k1+1]+s[6][i1-1][j1+1][k1+1]+s[7][i1+1][j1+1][k1+1]
;
return re%mod;
}
//四个卦限-两个卦限+一个卦限
int main(){
freopen("dream.in","r",stdin);
freopen("dream.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&l,&w);
for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)for(int k=1;k<=l;++k)scanf("%d",&a[i][j][k]);
for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)for(int k=1;k<=l;++k)scanf("%d",&v[i][j][k]);
for(int i1=1;i1<=n;++i1)
for(int i2=i1;i2<=n;++i2){
for(int j=1;j<=m;++j)for(int k=1;k<=l;++k)
c[j][k]=i1==i2?a[i1][j][k]:c[j][k]&a[i2][j][k];
for(int k=1;k<=l;++k)d[k]=0;
for(int j=1;j<=m;++j){
for(int k=1;k<=l;++k)
if(c[j][k])d[k]++;else d[k]=0;
st[sum=tp=0]=0;
for(int k=1;k<=l;++k){
ins(k);
s[1][i1][j][k]+=sum;
s[0][i2][j][k]+=sum;
}
st[sum=tp=0]=l+1;
for(int k=l;k>=1;--k){
ins(k);
s[5][i1][j][k]+=sum;
s[4][i2][j][k]+=sum;
}
}
for(int k=1;k<=l;++k)d[k]=0;
for(int j=m;j>=1;--j){
for(int k=1;k<=l;++k)
if(c[j][k])d[k]++;else d[k]=0;
st[sum=tp=0]=0;
for(int k=1;k<=l;++k){
ins(k);
s[3][i1][j][k]+=sum;
s[2][i2][j][k]+=sum;
}
st[sum=tp=0]=l+1;
for(int k=l;k>=1;--k){
ins(k);
s[7][i1][j][k]+=sum;
s[6][i2][j][k]+=sum;
}
} }
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
for(int k=1;k<=l;++k)cal1(0,i,j,k);
for(int k=l;k>=1;--k)cal1(4,i,j,k);
}
for(int j=m;j>=1;--j){
for(int k=1;k<=l;++k)cal1(2,i,j,k);
for(int k=l;k>=1;--k)cal1(6,i,j,k);
}
}
for(int i=n;i>=1;--i){
for(int j=1;j<=m;++j){
for(int k=1;k<=l;++k)cal1(1,i,j,k);
for(int k=l;k>=1;--k)cal1(5,i,j,k);
}
for(int j=m;j>=1;--j){
for(int k=1;k<=l;++k)cal1(3,i,j,k);
for(int k=l;k>=1;--k)cal1(7,i,j,k);
}
}
int tmp=pw(s[7][1][1][1],w);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
for(int k=1;k<=l;++k)if(a[i][j][k]){
inc(ans , 1ll * v[i][j][k] * (tmp-pw(cal2(i,j,k),w)+mod) %mod);
}
ans=1ll*ans*pw(1ll*n*m*l*(n+1)*(m+1)*(l+1)/8%mod,mod-1-w)%mod;
cout<<ans<<endl;
return 0;
}
【JZOJ6230】【20190625】梦批糼的更多相关文章
- 5.29 SD省队培训D1
5.29 SD省队培训D1 自闭的一天 T1 梦批糼 先咕一咕(两天之内一定补上) T2 等你哈苏德 继续咕(一星期之内补上) T3喜欢最最痛 四十分做法: 首先,我们发现同一个点加两条额外边是一件非 ...
- DB 查询分析器 6.03 如何灵活、快捷地操作国产达梦数据库
DB 查询分析器 6.03 如何灵活.快捷地操作国产达梦数据库 马根峰 (广东联合电子服务股份有限公司, 广州 510300) 摘要 本文详细地介绍了"万能数据库查询分析器&qu ...
- 最新 梦网科技java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.梦网科技等10家互联网公司的校招Offer,因为某些自身原因最终选择了梦网科技.6.7月主要是做系统复习.项目复盘.Leet ...
- 最新 创梦天地java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.创梦天地等10家互联网公司的校招Offer,因为某些自身原因最终选择了创梦天地.6.7月主要是做系统复习.项目复盘.Leet ...
- 【干货分享】流程DEMO-事务呈批表
流程名: 事务呈批表 业务描述: 办公采购.会议费用等事务的申请.流程发起时,会检查预算,如果预算不够,将不允许发起费用申请,如果预算够用,将发起流程,同时占用相应金额的预算,但撤销流程会释放相应金 ...
- 一个技术汪的开源梦 —— 基于 .Net Core 的组件 Nuget 包制作 & 发布
一个技术汪的开源梦 —— 目录 微软的 ASP.Net Core 强化了 Nuget 的使用,所有的 .Net Core 组件均有 Nuget 管理,所以有必要探讨一下 .Net Core 组件制作 ...
- 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之 Http 请求客户端
一个技术汪的开源梦 —— 目录 想必大家在项目开发的时候应该都在程序中调用过自己内部的接口或者使用过第三方提供的接口,咱今天不讨论 REST ,最常用的请求应该就是 GET 和 POST 了,那下面开 ...
- 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之序列化
一个技术汪的开源梦 —— 目录 想必大家在项目中都接触过 JSON 或者 XML 吧,为了将对象在网络上传输或者将其持久化必须将其序列化为一个字符串然后进行后续操作.常见的就是将其序列化成 JSON ...
- 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之目录结构
一个技术汪的开源梦 —— 目录 这篇文章是开源公共组件的开篇那就先说说项目的 Github 目录结构和 .Net Core 的项目结构. 1. GitHub 目录结构和相关文件 - src 源码项目目 ...
随机推荐
- Linux学习笔记之Linux文件系统详解
0x00 机械硬盘 机械磁盘由磁头(head).磁道(track).柱面(cylinder).扇区(sector)和盘片(platter)组成.其中,磁头悬浮在盘片上,并且每张盘片上下各有一个磁头:每 ...
- KSQL: Streaming SQL for Apache Kafka
Few weeks back, while I was enjoying my holidays in the south of Italy, I started receiving notifica ...
- Java自学-类和对象 包
Java中的 包 包: package 把比较接近的类,规划在同一个包下 步骤 1 : 把比较接近的类,规划在同一个包下 Hero,ADHero 规划在一个包,叫做charactor(角色) Item ...
- python基础--初始数据结构
目录: 一.知识点1.IDE 集成开发环境2.字符格式化输出3.数据运算4.循环loop5.数据类型6.列表与元组 二.例子1.输入名字.年龄.工作.薪水,进行格式化的输出.2.for语句实现输入密码 ...
- vue中自定义指令
//vue中自定义指令 //使用 Vue.directive(id, [definition]) 定义全局的指令 //参数1:指令的名称.注意,在定义的时候,指令的名称前面,不需要加 v-前缀; 但是 ...
- grid网格布局——色子布局
一.基本概念 样式 含义 grid-area 定义名称 grid-auto-columns 定义列数 grid-auto-flow 定义单元格流动方向(想象水流的样子) grid-auto-rows ...
- restFull api接口
RestFull api接口 前后端分离开发的接口规范 什么是RestFull 是目录比较流行的api设计规范 注:restfull api规范应用场景,前后端分离的项目中 数据接口的现场 例如: / ...
- android ListView中含有按钮事件实时更新ListView数据案例
1.布局文件Listview <?xml version="1.0" encoding="utf-8"?> <android.support. ...
- centos安装redis并且加入开机启动
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_41114593/articl ...
- pyechart基本使用大全
charts_base 原文链接:https://blog.csdn.net/weixin_43735353/article/details/89328048 图表详细配置请参考 图表配置篇 基本图表 ...