题目链接: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. 1751: n个素数构成等差数列

    #include <stdio.h>int fill(char *map,int *primes) { for (int i = 2; i < 1001; i++) { map[i] ...

  2. tomcat的编码设置

    Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"          ...

  3. python——3种字符串反转方法

    在学习过程中,总结了3种字符串反转方法: 1.切片法 这种方法最为简便 str='abad' print(str[::-1]) · 用切片操作,将字符串以步长-1重新整理,即 'str[-1],str ...

  4. linux入门系列10--firewalld防火墙管理

    上一篇文章学习了用户及文件相关权限,本篇继续学习防火墙技术. 防火墙作为公网与内网之间的保护屏障,对系统至关重要.防火墙又分为硬件防火墙和软件防火墙,主要功能都是依据设置的策略对穿越防火墙的流量进行过 ...

  5. 浅谈二分—— by hyl天梦

    二分 解决范围 二分法可以用来解决这一系列具有单调性质的题,例如求单调函数的零点 其实在小学奥数中就用到了二分法 例如手动开根号,再比如猜数游戏 二分的具体过程就是先取一个中间值,判定一下正确答案在哪 ...

  6. 01背包与完全背包(dp复习)

    01背包和完全背包都是dp入门的经典,我的dp学的十分的水,借此更新博客的机会回顾一下 01背包:给定总容量为maxv的背包,有n件物品,第i件物品的的体积为w[i],价值为v[i],问如何选取才能是 ...

  7. 多用as少用强制类型转换

    在 C# 中存在一个名叫静态类型检查的机制,这个机制可以让编译器帮助我们把类型不服的用法找出来,从而使得应用程序在运行期间加少一些类型检查的操作.但是有时候我们还是需要进行运行期类型检查,比如我们在设 ...

  8. VFP获取 SQL Server 的数据表、触发器、存储过程、视图等脚本

    本文代码转载自红雨先生 *-----------------------------------------------* SqlServer 相关函数*----------------------- ...

  9. STM32,ARM,Keil工具相关

    One ELF Section per Function https://blog.csdn.net/iceiilin/article/details/6091575 因此,可以得出,选项One EL ...

  10. GNU C相关

    GNU __attribute__ 用于在函数声明时,定义函数参数的一些特殊属性,比如,如果函数的某个参数可能用不到,那么,将该参数增加unused属性即可,如下(一般用两个括号包括属性unused) ...