题目链接: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 题解的更多相关文章

  1. 【LeetCode】Merge Intervals 题解 利用Comparator进行排序

    题目链接Merge Intervals /** * Definition for an interval. * public class Interval { * int start; * int e ...

  2. POJ1375:Intervals——题解

    http://poj.org/problem?id=1375 题目大意:有一盏灯,求每段被圆的投影所覆盖的区间. —————————————————————— 神题,卡精度,尝试用各种方法绕过精度都不 ...

  3. [Leetcode Week2]Merge Intervals

    Merge Intervals题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/merge-intervals/description/ Descript ...

  4. 算法与数据结构基础 - 排序(Sort)

    排序基础 排序方法分两大类,一类是比较排序,快速排序(Quick Sort).归并排序(Merge Sort).插入排序(Insertion Sort).选择排序(Selection Sort).希尔 ...

  5. 算法与数据结构基础 - 贪心(Greedy)

    贪心基础 贪心(Greedy)常用于解决最优问题,以期通过某种策略获得一系列局部最优解.从而求得整体最优解. 贪心从局部最优角度考虑,只适用于具备无后效性的问题,即某个状态以前的过程不影响以后的状态. ...

  6. [LeetCode]题解(python):056-Merge Intervals

    题目来源 https://leetcode.com/problems/merge-intervals/ Given a collection of intervals, merge all overl ...

  7. 【题解】【区间】【二分查找】【Leetcode】Insert Interval & Merge Intervals

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  8. LeetCode 题解 56. Merge Intervals

    题目大意:给出一组区间,合并他们. 首先是排序,首先看start,start小的在前面.start相同的话,end小的在前面. 排序以后,要合并了. 我自己的笨方法,说实在的问题真的很多.提交了好几次 ...

  9. leetcode个人题解——#56 Merge Intervals

    思路,先按照结构体中start进行排序,然后遍历比较前后项是否有重合. 第一次用到三参数形式的sort(),第三个参数的bool函数要写到类外才通过. /** * Definition for an ...

随机推荐

  1. Huffman编码和解码

    一.Huffman树 定义: 给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径达到最小,这样的二叉树称为最优二叉树,也称为霍夫曼树(Huffman树). 特点:     Huffman树 ...

  2. https搭建(自签名证书)

    博客搬家: https搭建(自签名证书) 上一篇博客探究了https(ssl)的原理,为了贯彻理论落实于实践的宗旨,本文将记录我搭建https的实操流程,使用Apache2+ubuntu+openss ...

  3. Codeforces_714

    A.相遇时间段l = max(l1,l2),r = min(r1,r2),再判断k是否在里面. #include <iostream> using namespace std; long ...

  4. 必知必会之Lambda表达式

    Java是一门强大的面向对象的语言,除了8种基本的数据类型,其他一切皆为对象.因此,在Java中定义函数或方法都离不开对象,也就意味着很难直接将方法或函数像参数一样传递,而Java8中的Lambda表 ...

  5. 中小企业自建云WAF有多难?只需20分钟!而且:全程免费!

    以往,运营型的web为了安全目的,才使用WAF进行安全防护. 而现如今,WAF对企业web来说,已然成了刚需.为何?等保.网络安全法的硬性要求! 当然,这样要求显然是对的:没有网络安全,就没有国家安全 ...

  6. 论文《learning to link with wikipedia》

    learning to link with wikipedia 一.本文目标: 如何自动识别非结构化文本中提到的主题,并将其链接到适当的Wikipedia文章中进行解释. 二.主要借鉴论文: Miha ...

  7. Linux相关知识笔记

    Quagga要在linux下编译并配置运行,所有,学习一点linux的基础知识. 安装的Ubuntu,用户名linux,密码1 使能Ubuntu的IP转发功能,需要修改etc/sysctl.conf和 ...

  8. .NET Core之单元测试(四):Fluent Assertions的使用

    目录 什么是Fluent Assertions 待测试API 测试用例 什么是Fluent Assertions Fluent Assertions 是 .NET 平台下的一组扩展方法,用于单元测试中 ...

  9. sublime笔记

    插件安装和使用 首先,要安装package control,按照官方方法安装: https://packagecontrol.io/installation 重启Sublime Text 3. 如果在 ...

  10. python新手如何编写一个猜数字小游戏

    此文章只针对新手,希望大家勿喷,感谢!话不多说先上代码: import random if __name__ == '__main__': yourname = input("你好! 你的名 ...