HDOJ1384 Intervals 题解
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1384
大意:有 \(n\) 个区间 \([a_i,b_i]\),每个区间有个权值 \(c_i\),找到一个最小的整数集合 \(U\) 满足,任意 \(i\) 都有 \([a_i,b_i]∩U\) 的元素个数大于等于 \(c_i\),求 \(U\) 元素个数
(\(1\le n \le 50000\),\(0\le a_i \le b_i \le 50000\),\(1\le c_i \le b_i-a_i+1\))
网上找了找发现都是差分约束的题解,我用树状数组+并查集过了,于是就有了这篇辣鸡题解
思路简单来说就是贪心,每次找到右端点最小的区间 \([a_i,b_i]\),令 \(cnt\) 为这个区间内已经存在的点数,从 \(b_i\) 开始往前找 \(c_i-cnt\) (小于等于 \(0\) 就不用管啦)个未被选取的点,选取之
那么并查集有啥用呢?就是快速找到未选取的元素(因为选了的元素被合并了)
复杂度 \(O(n\log W+W)\)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define mst(a,x) memset(a,x,sizeof(a))
inline ll read(){ll x; if(scanf("%lld",&x)==-1)exit(0); return x;}
const int N=50010;
const int mod=(1?1000000007:998244353);
#define lb(x) (x&(-x))
struct BIT{ //树状数组
ll t[N];
void add(ll x,ll k){
x++;
for(;x<=50009;x+=lb(x))
t[x]+=k;
}
ll sum(ll x){
x++;
ll ans=0;
for(;x!=0;x-=lb(x))
ans+=t[x];
return ans;
}
}bit;
struct DSU{ //并查集
int a[N];
void init(int n){iota(a,a+n+1,0);}
int fa(int x){return a[x]==x?x:a[x]=fa(a[x]);}
inline int &operator[](int x){return a[fa(x)];}
}d;
struct node{
int l,r,w;
bool operator<(const node &b)const{
return r<b.r; //按右端点排序
}
}a[N];
signed main(){
ios_base::sync_with_stdio(0); cin.tie(0);
while(1){
int n=read();
repeat(i,0,n){
a[i].l=read()+2;
a[i].r=read()+2;
a[i].w=read();
}
sort(a,a+n);
mst(bit.t,0);
d.init(N-1);
int ans=0;
repeat(i,0,n){
auto x=a[i];
int cnt=bit.sum(x.r)-bit.sum(x.l-1); //区间中已被选取的元素个数
int k=d[x.r];
while(cnt<x.w){
bit.add(k,1); //选取k
d[k]=d[k-1]; //删除k
k=d[k]; //查找k之前第一个未被删除的元素
ans++,cnt++;
}
}
printf("%d\n",ans);
}
return 0;
}
然后差分约束的解法不算难( 但是我没看出来),别的题解讲挺清楚的我就不写了
HDOJ1384 Intervals 题解的更多相关文章
- 【LeetCode】Merge Intervals 题解 利用Comparator进行排序
题目链接Merge Intervals /** * Definition for an interval. * public class Interval { * int start; * int e ...
- POJ1375:Intervals——题解
http://poj.org/problem?id=1375 题目大意:有一盏灯,求每段被圆的投影所覆盖的区间. —————————————————————— 神题,卡精度,尝试用各种方法绕过精度都不 ...
- [Leetcode Week2]Merge Intervals
Merge Intervals题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/merge-intervals/description/ Descript ...
- 算法与数据结构基础 - 排序(Sort)
排序基础 排序方法分两大类,一类是比较排序,快速排序(Quick Sort).归并排序(Merge Sort).插入排序(Insertion Sort).选择排序(Selection Sort).希尔 ...
- 算法与数据结构基础 - 贪心(Greedy)
贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...
- [LeetCode]题解(python):056-Merge Intervals
题目来源 https://leetcode.com/problems/merge-intervals/ Given a collection of intervals, merge all overl ...
- 【题解】【区间】【二分查找】【Leetcode】Insert Interval & Merge Intervals
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...
- LeetCode 题解 56. Merge Intervals
题目大意:给出一组区间,合并他们. 首先是排序,首先看start,start小的在前面.start相同的话,end小的在前面. 排序以后,要合并了. 我自己的笨方法,说实在的问题真的很多.提交了好几次 ...
- leetcode个人题解——#56 Merge Intervals
思路,先按照结构体中start进行排序,然后遍历比较前后项是否有重合. 第一次用到三参数形式的sort(),第三个参数的bool函数要写到类外才通过. /** * Definition for an ...
随机推荐
- CCF_ 201403-2_窗口
用deque模拟. #include<iostream> #include<cstdio> #include<deque> using namespace std; ...
- Codeforces 922 E Birds (背包dp)被define坑了的一题
网页链接:点击打开链接 Apart from plush toys, Imp is a huge fan of little yellow birds! To summon birds, Imp ne ...
- java代码之美(15)---Java8 Function、Consumer、Supplier
Java8 Function.Consumer.Supplier 有关JDK8新特性之前写了三篇博客: 1.java代码之美(1)---Java8 Lambda 2.java代码之美(2)---Jav ...
- 题解【Luogu6022 快乐水】
\[ Preface \] 大概在半年前出过这道((( 然后当天读完这题,把自己写的 std 改了一下 ll 和特判信息交上去就 A 了. 捡了个大便宜. \[ Description \] 你一开始 ...
- kendo ui 实现MVVM
MVVM model----view model----model 实现页面和model之间的动态绑定 grid 支持 events source visib ...
- Element ui select 同时获取value和label的值
html <el-form-item label="单位名称" prop="checkInUnitName"> <el-select v-mo ...
- Go语言实现:【剑指offer】二叉树的下一个结点
该题目来源于牛客网<剑指offer>专题. 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回. 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. Go语 ...
- vue的组件传值
1.父组件向子组件传值 父组件: 123456789101112 <template> <child :name="name"></child> ...
- Python3 (五)函数应用
一.认识函数 在命令行中查看内置函数的方法: 1.先在命令行里输入python 2.help(函数) 二.函数的定义及运行特点 1.函数基本定义: def funcname(parameter_lis ...
- Java类的加载过程与ClassLoader的理解及测试
当程序准备运行某个类,但该类还未被加载到内存中时,会经过以下三个步骤进行类的加载: 类的加载(Load)→类的连接(Link)→类的初始化(Initialize) 加载:类经过javac.exe编译的 ...