题目

一个$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】梦批糼的更多相关文章

  1. 5.29 SD省队培训D1

    5.29 SD省队培训D1 自闭的一天 T1 梦批糼 先咕一咕(两天之内一定补上) T2 等你哈苏德 继续咕(一星期之内补上) T3喜欢最最痛 四十分做法: 首先,我们发现同一个点加两条额外边是一件非 ...

  2. DB 查询分析器 6.03 如何灵活、快捷地操作国产达梦数据库

    DB 查询分析器 6.03 如何灵活.快捷地操作国产达梦数据库 马根峰 (广东联合电子服务股份有限公司, 广州 510300) 摘要       本文详细地介绍了"万能数据库查询分析器&qu ...

  3. 最新 梦网科技java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.梦网科技等10家互联网公司的校招Offer,因为某些自身原因最终选择了梦网科技.6.7月主要是做系统复习.项目复盘.Leet ...

  4. 最新 创梦天地java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.创梦天地等10家互联网公司的校招Offer,因为某些自身原因最终选择了创梦天地.6.7月主要是做系统复习.项目复盘.Leet ...

  5. 【干货分享】流程DEMO-事务呈批表

    流程名: 事务呈批表  业务描述: 办公采购.会议费用等事务的申请.流程发起时,会检查预算,如果预算不够,将不允许发起费用申请,如果预算够用,将发起流程,同时占用相应金额的预算,但撤销流程会释放相应金 ...

  6. 一个技术汪的开源梦 —— 基于 .Net Core 的组件 Nuget 包制作 & 发布

    一个技术汪的开源梦 —— 目录 微软的 ASP.Net Core 强化了 Nuget 的使用,所有的 .Net Core 组件均有 Nuget 管理,所以有必要探讨一下 .Net Core 组件制作 ...

  7. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之 Http 请求客户端

    一个技术汪的开源梦 —— 目录 想必大家在项目开发的时候应该都在程序中调用过自己内部的接口或者使用过第三方提供的接口,咱今天不讨论 REST ,最常用的请求应该就是 GET 和 POST 了,那下面开 ...

  8. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之序列化

    一个技术汪的开源梦 —— 目录 想必大家在项目中都接触过 JSON 或者 XML 吧,为了将对象在网络上传输或者将其持久化必须将其序列化为一个字符串然后进行后续操作.常见的就是将其序列化成 JSON ...

  9. 一个技术汪的开源梦 —— 基于 .Net Core 的公共组件之目录结构

    一个技术汪的开源梦 —— 目录 这篇文章是开源公共组件的开篇那就先说说项目的 Github 目录结构和 .Net Core 的项目结构. 1. GitHub 目录结构和相关文件 - src 源码项目目 ...

随机推荐

  1. 在 Docker 中运行 SpringBoot 应用

    创建 SpringBoot 项目 用 Idea 创建一个 SpringBoot 项目,编写一个接口: package cloud.dockerdemo import org.springframewo ...

  2. "类"的讲稿

    -----------------------面向对象基础------------------------------------方法(函数) { (c#p10为主,p27;javap96)+资料,讲 ...

  3. Android 权限的一些细节

    Android 权限的一些细节 1 哪些app属于system app?为了区分privilege app和system app,这里先说明system app是什么,避免之后的讨论概念混乱. 在Pa ...

  4. Vert.x(vertx)发送 HTTP/HTTPS请求

    Vert.x Web服务有两种协议,一种是HTTP,另外一种是使用ssl的HTTPS,请求的方式有五种,分别是get.post.put.delete.head.为了简单,服务端主要实现对HTTP协议的 ...

  5. 解决Spring Boot 从1.x升级到 2.x 后 单点登陆(SSO)问题

    解决Spring Boot 从1.x升级到 2.x 后 单点登陆(SSO)问题   在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把Spring S ...

  6. jquery实现简单定时轮播图

    JS $(document).ready(function(){ var index = 0; //刚开始设置一个index,index为图片的索引值 $(".pictureDemo img ...

  7. Map List Set的区别

    Map List Map的主要区别如下: set List 是实现了Collection接口的子接口:Map本身就是一个接口: list数据存放时有序的,允许有重复元素:set数据存放时无序的,不允许 ...

  8. Python 迭代器,错误、异常处理

    迭代器 迭代器可以用来遍历字符串.列表.元组.集合.字典. myString="hello" myIter=iter(myString) ##iter()函数可以获取元素集的一个迭 ...

  9. Windows Server 2012 R2 远程桌面自动设置为不允许连接问题解决方案

    用“gpedit.msc”调出策略组设置窗口,在策略组界面点击:计算机配置->管理模块->Windows组件->远程桌面服务->远程桌面会话主机->连接->允许用户 ...

  10. Centos 7 kubernetes集群搭建

    一.环境准备 Kubernetes支持在物理服务器或虚拟机中运行,本次使用虚拟机准备测试环境,硬件配置信息如表所示: IP地址 节点角色 CPU Memory Hostname 磁盘 192.168. ...