题目大意 有\(n\)(\(n\leq 5*10^5\))个闭区间\([L_1,R_1],[L_2,R_2],...,[L_n,R_n]\)(\(\forall i\in [1,n],0\leq L_i\leq R_i\leq 10^9\)) 要选取\(m\)个区间,使这\(m\)个区间的交不为空,方案的花费为被选中的区间中 长度最长的区间的长度 减 长度最短的区间的长度 求花费最小的方案,或判断无解 题解 将\(n\)个区间按区间长度排序 问题转化成对于所有满足存在一点被\([L_l,R_l]…
P1712 [NOI2016]区间 题意 题目描述 在数轴上有 \(N\) 个闭区间 \([l_1,r_1],[l_2,r_2],...,[l_n,r_n]\) .现在要从中选出 \(M\) 个区间,使得这 \(M\) 个区间共同包含至少一个位置.换句话说,就是使得存在一个 \(x\) ,使得对于每一个被选中的区间 \([l_i,r_i]\) ,都有 \(l_i \leq x \leq r_i\) . 对于一个合法的选取方案,它的花费为被选中的最长区间长度减去被选中的最短区间长度.区间 \([l…
[题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后,答案是一段子序列.所以我们考虑枚举右端点,尺取法取右边的线段,去到可以满足条件时将左边的这条线段删除.现在就是要维护一个数据结构可以得到是否存在一个点被覆盖了\(m\)次,直接线段树维护每个点被覆盖多少次即可.就是线段树支持区间加和求区间单点最值. 1A掉了很舒爽代码 //@winlere #inc…
洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一个点被覆盖次数大于m 我们将覆盖这个点的区间升序排序: 则所选区间一定是排序后序列中的一个长度为m+1的连续子序列 证明很容易,取更远的点会使最大值更大从而使差值最大 我们可以从这个结论出发,再观察该题所求,符合尺取法的思路 我们考虑用尺取法求解 没了解尺取法的读者可以去自行了解一下 如何求解呢?…
题目大意 有一个\(n*m\)(\(n,m\leq10^9\))的网格,每个格子是空地或障碍(\(障碍数\leq10^5\)) 定义两块空地连通,当且仅当它们是"相邻的两块空地"或"存在一块空地与这两块空地连通的两块空地"(也就是四连通) 求至少添加多少块障碍物,使存在两块空地不连通,或者输出-1表示无解 题解 当只有一块空地或只有两块相邻的空地时,无解 有解时,发现总能找到一个角落,使只用两个障碍物就能将这个角落和外界分开(如图) 也就是说,答案不超过2 当初始的…
http://uoj.ac/problem/222 (题目链接) 题意 有n个区间,当有m个区间有公共部分时,求m个区间长度的最大值与最小值之差的最小值. Solution 线段树+滑动窗口.这道题很好做,可是在考场上就差一点点,我愣是没想出来. 先将区间按长度排序,保证它们的长度是递增的,这样就可以滑动窗口了.将区间的端点离散化后,用线段树维护每个节点被覆盖的次数,记录当前区间被覆盖次数最多的点被覆盖多少次,当次数达到要求是更新答案,将头指针向后移动. 代码 // uoj222 #includ…
https://www.lydsy.com/JudgeOnline/problem.php?id=4653 https://www.luogu.org/problemnew/show/P1712 http://uoj.ac/problem/222 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x,使得对于每一个被选中的区间 [li,ri],都有 li≤x≤ri. 对于一…
题目描述 在数轴上有 NN 个闭区间 [l_1,r_1],[l_2,r_2],...,[l_n,r_n][l1​,r1​],[l2​,r2​],...,[ln​,rn​] .现在要从中选出 MM 个区间,使得这 MM 个区间共同包含至少一个位置.换句话说,就是使得存在一个 xx ,使得对于每一个被选中的区间 [l_i,r_i][li​,ri​] ,都有 l_i≤x≤r_ili​≤x≤ri​ . 对于一个合法的选取方案,它的花费为被选中的最长区间长度减去被选中的最短区间长度.区间 [l_i,r_i…
传送门 考虑将所有的区间按长度排序 考虑怎么判断点被多少区间覆盖,这个可以离散化之后用一棵权值线段树来搞 然后维护两个指针$l,r$,当被覆盖次数最多的点的覆盖次数小于$m$时不断右移$r$,在覆盖次数大于等于$m$时不断右移$l$,然后每一次用$len[r]-len[l]$更新答案,其中$len$表示该区间的长度 //minamoto #include<iostream> #include<cstdio> #include<algorithm> #define inf…
题目描述 在数轴上有 n个闭区间 [l1,r1],[l2,r2],...,[ln,rn].现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置.换句话说,就是使得存在一个 x,使得对于每一个被选中的区间 [li,ri],都有 li≤x≤ri. 对于一个合法的选取方案,它的花费为被选中的最长区间长度减去被选中的最短区间长度.区间 [li,ri] 的长度定义为 ri−li,即等于它的右端点的值减去左端点的值. 求所有合法方案中最小的花费.如果不存在合法的方案,输出 −1 输入描述: 第一…