首页 > 其他分享 >2022牛客国庆集训派对day6 A(极大矩阵计数)

2022牛客国庆集训派对day6 A(极大矩阵计数)

时间:2022-10-07 19:57:41浏览次数:86  
标签:day6 rep long 牛客 int vector 2022 悬线 define

2022牛客国庆集训派对day6 A(极大矩阵计数)

A-All-one Matrices_2022牛客国庆集训派对day6 (nowcoder.com)

题目

求可以构成给出的01矩阵的全1极大矩阵数目

思路

悬线法可以处理出极大全1矩阵,然后做贪心计数。

贪心策略上,考虑每一行,如果下一行有0,或者下一行的悬线扫描的包含了当前悬线扫描位置,那么这个悬线扫出来的矩形就是可以省去的,反之不能剩


如果下一行有0,显然。

如果下一行的悬线扫出来的范围不包含当前行悬线范围,那么对于如果不把当前悬线确定的矩形记上,之后将没有机会扫到,因此这个矩形一定要有。


最后,找到所有矩形后做一个去重。

代码上有一个地方一直写挂了。

rep(j,1,m) while(L[j] > 1 and h[j] <= h[L[j] - 1] and (h[L[j]] and h[L[j] - 1])) L[j] = L[L[j] - 1];
        dec(j,m,1) while(R[j] < m and h[j] <= h[R[j] + 1] and (h[R[j]] and h[R[j] + 1])) R[j] = R[R[j] + 1];

在递推悬线的过程中写成了 h[L[i]] <= h[L[j] - 1] 是错误的,这个式子推出的悬线一定是一个单调增的覆盖。(莫名其妙的错误增加了)

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define ll long long
#define linf 0x3f3f3f3f3f3f3f3fll
#define ull unsigned long long
#define endl '\n'
// #define int long long
#define SZ(x) (int)x.size()
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define dec(i,n,a) for(int i = n;i >= a;i--)
using namespace std;
mt19937 mrand(random_device{}());
int rnd(int x) { return mrand() % x;}
using PII = array<int,2>;
const int MAXN =10 + 2e5 ,mod=1e9 + 7;

void solve()
{    
    int n,m; cin >> n >> m;
    vector<vector<int>> a(n + 1,vector<int>(m + 1));
    rep(i,1,n) rep(j,1,m) {
        char t; cin >> t;
        a[i][j] = t == '1';
        if(a[i - 1][j] and a[i][j]) a[i][j] += a[i - 1][j];
    }
    vector<vector<int>> l(n + 1,vector<int>(m + 1)), r(n + 1,vector<int>(m + 1));
    
    rep(i,1,n) {
        auto &h = a[i];
        auto &L = l[i], &R = r[i];
        rep(j,1,m) L[j] = R[j] = j;
        rep(j,1,m) while(L[j] > 1 and h[j] <= h[L[j] - 1] and (h[L[j]] and h[L[j] - 1])) L[j] = L[L[j] - 1];
        dec(j,m,1) while(R[j] < m and h[j] <= h[R[j] + 1] and (h[R[j]] and h[R[j] + 1])) R[j] = R[R[j] + 1];
    }
    vector<array<int,4>> b;
    rep(i,1,n) rep(j,1,m) if(a[i][j]) {
        if(i < n and a[i + 1][j] and l[i][j] >= l[i + 1][j] and r[i][j] <= r[i + 1][j])
            continue;
        int x = i, y = l[i][j], z = i - a[i][j] + 1, w = r[i][j];
        b.push_back({x,y,z,w});
    }
    
    sort(b.begin(),b.end());
    b.erase(unique(b.begin(),b.end()),b.end());
    cout << SZ(b);
}
signed main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

    //int T;cin>>T;
    //while(T--)
        solve();

    return 0;
}

标签:day6,rep,long,牛客,int,vector,2022,悬线,define
From: https://www.cnblogs.com/Mxrush/p/16760527.html

相关文章

  • 【闲话】2022.10.07
    发现似乎我妈登上博客园了那我是不是该收敛点啊总之今天考了场试啊密码还是我的某中文网名全拼。还是相对论:只要大家都挂了那我就没有挂————bikuhiku看......
  • 2022-10-07-学习内容
    1.设置文本字体大小1.1activity_text_size.xml<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"......
  • 时光卷轴,IT启示录-2022年-9月刊
    8月份新能源车销售数据出炉前不久,中国汽车工业协会公布了8月份的新能源车销售数据。先来看市场总盘子。8月份,全国新能源车汽车销量创历史新高,为66.6万辆,同比增长了1倍,环......
  • 20220819报错信息
    ​​https://jingyan.baidu.com/article/6079ad0e99bb8228ff86db2b.html​​​​https://www.ilovematlab.cn/thread-559419-1-1.html​​​​https://www.codenong.com/414......
  • 2022牛客国庆集训派对day6 C 递归构造 归纳构造
    给出一个m你需要构造出来m个m维向量两两向量之间点乘为0向量每一维只能是1或-1保证m一定是2的幂次。直接构造出来那么大的显然不太可能发现不了什么比较好的规律。......
  • CVPR2022| BodyMap可用于换装,Vision Transformers 又立功!
    整理:AI算法与图像处理CVPR2022论文和代码整理:https://github.com/DWCTOD/CVPR2022-Papers-with-Code-Demo欢迎关注公众号AI算法与图像处理,获取更多干货:大家好,  最近正在......
  • CVPR2022 论文速递!超强视频修复效果!FID 和 LPIPS大幅提升
    整理:AI算法与图像处理CVPR2022论文和代码整理:https://github.com/DWCTOD/CVPR2022-Papers-with-Code-Demo欢迎关注公众号AI算法与图像处理,获取更多干货:大家好,  最近正在......
  • CVPR2022论文速递(2022.4.11)!共12篇!跟踪/transformer/对比学习等
    整理:AI算法与图像处理CVPR2022论文和代码整理:https://github.com/DWCTOD/CVPR2022-Papers-with-Code-Demo欢迎关注:​大家好,  最近正在优化每周分享的CVPR论文,目前考虑......
  • CVPR2022论文速递(2022.4.8)!共18篇
    整理:AI算法与图像处理CVPR2022论文和代码整理:https://github.com/DWCTOD/CVPR2022-Papers-with-Code-Demo欢迎关注:​大家好,  最近正在优化每周分享的CVPR论文,目前考虑......
  • CVPR2022论文速递(2022.4.7)!共17篇,新增标题翻译
    整理:AI算法与图像处理CVPR2022论文和代码整理:https://github.com/DWCTOD/CVPR2022-Papers-with-Code-Demo欢迎关注:​大家好,  最近正在优化每周分享的CVPR论文,目前考虑......