[BZOJ2669][cqoi2012]局部极小值(状压DP+容斥原理)

实战解析:如何用Python处理ATE测试生成的STDF文件?一个数据分析案例带你上手 本文详细介绍了如何使用Python处理ATE测试生成的STDF文件,通过一个真实的数据分析案例,从数据解析、清洗到可视化呈现,帮助半导体测试工程师快速掌握自动化分析技巧。文章涵盖了STDF文件解析基础、关键数据提取与清洗、良率统计分析、晶圆图可视化以及高级分析技巧,大幅提升测试数据分析效率。 阅读详情

=== ===

这里放传送门

=== ===

题解

现在看这题的代码感觉这题写起来好GG啊。。是我当时太蠢了吗。。。没错是这样对吧。。。

首先局部最小值这个东西有一个很重要的性质就是局部最小值是不能相邻的,不然它们两个就会发生冲突然后就不知道到底谁是最小值了。所以这样的话在题目给定的这个格子大小范围内局部最小值的位置最多有8个。这样的话就可以把局部最小值状压起来啦。

考虑如果我们已经知道了哪些位置一定是局部最小值如何得到当前满足要求的方案数。肯定是用 1..nm 这些数字往格子里填。但是按照什么顺序填呢?如果一行行一列列那样填的话每个格子会被周围一圈格子影响所以这个递推顺序是不大对的。那么我们换一种方法,按照 1..nm 的顺序填,每次填到一个数字的时候,与它相关的局部最小值必须已经填上数字了。这样就能保证局部最小值一定比周围一圈的数字要小。

那么就可以用 f[k][S] 表示当前填到 k 这个数字,局部极小值的填写状态为S的方案数。对于 k 这个数字,如果它要填到第i个局部最小值里面,那么它的方案数就是f[k][S−(1<<(i−1))]这样。如果它不填到局部最小值里面呢?可以发现对于某些位置,如果会影响到它的局部最小值都已经填上数字了,那么这些位置在接下来的填写中就是等价的,就是先填谁都行。那么如果用 p[S] 表示局部极小值填写状态为 S 的时候等价位置的数目,在递推f[k][S]的时候就可以用 f[k−1][S] 来更新答案。但是这个时候 f[k−1][S] 乘上的系数并不是 p[S] ,因为在这 p[S] 个位置中可能有些已经填上数字了,也就是我们实际上要乘上的系数是 V=p[S]−(k−1个数字中已经填到非极小值位置的数的数目) 。这个东西也好算,如果设 S 这个状态中已经填写的局部极小值的数量为cnt,那么就有 V=p[S]+cnt−(k−1) 。p数组是可以用dfs来预处理的。

这样就可以了吗。。不不不这题才不会这么良心。。因为这么填写的时候只能保证题目给定的位置一定成为了局部极小值,但不能保证题目没有给定的位置不成为局部极小值,也就是可能有一些多出来的局部极小值。那就要用到容斥了。答案就是【初始答案】-【多出一个局部极小值的答案】+【多出两个局部极小值的答案】-【多出三个局部极小值的答案】+…

同样因为局部极小值的位置很少,所以可以用dfs爆搜当前的局部极小值状态。如果是题目已经给定的位置就直接记录,否则如果这个位置没有和任何已经存在的局部极小值相邻,它就是有可能成为极小值的位置。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define Mod 12345678
using namespace std;
int n,m,cnt,p[500],f[30][500],pos[10][2],ans,vis[10][10],ext[10][10];
int d[8][2]={{0,1},{0,-1},{1,0},{-1,0},{-1,1},{1,-1},{1,1},{-1,-1}};
void AddIn(int dlt,int x,int y){
    int tot=0;
    vis[x][y]+=dlt;
    for (int i=0;i<8;i++){
        int u=x+d[i][0],v=y+d[i][1];
        if (u<=n&&u>=1&&v<=m&&v>=1)
          vis[u][v]+=dlt;
    }
}
void work_p(int i,int now,int tot){
    int delta=0,x,y;
    if (i==cnt+1){
        for (int i=1;i<=cnt;i++)
          if ((now&(1<<(i-1)))!=0) ++delta;//把已经填过的极小值也算进去
        p[now]=tot+delta;return;
    }
    work_p(i+1,now,tot);
    x=pos[i][0];y=pos[i][1];
    for (int j=0;j<8;j++){
        int u=x+d[j][0],v=y+d[j][1];
        if (u<=n&&u>=1&&v<=m&&v>=1){
           ext[u][v]-=1;
           if (ext[u][v]==0) ++delta;
        }
    }
    work_p(i+1,now|(1<<(i-1)),tot+delta);
    for (int j=0;j<8;j++){
        int u=x+d[j][0],v=y+d[j][1];
        if (u<=n&&u>=1&&v<=m&&v>=1)
         ext[u][v]+=1;
    }
}
int Calc(){
    int tot=0;
    memset(f,0,sizeof(f));
    memset(p,0,sizeof(p));
    memcpy(ext,vis,sizeof(ext));
    for (int i=1;i<=n;i++)
      for (int j=1;j<=m;j++)
        if (ext[i][j]==0) ++tot;//计算所有极小值都没填的时候有多少位置能填数
    work_p(1,0,tot);
    f[0][0]=1;
    for (int i=1;i<=n*m;i++)
      for (int j=0;j<1<<(cnt);j++){
          f[i][j]=f[i-1][j]*(p[j]-i+1)%Mod;
          for (int k=1;k<=cnt;k++){
               int w=(1<<(k-1));
               if ((j&w)!=0) f[i][j]=(f[i][j]+f[i-1][j-w])%Mod;
          }
      }
    return f[n*m][(1<<cnt)-1]%Mod;
}
void Dfs(int x,int y,int tot){
    if (x>n||y>m) return;
    int nx,ny,cal;
    nx=x;ny=y+1;
    if (y==m){nx=x+1;ny=1;}
    Dfs(nx,ny,tot);
    if (vis[x][y]==0){
        pos[++cnt][0]=x;pos[cnt][1]=y;//增加一个多出来的极小值
        AddIn(1,x,y);
        cal=Calc();
        if ((tot+1)%2==0)
          ans=(ans+cal)%Mod;//容斥
        else ans=(ans-cal)%Mod;
        Dfs(nx,ny,tot+1);
        --cnt;AddIn(-1,x,y);
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
      for (int j=1;j<=m;j++){
          char c=getchar();
          while (c!='.'&&c!='X') c=getchar();
          if (c=='X'){
              pos[++cnt][0]=i;pos[cnt][1]=j;
              AddIn(1,i,j);
          }
      }
    ans=Calc();
    Dfs(1,1,0);
    printf("%d\n",(ans%Mod+Mod)%Mod);
    return 0;
}

偏偏在最后出现的补充说明

n很小的时候基本上就是要么容斥要么状压
这个题恰好都用到了= =

PX4实战指南:通过遥控器通道直连实现舵机PWM控制 本文详细介绍了如何通过PX4飞控实现遥控器通道直连控制舵机PWM输出的完整流程。从硬件准备、遥控器配对到PX4参数配置和硬件连接,提供了实战技巧和常见问题解决方案,帮助无人机爱好者快速掌握舵机控制技术。重点讲解了AUX Passthrough模式设置和PWM参数调整等关键步骤。 阅读详情

相关推荐

linux redis7 完整的集群搭建过程

一。安装: 1.1 说明: Redis官方只提供了源码,并没有提供经过编译之后的安装包。 因此,安装Redis,要先编译、后安装。(即源码安装方式) 注意:需要联网安装 1.2 安装编译的工具: yum install gcc gcc-c++ -y 1.3 下载tar包,上传到linux服务器,解压配置环境变量 1.4 cd +解压的目录下:编译 make 注意:如果编译失败,请重新进行解压编译,...

m0_38028438的博客 719

【bzoj4197】[Noi2015]寿司晚宴 状压DP

Description为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴。小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴。在晚宴上,主办方为大家提供了 n−1 种不同的寿司,编号 1,2,3,…,n−1,其中第 i 种寿司的美味度为 i+1 (即寿司的美味度为从 2 到 n)。 现在小 G 和小 W 希望每人选一些寿司种类来品尝,他们规定一种品尝方案为不和谐的当且仅当

DQS的树洞 1709

jetson nano网络配置(有线、无线、USB)

注意:本节内容使用Jetson nano B01 版本或Jetson nano ALT 版本安装方式相同,在安装无线网卡等设备时,由于线材和设备比较脆弱,需要轻拿轻放,接口连接不上时,需要重新对准接口在进行连接,不要强行连接。Jetson nano 需要连接网络来进行更多的操作,本节就来讲解Jetson nano 的三种网络连接方法。有线:我们可以使用网线连接Jetson nano 的RJ45 接口,实现联网。

m0_73841621的博客 1万+

BZOJ 2669 cqoi2012 局部极小值 状压DP+容斥原理

题目大意:给定一个n∗mn*m的矩阵,标记出其中的局部极小值,要求填入1...n∗m1...n*m,求方案数《多年的心头大恨终于切掉了系列》 考虑将数字从小到大一个一个填进去 由于局部极小值最多88个,我们可以状压DP 令fi,jf_{i,j}表示已经填完了前ii个数,局部极小值的填充状态为jj的方案数 预处理出cntjcnt_j表示填充状态为jj时共有多少位置是可以填充的(包括已填充的局部

世界 5374

树莓派4B+Ubuntu22.04+思岚RPLIDAR C1激光雷达应用

树莓派+Ubuntu22.04+思岚RPLIDAR C1激光雷达简单应用

techfuture的博客 3704

python 识别滑块验证码

博客来源于: https://www.cnblogs.com/wyh0923/p/16528354.html # -*- coding: utf-8 -*- # https://gov.pkulaw.cn/ 1. import io 2. import json 3. from pathlib import Path 4. from PIL import Image 5. import bas...

2102

BZOJ 2669 CQOI2012 局部极小值 状压dp+容斥原理

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2669 题意概述:实际上原题意很简洁了我就不写了吧。。。。 二话不说先观察一下性质,首先棋盘很窄,可以乱搞的样子,然后注意到如果一个点是局部极小值那么周围3*3矩阵内不能有另一个局部最小值。于是画个图发现题目的数据范围最多有8个局部最小值。性质大概就是这些了。 暴...

diezhan7052的博客 179

WRF和WPS模型在Ubuntu系统上的安装与常见问题解决指南

本文详细介绍了在Ubuntu系统上安装WRF和WPS模型的完整教程,涵盖系统环境配置、依赖库安装、源代码编译以及常见问题的解决方案。重点解决了WPS编译中intmath.f文件的修改、环境变量设置和编译器兼容性等关键难点,帮助用户高效部署气象研究与预报模型。

weixin_29213525的博客 382

[BZOJ2669][cqoi2012][状压DP][容斥原理]局部极小值

去年暑假就见过这道题,觉得太难就扔到一边,这几天上课讲到就填上这个坑考虑状压DP,因为普通DP出来的方案数中会存在局部最小值大于给定数量的情况,所以要dfs出所有情况然后容斥#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <string> #define mod 123456

CE玩家 714

深入解析PVT corner:从wcl到ml的芯片设计关键考量

本文深入解析了芯片设计中的PVT corner概念,重点探讨了从传统WC到先进工艺下WCL、ML等关键工艺角。文章详细阐述了温度反转效应如何使低温WCL成为最严苛的时序场景,并提供了基于先进工艺的实战签核策略与多角多模分析流程,确保芯片在极端工艺、电压、温度下的稳健性。

tree8的博客 527

手把手教你学Simulink——基于全桥 LLC 谐振变换器的双向 DC-DC 建模与仿真

本文详细介绍了基于Simulink的双向全桥LLC谐振变换器建模与仿真方法。内容涵盖:1)LLC谐振变换器背景与双向化挑战;2)系统架构设计及关键数学推导(FHA增益分析、双向控制逻辑);3)Simulink建模步骤(功率级搭建、PWM生成、同步整流实现);4)仿真结果分析(正向/反向工作验证、ZVS特性);5)工程实践建议(增益微调、代码生成与HIL测试)。通过手把手教学,帮助读者掌握950V↔48V双向LLC变换器的完整设计流程,实现高效率能量双向流动的同时保持软开关特性,适用于储能系统、车载充电等应用

MHD0815的博客 179

BZOJ2669 [cqoi2012]局部极小值 状压DP 容斥原理

欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2669 题意概括   有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次。如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点)都小,我们说这个格子是局部极小值。 给出所有局部极小值的位置,你的任务是判断有多少个可能的矩阵。   几组例子: ...

weixin_30369087的博客 135

14 ABSOLUTE评估肿瘤纯度

14 ABSOLUTE评估肿瘤纯度 Absolute介绍 ABSOLUTE可以直接从体细胞突变和拷贝数变异的结果中推断肿瘤纯度和倍性的计算方法。 通常来说,我们取肿瘤组织进行测序,往往是一个混合样品,既包括肿瘤细胞也包括正常细胞,因此需要进行肿瘤纯度 purity 的评估。当从混合样品中提取 DNA 进行测序后,得到的也是一个混合样品的结果。肿瘤不一定是单纯的二倍体了,其本身异质性高,存在部分突变部分不突变的情况,直接分析拷贝数变异,得到的结果并不准确,评估肿瘤倍性 ploidy 也更加必要。而 ABSO

qq_23435961的博客 4215

【bzoj 2669】[cqoi2012]局部极小值(状压dp+容斥原理)

愿化做枫叶等你在中秋月圆时、独饮相思

reverie_mjp的博客 403

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【bzoj2669】[cqoi2012]局部极小值 【状压dp】【容斥原理】

题目链接 题解: 首先我们可以想到,如果两个局部最小值是八相邻的,那一定无解。 题目有一个重要的限制,就是局部最小值必须一个不差,但是我们可能在满足了题目要求的情况下,多出了一些局部最小值。 我们先不管这些,考虑如何计算包含某种给定状态中所有局部最小值的矩阵总数。注意,这里可以多算出一些没给的局部最小值。 我们从小到大填数,并且把给定的局部最小值给状压一下。设f[i][j]f[i][j]...

2016gdgzoi471 695

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【bzoj2669】[cqoi2012]局部极小值 容斥原理+状压dp

题目描述 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次。如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点)都小,我们说这个格子是局部极小值。 给出所有局部极小值的位置,你的任务是判断有多少个可能的矩阵。 输入 输入第一行包含两个整数n和m(1<=n<=4, 1<=m<=7),即行数和列数。以下n行每行m个字符,其中“X”表示局部极...

weixin_30765319的博客 96

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【BZOJ 2669】 2669: [cqoi2012]局部极小值 (状压DP+容斥原理)

2669: [cqoi2012]局部极小值 Time Limit:3 SecMemory Limit:128 MBSubmit:667Solved:350 Description 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次。如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点)都小,我们说这个格子是局部极小值。 给出所有局部极小值的...

weixin_30838873的博客 114

BZOJ 2669: [cqoi2012]局部极小值 状压dp 容斥原理

2669: [cqoi2012]局部极小值 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 762  Solved: 403 [Submit][Status][Discuss] Description 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次。如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点)都小,我们说这

BlackJack 395

【bzoj2669】[cqoi2012]局部极小值 容斥原理+状压dp

题解 转载于:https://www.cnblogs.com/yinwuxiao/p/9644143.html

weixin_30781433的博客 98

【bzoj2669】【cqoi2012】【局部极小值】【状压dp】

Description 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次。如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点)都小,我们说这个格子是局部极小值。 给出所有局部极小值的位置,你的任务是判断有多少个可能的矩阵。 Input 输入第一行包含两个整数n和m(1nmn行每行m个字符,其中“X”表示局部极小值,“.”表示非局部极小值。   Out

sunshinezff的专栏 1696

bzoj2669: [cqoi2012]局部极小值

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2669 题意:中文题。 分析:首先观察到这个题的数据小很容易就想到状压,但是怎么状压呢?我们一步一步来处理问题。首先我们要处理的是题目处理的是'X'的位置一定是极小值,'.'的位置只能是非极小值。但是如果有个3*3的矩阵中全是'.',那么我们怎么才能确定中间那个不会是处理成极小值呢?这里选择

Fsss 635

BZOJ 2669 Luogu P3160 [CQOI2012]局部极小值 (容斥原理、DP)

题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2669 (luogu) https://www.luogu.org/problem/P3160 题解 这道题充分暴露了我的菜。。 显然两个局部极小值点不能相邻,所以最多有\(8\)个局部极小值。 然后考虑容斥掉.不能成为局部极小值的限制,那么就变成钦定某些位置一定是...

weixin_30439131的博客 167
上一篇: [BZOJ3998][TJOI2015]弦论(后缀自动机)
下一篇: [BZOJ2244][SDOI2011]拦截导弹(DP+CDQ分治)
FromATP
博客等级 码龄10年 75粉丝 163原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值