题目

一个$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. 使用el-dialog时,报错“Unknown custom element:<el-dialog> did you register the component correctly?...make sure to provide the 'name' option”

    初学vue时,曾遇到一个无语的问题,在用el-dialog时一直显示没有导入,结果发现是因为没有把element ui引入到项目里. 需进行以下步骤: 1.执行: npm install elemen ...

  2. 使用HttpWebRequest和HttpWebResponse时接收数据中文乱码的情况

    今天在调试一个get请求的接口的时候发现HttpWebResponse方法接收数据的时候,中文出现乱码的情况. 原因是格式编码转码的问题. 原来自从Windows 2000之后的操作系统在文件处理时默 ...

  3. kafka安装和简单测试

    kafka安装和简单测试 # 安装zookeeper(apache-zookeeper-3.5.6-bin)https://archive.apache.org/dist/zookeeper/zook ...

  4. 玩转zynq7010+ FPGA点亮三色灯

    前期主要以开发Z-TURN的PL部分为主,以期望了解该芯片的逻辑架构和系统总线,以及所有外设,后面在开始PS部分的开发,闲话少说,先看整个7z010的系统框图,所有开发目前基于ISE14.6来设置, ...

  5. JavaScript 流程控制(一)顺序结构与分支结构

    语句:语句可以理解为一个行为,循环语句和判断语句就是典型的语句.一个程序有很多个语句组成,一般情况下分号;分割一个一个的语句:如果省略分号,则由解析器确定语句的结尾(不推荐使用) 一.流程控制 流程控 ...

  6. 链接标签(a 标签)

    一.链接标签 单词缩写: anchor 的缩写. 在HTML中创建超链接非常简单,只需用标签环绕需要被链接的对象即可. 语法格式: <a href="跳转目标" target ...

  7. socket系统化入门

    1.简单socket完成消息发送与接收 服务端: package com.wfd360.com.socket; import java.io.*; import java.net.ServerSock ...

  8. Ubuntu中如何为wine程序创建快捷方式

    1.安装一个gnome组件及其应用 sudo apt-get install gnome-panel 2.运行以下命令弹出创建快捷方式的窗口 sudo gnome-desktop-item-edit ...

  9. 大数据:Hadoop(简介)

    一.简介 定义:开源的,做分布式存储与分布式计算的平台: 功能:搭建大型数据仓库,对PB级数据进行存储.处理.分析.统计等业务:(如日志分析.数据挖掘) Hadoop工作模块 Common:提供框架和 ...

  10. Mac开源文本编辑器Brackets 快捷操作有哪些?

    Brackets for Mac是一款可靠,直观且易于使用的macOS应用程序,可用作HTML,CSS和JavaScript项目的代码编辑器.如果你能了解更多Mac开源文本编辑器Brackets 快捷 ...