首页 > 其他分享 >题解 QOJ1173【Knowledge Is...】 / accoders::NOI 5681【interval】

题解 QOJ1173【Knowledge Is...】 / accoders::NOI 5681【interval】

时间:2023-12-11 15:46:38浏览次数:32  
标签:q1 ... q2 匹配 NOI int 题解 区间

https://qoj.ac/contest/537/problem/1173

problem

给定 \(n\leq 10^6\) 个区间,你需要求出能够最多选出多少对区间,使得两个区间不交(区间为闭区间)。要求一个区间最多属于一对选出的区间。

solution

这是一般图匹配问题的特殊情况,所以放弃 dp,考虑贪心、网络流、匹配等。

按照左端点对所有区间排序。考虑维护两堆东西:第一堆是未匹配的区间,第二堆是已经匹配的区间对。每次加进来一个新的区间 \(c\),如果能和未匹配区间匹配那么就匹配掉,然后加入匹配区间对。否则,考虑这个一个事情,对于匹配的区间 \(a, b(a_r<b_l)\),现在显然加入的 \(a_r<c_l\),如果 \(b_r<c_r\),那么不要将 \(c\) 扔进待匹配队列中,而是匹配 \(a, c\),准备将 \(b\) 扔进去。对 \(b\) 重复上述过程,首先它不能去匹配新的区间,因为它的 \(l\) 更小,其次它尝试去换个新的区间,这么一看其实我们使得 \(b\) 是所有符合条件中 \(r\) 最小的那个,这样 \(b\) 就换完,直接丢进未匹配区间。至于 \(c\) 不能匹配,换匹配也不优,直接丢入未匹配队列。这样以后,你发现未匹配区间不会多出新的可以匹配的区间,于是你不用管他们,算法正确。

显见使用 priority_queue 维护。两堆都按照 \(r\) 排序。

\(O(n\log n)\)

构造方案的话,不想写了,就是记一记下标。

code

点击查看代码
// ubsan: undefined
// accoders
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#define debug(...) fprintf(stderr, ##__VA_ARGS__)
#else
#define debug(...) void(0)
#endif
typedef long long LL;
int main() {
    freopen("interval.in", "r", stdin);
    freopen("interval.out", "w", stdout);
    cin.tie(nullptr)->sync_with_stdio(false);
    int n;
    cin >> n;
    vector<pair<int, int>> a(n);
    for (int i = 0; i < n; i++) cin >> a[i].first >> a[i].second;
    sort(a.begin(), a.end());
    priority_queue<int, vector<int>, greater<int>> q1, q2;
    int ans = 0;
    for (auto elem : a) {
        int l = elem.first, r = elem.second;
        if (!q1.empty() && q1.top() < l) {
            q1.pop();
            ans += 1;
            q2.push(r);
        } else if (!q2.empty() && q2.top() < r) {
            q1.push(q2.top());
            q2.pop();
            q2.push(r);
        } else {
            q1.push(r);
        }
    }
    cout << ans << endl;
    return 0;
}


标签:q1,...,q2,匹配,NOI,int,题解,区间
From: https://www.cnblogs.com/caijianhong/p/solution-qoj1173.html

相关文章

  • NOIP 2023 寄
    NOIP2023寄被卷暴了qwq上了三周常规之后分数线才出来,感觉大抵是已经好似了罢。11.13-11.17这一周其实也没什么特别的,也没有跟之前CSP一样搞活动(话说曹是不是说过NOIP前一周要出去找场子搞运动来着?)。但是这周确实颓得相对比较多诶(包括但不限于KunKunNight、台球、GTA......
  • P5048 [Ynoi2019 模拟赛] 题解
    题意给定\(n\)个数,有\(m\)个询问,每个询问给定\(l\)和\(r\),求出区间\(l\)到\(r\)中的最小众数出现次数,强制在线。数据范围:\(n\le500000\),空间限制:\(62.5MB\)。思路这道题的弱化版是蒲公英,这道题加强的地方在于数据范围。正常的分块求区间众数的空间复杂度是\(O(n......
  • CF1842E Tenzing and Triangle 题解
    题意不多赘述。思路如果两个所选的三角形有重合部分的话,那么这种情况肯定是不会出现的。因为如果把这两个三角形合成一个大三角形的话,不仅覆盖面积会增大,而且花费的代价还不会多。于是我们可以想到用dp来解决,设\(dp_{i}\)表示删完横坐标为\(0\)到\(i\)中的点的最小代价......
  • [ABC304Ex] Constrained Topological Sort 题解
    题意给定一张有向图\(G\),有\(n\)个点和\(m\)条边,问是否存在一种拓扑序的排列\(P\)使得\(l_{i}\lep_{i}\ler_{i}\)。思路首先对于一条边\(u\tov\),如果限制满足\(r_{v}\ler_{u}\)或者\(l_{v}\gel_{u}\)的话,那么这个限制其实是不完全正确的。因为最终的序列......
  • 今天在地铁认识一个女程序员,在外包公司工作三年被裁,只赔偿 4000...
    来源:https://www.163.com/dy/article/G9K7V11T05373SPQ.html今天在地铁认识一个女(硕士),我邀请她来我公司面试,她要求15000一个月,听她说被外包公司骗了,合同都是套路,被裁员后只获得4000元的赔偿,就这个举动,我感觉她是一个职场小白,我看她学历这么高就给了一次机会她。她自我介绍说:学......
  • sqlalchemy 实现 mysql INSERT INTO...ON DUPLICATE KEY UPDATE语法
    1.前言myql的INSERTINTO...ONDUPLICATEKEYUPDATE语句,简单点来说,就是如果记录不存在,则插入,如果记录存在,则更新。那怎么判断记录存在否?——主键、唯一键。那不是可以使用replace语句吗?——原理上可以,但是sqlalchemyorm中的的实现,是使用merge语法,这个语法有一个限制,就是判......
  • 【题解】AtCoder abc322_f Random Update Query
    传送门:https://atcoder.jp/contests/abc332/tasks/abc332_f容易发现,对于一个位置$i$,$A_i$的最终值是由对$i$的最后一次赋值操作决定的;因此,将所有操作按时间顺序倒过来考虑,则由第$j$次操作决定$A_i$最终值的概率为"在第$(j+1)$~$m$次操作中没有修改过$i$的概率"与"第......
  • 2023 NOIP 游记 && 真正的退役记
    1.复役之曙光2023.11.3退役纪元第一天我得知了我的CSP-S复赛分数。不出所料,文操打挂的T1没有出现奇迹,后面两题也是平淡如清汤,没有给我任何惊喜。\(35\)分,或许是我的\(OI\)生涯中最不堪入目的成绩。我以为我的\(OI\)之路就要像这次的成绩一样无声地凋零,碾碎在繁忙人......
  • 【题解】AtCoder abc332_g Not Too Many Balls
    传送门:https://atcoder.jp/contests/abc332/tasks/abc332_g看完题,第一眼反应为最大流。建模方式为:以颜色为左部点,盒子为右部点,源点$S$向颜色$i$连一条容量为$A_i$的边,盒子$j$向汇点$T$连一条容量为$B_j$的边,颜色$i$向盒子$j$连一条容量为$ij$的边;在这张图......
  • P3227 [HNOI2013] 切糕
    题意linkSol考虑不戴限制的情况,那就是对于每一层连到下一层跑网络流。考虑戴上添边,不难发现向相邻的点连一条\(inf\)边就行了。Code#include<iostream>#include<algorithm>#include<cstdio>#include<array>#include<queue>#defineintlonglong#definepiipa......