草庐IT

arc076f F - Exhausted?

Cranew 2023-03-28 原文

ARC076 F - Exhausted?

[题目大意]

\(有m个座位,分别位于坐标为1,2,3,...,m的地方;n个客人,第i位客人只坐位于[0,li]∪[ri,m]的座位。每个座位只能坐一个人,问最少需要添加几个座位才能使所有人坐下?\)

[Solution]

本题考察对霍尔定理的理解, $对于二分图G=<V_1, V_2, E> , 设|V_1| < |V_2| , 则G中存在V_1 到V_2的完美匹配当且仅当对于任意S\subset V_1, 对于S的邻域N(S), 均有|S| \le |N(S)| $

而霍尔定理有一个推论, 就是若使G 中存在完美匹配, 则最少补充\(max\{0, |S| - |N(S)|\}\) 条边

回到本题, 对于一个人, 把他看做左部点, 把座位1到m看做右部, 将客人向所有\(i\in[1, l_i] \cup [r_i, m]\)连边

因为左部S所对应的右部节点的形式为\([1, l] \cup [r, m]\) 节点数为\(m - (r - l + 1)= m - r + l - 1\)

那么依据霍尔定理, 答案就是 \(|S| - m + r - l + 1\)

那么, 求出上述式子的最大值即可, 但是枚举S的复杂度太高, 于是考虑右部区间\([L, R]\) 找出对应的左部节点,所以可以将人\(l_i, r_i\)\(l_i\) 升序, 建一棵线段树存储\(r_i\) ,将右部节点映射上去, 并把初值设为i,。迭代\(l\) , 每次将左端点是\(l\)\(r_i\), 更新入线段树, 即将\([l, r]\) 区间加一, 每次求出\([L, m]\)的最大值。

对于\(r_i = m + 1\)的点, 在额外建一个点m + 1,存储即可

#include <bits/stdc++.h>
#define for_(i,a,b) for (ll i = (a); i < (b); i++)
#define rep_(i,a,b) for (ll i = (a); i <= (b); i++)
#define ll long long
#define pii pair<int, int>
#define fi first
#define se second
#define sz(a) a.size()
#define all(v) v.begin(), v.end()
#define int long long
using namespace std;
const int maxn = 5e5 + 10, mod = 1e9 + 7;// mod = 1949777;
const double EPS = 1e-3;
int n, m;
vector<int> a[maxn];
struct segment_tree{
    int N;
    long long P;
    vector<long long> ST, A, M, F; // A -> tag add  / M -> tag mul /F -> tag max
    segment_tree(int n) {
        N = 1;
        while(N < n) {
            N *= 2;
        }
        ST = vector<long long>(4 * N - 1, 0);
        A = ST;
        M = vector<long long>(4 * N - 1, 1);
        F = A;
        P = 1e15;
    }
    void pushdown(int s, int t, int p) {
        int l = 2 * p, r = 2 * p + 1, mid = s + ((t - s) >> 1);
        if (M[p] != 1) {
            M[l] *= M[p], M[l] %= P;
            A[l] *= M[p], A[l] %= P;
            ST[l] *= M[p], ST[l] %= P;
            F[l] *= M[p], F[l] %= P;
            M[r] *= M[p], M[r] %= P;
            A[r] *= M[p], A[r] %= P;
            ST[r] *= M[p], ST[r] %= P;
            F[r] *= M[p], F[r] %= P;
            M[p] = 1;
        }
        if (A[p] != 0) {
            ST[l] += A[p] * (mid - s + 1), ST[l] %= P;
            A[l] += A[p], A[l] %= P;
            F[l] += A[p], F[l] %= P;
            ST[r] += A[p] * (t - mid), ST[r] %= P;
            A[r] += A[p], A[r] %= P;
            F[r] += A[p], F[r] %= P;
            A[p] = 0; 
        }
        return;
    }
    void pushup(int p) {
        int l = 2 * p, r = 2 * p + 1;
        ST[p] = (ST[l] + ST[r]) % P;
        F[p] = max(F[l], F[r]);
        return;
    }
    void mul(int l, int r, int c, int s, int t, long long p) {
        if (l <= s && t <= r) {
            M[p] *= c, A[p] *= c, ST[p] *= c;
            M[p] %= P, A[p] %= P, ST[p] %= P;
            F[p] *= c, F[p] %= P;
            return;
        }
        int mid = s + ((t - s) >> 1);
        pushdown(s, t, p);
        if (l <= mid) mul(l, r, c, s, mid, p * 2);
        if (mid < r) mul(l, r, c, mid + 1, t, p * 2 + 1);
        //(ST[p] = ST[p * 2] + ST[p * 2 + 1]) %= P;
        pushup(p);
    }
    void add(int l, int r, int c, int s, int t, long long p) {
        if (l <= s && t <= r) {
            ST[p] += (t - s + 1) * c; ST[p] %= P;
            A[p] += c; A[p] %= P;
            F[p] += c, F[p] %= P;
            return;
        }
        int mid = s + ((t - s) >> 1);        
        pushdown(s, t, p);
        if (l <= mid) add(l, r, c, s, mid, 2 * p);
        if (mid < r) add(l, r, c, mid + 1, t, 2 * p + 1);
        //(ST[p] = ST[2 * p] + ST[2 * p + 1]) %= P;
        pushup(p);
        return;
    }
    long long getsum(int l, int r, int s, int t, int p) {
        if (l <= s && t <= r) {
            return ST[p];
        }
        int mid = s + ((t - s) >> 1);
        pushdown(s, t, p);
        long long res = 0;
        if (l <= mid) res += getsum(l, r, s, mid, 2 * p), res %= P;
        if (mid < r) res += getsum(l, r, mid + 1, t, 2 * p + 1), res %= P;
        return res;
    }
    int getmax(int l, int r, int s, int t, int p) {
        if (l <= s && t <= r) return F[p];
        pushdown(s, t, p);
        int mid = s + ((t - s) >> 1);
        int res = -1e15;
        if (l <= mid) res = max(res, getmax(l, r, s, mid, 2 * p));
        if (mid < r) res = max(res, getmax(l, r, mid + 1, t, 2 * p + 1));
        return res; 
    }
}; 
signed main() {
    cin >> n >> m;
    int ans = max(0LL, n - m);
    m++; // 由于线段树板子是Indexed_1,所以坐标整体+1
    segment_tree T(m + 2);
    for (int i = 1; i <= m + 1; i++) T.add(i, i, i - 1, 1, m + 1, 1);
    for (int i = 1; i <= n; i++) {
        int u, v; cin >> u >> v;
        u++, v++; 
        a[u].push_back(v);
    } 
    for (int i = 1; i <= m; i++) {
        for (int j = 0; j < (int)a[i].size(); j++) {
            T.add(1, a[i][j], 1, 1, m + 1, 1);    
        }
        ans = max(ans, -(i - 1) - (m - 1) - 1 + T.getmax(i + 1, m + 1, 1, m + 1, 1));     //即上文的式子  
    }
    cout << ans << endl;
    return 0;
}

有关arc076f F - Exhausted?的更多相关文章

  1. javascript - "onclick"事件在 FF 和 Chrome 中不起作用 - 2

    我在带有onclick属性的div中有一些SVG路径:open()函数定义在一个单独的JS文件中,它在body标签之前实现(就像jQuery文件一样):functionopen(n){$("#information").fadeIn();$("#info"+n).fadeIn();}div#info1,比如div#information里面是一个信息框,全屏半透明黑色背景(类似灯箱的效果).使用Safari一切正常。但是,如果我尝试使用FF或Chrome,当我点击时浏览器似乎加载了一个新页面(这不应该发生)并且它导致没有源代码的空白屏幕。页面可以在这里看到:frank.schufi.c

  2. 来自字符串的 Javascript 新日期对象,在 IE 和 FF 上的不同结果 - 2

    我正在尝试从字符串创建一个新的日期对象,如下所示:varmyDate=newDate("1985-01-01T00:00:00.000-06:00");在FireFox上,它会发出以下警告TueJan01198500:00:00GMT-0600(CentralStandardTime)在IE8上,它会发出以下警告NaN为什么IE会这样? 最佳答案 展望documetation正确的格式如下:newDate(year,month,day[,hour,minute,second,millisecond])因此,如果您运行以下代码,它将在

  3. javascript - jquery attr ("onClick") - 即和 ff - 2

    使用jquery,我想从A标签的onClick属性中获取javascript。在Firefox中:alert($('a').attr("onClick"))显示:alert("boo")在IE6/7中:alert($('a').attr("onClick"))显示:functionanonymous(){alert("boo");return假的;如何在IE6/7中使用jquery只检索javascript而不是包装函数?(或纯JavaScript)?弗兰科 最佳答案 HowcanIretrievejustthejavascript

  4. javascript - 在 FF 11 中加载 jquery UI 出现错误::"TypeError: a is undefined" - 2

    我在我的ff扩展中使用了jquery(也有ui)。一切正常,直到ff10。varloader=Components.classes["@mozilla.org/moz/jssubscript-loader;1"].getService(Components.interfaces.mozIJSSubScriptLoader);loader.loadSubScript("chrome://myext/content/js/jquery-1.7.2.js",wnd);varjQ=wnd.jQuery.noConflict(true);try{loader.loadSubScript("chr

  5. JavaScript inflate 实现(可能仅限 FF 3.6) - 2

    我正在编写一些使用FireFox3.6中的HTML5文件API的脚本。我有一些放气(压缩)的文件,我需要扩充(解压缩)它们。我找到了一个fewscripts虽然谷歌搜索,但他们都没有测试。所以我有点不愿意使用它们。我的问题是:浏览器可以膨胀。我可以通过伪造XHR请求以某种方式搭载通货膨胀吗?或者以任何其他方式搭载?请记住,该脚本目前是FireFox3.6独有的。不过,它不能是扩展程序,我希望它是一个常规网页。或者,您知道有没有为它编写测试的脚本? 最佳答案 我找到了anexistinglibrary.写了一个测试。将它包装在一个函数

  6. javascript - 非常简单的 D3 : How to Draw an Arc? - 2

    学习D3会很好。看了很多例子,我想我明白了。我的第一个项目是制作一个色轮,为了简单起见没有过渡。但对于我的第一个项目来说,这似乎还不够简单!对于零号项目,我试图在屏幕上显示一些内容。希望我写的东西(并且亲爱的阅读已经修复),而不是一个例子。我做错了什么?http://jsfiddle.net/aGdMX/1/vararc=d3.svg.arc().innerRadius(40).outerRadius(100).startAngle(0).endAngle(1);varchart=d3.select("body").append("svg:svg").attr("class","cha

  7. javascript - 将 '#ff00fffirstword#445533secondword#008877thirdword' 转换为 html 标签格式 - 2

    我可以将字符串#ff00fffirstword#445533secondword#008877thirdword转换为firstwordsecondwordthirdword在javascript或actionscript3程序中使用正则表达式?我尝试了下面的代码,但它并不完美(actionscript3代码):varpat:RegExp=/(#\w{6})([^#]+)/g;varhtml:String=t.replace(pat,"$2");trace(html);//output:firstwordsecondwordthirdword如果该字符串中还有一个#,输出将不会像我想要

  8. javascript - 使用 IE、FF 和 Chrome 通过 JavaScript 从 Excel 中检索数据 - 2

    我有一个名为test.xls的excel文件。下面的JS代码很好地从InternetExplorer中的Excel中检索数据。但我想使用Firefox和Chrome。FF和Chrome的代码是什么?StyleGetdatafromexcelsheetfunctionGetData(cell,row){varexcel=newActiveXObject("Excel.Application");varexcel_file=excel.Workbooks.Open("F:\\test.xls");varexcel_sheet=excel.Worksheets("Sheet1");varda

  9. javascript - IE 是否有像 Chrome、FF、Safari 和 Opera 那样简单的、javascript 驱动的扩展开发方式? - 2

    在放弃广泛的谷歌搜索之前,我想我会做最后的努力并在这里问...在Chrome、Safari、Firefox和Opera中——使用javascript(以及每个浏览器的一些nativejavascript函数)编写浏览器扩展非常容易...我似乎无法为IE找到这样的等效项。我见过Greasemonkey的替代品——其中大部分仅适用于非常简单的脚本。IE9或10是否支持使用javascript而不是C等的扩展开发?我有一个在FF、Chrome、Safari和Opera中工作的相当大的扩展,如果它不意味着完全重写成不同的语言,我很乐意支持IE,但我似乎找不到任何类型的IE等效于“内容脚本”或“

  10. javascript - 是否有 FF 等同于 chrome.declarativeContent.onPageChanged? - 2

    我正在将Chrome扩展程序移植到FirefoxWebExtensions,我一直在寻找chrome.declarativeContent.onPageChanged的解决方法。我的FFWebextension包含一个在某些网站上导航时必须显示的页面操作。但是,可用API中的所有监听器似乎都不允许这样做。特别是我试过:chrome.runtime.onInstalled.addListener(onChange);chrome.tabs.onCreated.addListener(onChange);chrome.tabs.onActivated.addListener(onChang

随机推荐