BUPT2017 wintertraining(15) #8D

题意

给你x轴上的N个线段,M次查询,每次问你[l,r]区间里最多有多少个不相交的线段。(0<N, M<=100000)

限时15000 MS

题解

如果不看限时,当作是1000MS的话= =,那么可以用倍增来做。

先按右端点排序。

可以去掉一下包含了其它区间的区间,可以优化一点点。

用 f[i][j] 表示 i 节点下 \(2^n\) 个不相交的线段下标。

预处理出 f 数组。

查询的时候,左端点用二分,然后右端点用倍增来找。

实际上不用倍增,也可以卡时间过。

代码

780ms

#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 100005
using namespace std;
struct Seg{
int s,e;
bool operator < (const Seg &b) const{
return e<b.e||e==b.e&&s>b.s;
}
}seg[N];
int n,m;
int f[N][32];
int main(){
while(~scanf("%d %d", &n, &m)){
for(int i=0;i<n;++i)
scanf("%d %d", &seg[i].s, &seg[i].e);
memset(f,-1,sizeof f);
sort(seg,seg+n);
int nn=0;
for(int i=1;i<n;++i)
if(seg[nn].s<seg[i].s)
seg[++nn]=seg[i];
++nn;
for(int i=0;i<nn;++i){
f[i][0]=i+1;
while(f[i][0]<nn&&seg[f[i][0]].s<seg[i].e)++f[i][0];
if(f[i][0]==nn)f[i][0]=-1;
}
for(int j=0;j<30;++j)
for(int i=0;i<nn;++i)
if(f[i][j]!=-1)
f[i][j+1]=f[f[i][j]][j];
for(int i=1,s,e;i<=m;++i){
scanf("%d %d", &s, &e);
int l=0, r=nn-1;
while(l<r){
int m=l+r>>1;
if(seg[m].s<s)
l=m+1;
else
r=m;
}
if(seg[l].e>e||seg[l].s<s)puts("0");
else{
int ans=1;
for(int j=29;j>=0;--j){
if(f[r][j]!=-1&&seg[f[r][j]].e<=e){
r=f[r][j];
ans+=(1<<j);
}
}
printf("%d\n", ans);
}
}
}
return 0;
}

1045ms

#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 100005
using namespace std;
struct Seg {
int s, e;
bool operator < (const Seg &b) const {
return e < b.e || e == b.e && s > b.s;
}
} seg[N];
int n, m;
int main() {
while(~scanf("%d %d", &n, &m)) {
for(int i = 0; i < n; ++i)
scanf("%d %d", &seg[i].s, &seg[i].e);
sort(seg, seg + n);
int nn = 0;
for(int i = 1; i < n; ++i)
if(seg[nn].s < seg[i].s)
seg[++nn] = seg[i];
++nn;
for(int i = 1, s, e; i <= m; ++i) {
scanf("%d %d", &s, &e);
int l = 0, r = nn - 1;
while(l < r) {
int m = l + r >> 1;
if(seg[m].s < s)
l = m + 1;
else
r = m;
}
if(seg[l].e > e || seg[l].s < s)puts("0");
else {
int ans = 1;
for(int i = l, j = l + 1; j < nn && seg[j].e <= e; ++j) {
if(seg[i].e <= seg[j].s) {
i = j;
++ans;
}
}
printf("%d\n", ans);
}
}
}
return 0;
}

【HDU 4343】Interval query(倍增)的更多相关文章

  1. HDU 4343 Interval query(贪心 + 倍增)

    题目链接  2012多校5 Problem D 题意  给定$n$个区间,数字范围在$[0, 10^{9}]$之间,保证左端点严格大于右端点. 然后有$m$个询问,每个询问也为一个区间,数字范围在$[ ...

  2. 【HDOJ】4343 Interval query

    最大不相交集合的数量.思路是dp[i][j]表示已经有i个不相交集合下一个不相交集合的最右边界.离散化后,通过贪心解. /* 4343 */ #include <iostream> #in ...

  3. HDU 4343 D - Interval query 二分贪心

    D - Interval queryTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest ...

  4. HDU 4343 贪心

    D - Interval queryTime Limit: 1.5 Sec Memory Limit: 256 MB Description This is a very simple questio ...

  5. 刷题总结——Interval query(hdu4343倍增+贪心)

    题目: Problem Description This is a very simple question. There are N intervals in number axis, and M ...

  6. HDU 5875 Function 【倍增】 (2016 ACM/ICPC Asia Regional Dalian Online)

    Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  7. hdu 5726 GCD 暴力倍增rmq

    GCD/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Give you a sequence ...

  8. HDU4343Interval query 倍增

    去博客园看该题解 题意 给定n个区间[a,b),都是左闭右开,有m次询问,每次询问你最多可以从n个区间中选出多少[L,R]的子区间,使得他们互不相交. n,m<=10^5. 区间下标<=1 ...

  9. HDU 6107 Typesetting (倍增)

    Typesetting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

随机推荐

  1. python中读取文件的read、readline、readlines方法区别

    #读取文件所有内容,返回字符串对象,python默认以文本方式读取文件,遇到结束符读取结束. fr = open('lenses.txt')read = fr.read()print(type(rea ...

  2. iOS上手指点击波纹效果的实现

    https://www.jianshu.com/p/35e6f53ca0fe 2016.10.19 22:00* 字数 135 阅读 2468评论 2喜欢 7 闲暇时间做了一个反馈手指点击屏幕的效果, ...

  3. 软件工程(FZU2015) 赛季得分榜,第六回合

    SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分=团队得分+个人贡献分 个人贡献分: 个人 ...

  4. 1px实现方案

    JS处理 首先,可以通过 window.devicePixelRatio 拿到设备的像素比,然后给 html 标签加上的相应的样式. function retina () { // 高分辨率屏幕处理 ...

  5. WPF中定时器Timer与DispatcherTimer的用法

    最近的工作项目中需要定时更新UI控件中的数据,这时候第一反应肯定会想到去使用System.Timers.Timer定时更新UI控件,但是程序运行后,会发现程序崩溃了.报的异常为“调用线程无法访问此对象 ...

  6. IDEA将项目上传至码云/GitHub托管

    怎么将本地的项目放到码云或者GitHub去托管了?(以码云为例) 一.创建远程项目 第一步:点击创建项目 第二步:填写项目相关信息 第三步:复制远程的项目地址,注意:此处码云官方已经给出上传项目方法, ...

  7. HDU 2459 Maximum repetition substring

    题目:Maximum repetition substring 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2459 题意:给你一个字符串,求连续重复出现 ...

  8. Day5-1 面向对象和面向过程

    摘要: 类的定义 类的增删改查 对象的增删改查 对象的查找和绑定 面向对象和面向过程的区别: 1.面向过程就像是工厂的流水线,按部就班的有序的工作. 优点:把复杂的问题简单化 缺点:可扩展性差.一个步 ...

  9. 【转】Java基础——容器分类

    Java容器可以说是增强程序员编程能力的基本工具,本系列将带您深入理解容器类. 容器的用途 如果对象的数量与生命周期都是固定的,自然我们也就不需要很复杂的数据结构. 我们可以通过创建引用来持有对象,如 ...

  10. 【转】Git 代码行统计命令集

    查看git上个人代码量 git log --author="username" --pretty=tformat: --numstat | awk '{ add += $1; su ...