首页 > 其他分享 >悬线法学习笔记

悬线法学习笔记

时间:2022-10-07 19:56:58浏览次数:83  
标签:悬线法 int rep cin 笔记 学习 vector com

悬线法学习笔记

单调栈可以解决的问题,一部分可以用悬线法解决,悬线法更容易理解,代码量差不多。

SPOJ.com - Problem HISTOGRA

找元素的左右扩展区间。如果用选线法处理的话,定义 \(L_i\) 是可扩展做区间,如果 \(a_i \le a_{L_i-1}\),的话可以继续继承 \(L_{L_i-1}\) 这可以看成一个递归的过程,均摊复杂度线性。

int n;
void solve2() {
    vector<int> h(n + 1);
    rep(i,1,n) cin >> h[i];
    vector<int> L(n + 1), R(n + 1);
    iota(L.begin(),L.end(),0);
    iota(R.begin(),R.end(),0);
    rep(i,1,n) while(L[i] > 1 and h[i] <= h[L[i] - 1]) L[i] = L[L[i] - 1];
    dec(i,n,1) while(R[i] < n and h[i] <= h[R[i] + 1]) R[i] = R[R[i] + 1];
    ll ans = 0;
    rep(i,1,n) ans = max(ans, 1ll * h[i] * (R[i] - L[i] + 1));
    cout << ans << "\n";
}

P4147 玉蟾宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

最大子矩形板子题,可以发现,就是二维的悬线,需要处理出一个 \(a\) 表示一个“纵向的前缀和”表示 \(hight\)。之后跑板子就行了。

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;
        if(t == 'R') continue;
        a[i][j] = a[i - 1][j] + 1;
    }
    int ans = 0;
    rep(i,1,n) {
        vector<int> L(m + 1), R(m + 1);
        rep(j,1,m) L[j] = R[j] = j;
        auto &b = a[i];
        rep(j,1,m) while(L[j] > 1 and b[j] <= b[L[j] - 1]) L[j] = L[L[j] - 1];
        dec(j,m,1) while(R[j] < m and b[j] <= b[R[j] + 1]) R[j] = R[R[j] + 1];
        rep(j,1,m) ans = max(ans, (R[j] - L[j] + 1) * b[j] * 3);  
    }
    cout << ans;
}

[P1169 ZJOI2007]棋盘制作 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

求01交替的最大子矩阵,需要处理的就是悬线左右移动时的要保证01交替。

做递推时,应该判断 \(a[i][R_j] \ne a[i][R_j+1]\) 表示相邻的不同数。

while(L[j] > 1 and h[j] <= h[L[j] - 1] and a[i][R[j]] ^ a[i][R[j] + 1])
                L[j] = L[L[j] - 1];
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) cin >> a[i][j];
    vector<vector<int>> s(n + 1,vector<int>(m + 1));
    rep(j,1,m) s[1][j] = 1;
    rep(i,2,n) rep(j,1,m) {
        if(a[i][j] ^ a[i - 1][j]) 
            s[i][j] = s[i - 1][j] + 1;
        else s[i][j] = 1;
    }
    int ans1 = 0, ans2 = 0;
    rep(i,1,n) {
        auto &h = s[i];
        vector<int> L(m + 1),R(m + 1);
        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 a[i][R[j]] ^ a[i][R[j] + 1])
                L[j] = L[L[j] - 1];
        dec(j,m,1) 
            while(R[j] < m and h[j] <= h[R[j] + 1] and a[i][R[j]] ^ a[i][R[j] + 1])
                R[j] = R[R[j] + 1];
        rep(j,1,m) {
            ans1 = max(ans1, min(h[j], R[j] - L[j] + 1) * min(h[j], R[j] - L[j] + 1));
            ans2 = max(ans2, h[j] * (R[j] - L[j] + 1));
        }
    }
    cout << ans1 << "\n" << ans2;
}

极大矩阵计数,看下面例题。

2022牛客国庆集训派对day6 A(极大矩阵计数) - Mxrurush - 博客园 (cnblogs.com)

标签:悬线法,int,rep,cin,笔记,学习,vector,com
From: https://www.cnblogs.com/Mxrush/p/16760533.html

相关文章

  • 统计学习方法学习笔记-08-提升方法
    首先介绍提升算法的思路和代表性的提升算法AdaBoost,然后分析AdaBoost为什么可以提高学习精度,从前向分步加法模型的角度解释AdaBoost,最后介绍提升方法更具体的实力,提升树boo......
  • 2022-10-07-学习内容
    1.设置文本字体大小1.1activity_text_size.xml<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"......
  • 关于学习
    学习的态度人生在世,学习是必不可少的。日积月累的学识能成为自己的一把利剑,斩断一切虚茫。所以,对待学习不能以功利的方式。升学和求职当然需要必要的针对性的准备,但是绝不......
  • 初学C语言笔记221007预处理
    预编译:#include头文件的包含    注释删除    #define汇编代码二进制指令预定义符号__FILE____LINE____DATE____TIME____FUNCTION____STDC__如果严格支持AN......
  • JMM(Java内存模型)笔记
    JMM介绍1.什么是JMM?2.JMM的三大特性:1.原子性2.可见性3.有序性3.关于同步的规定:4.解释说明JMM中的八种操作:1.什么是JMM?​JMM是Java内存模型(JavaMemoryModel),简称JMM。它......
  • 学习笔记jira项目1-课程导学
         ......
  • jira项目笔记14-TypeScript vs JavaScript
    TypeScriptvsJavaScriptTypeScript是“强类型”版的JavaScript,当我们在代码中定义变量(包括普通变量、函数、组件、hook等)的时候,TypeScript允许我们在定义的同......
  • jira项目笔记15-TypeScript 的类型
    TypeScript的类型 8种类型:number,string,boolean,函数,array,any,void,object这一节我们接触到了平常使用中会接触到的大部分的类型,下面我们挨个梳理一遍:numbe......
  • jira项目笔记16-啥时候需要声明类型
    啥时候需要声明类型理论上来说在我们声明任何变量的时候都需要声明类型(包括普通变量、函数、组件、hook等等),声明函数、组件、hook等需要声明参数和返回值的类型。但......
  • jira项目笔记17-自定义useArray
    2-1、要求自定义一个useArray的customhook。结合react-hook和typescript,实现对数组简单的增加、删除、清空的那个功能,并且对增加的对象类型有限制2-2、代码实现export......