ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

codeforces1175E Minimal Segment Cover 倍增

2019-09-26 19:56:22  阅读:270  来源: 互联网

标签:ch 线段 Cover codeforces1175E 端点 include Segment ll define


题目传送门

题意:给出n条平行于x轴的线段,q次询问,每次询问一个区间最少要几条线段来覆盖,若不能覆盖则输出-1.

思路:先考虑贪心,必定是先找到,所有左端点小于等于$x$的线段的右端点最大在哪里,然后答案加一,将$x$挪到这个最大右端点,继续贪心,直到右端点大于$y$。

  考虑优化,可以用倍增来加速这个过程,先用初始的线段预处理出所有的$f[i][j]$,代表第i个节点跳跃{2^j}个线段最大能到达多少个右端点,然后倍增搞一下,每次询问的时候,也是二分的跳,每次的时间复杂度都是$log(n)$,总的时间复杂度是$nlog(n)$。

#pragma GCC optimize (2)
#pragma G++ optimize (2)
#pragma comment(linker, "/STACK:102400000,102400000")
#include<bits/stdc++.h>
#include<cstdio>
#include<vector>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,b,a) for(int i=b;i>=a;i--)
#define clr(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define pii pair<int,int >
using namespace std;
typedef long long ll;
const int maxn=500010;
ll rd()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int f[maxn][22],maxx,x,y,n,q;
int fac[22];
int main(){
    fac[0]=1;
    rep(i,1,20){
        fac[i]=2*fac[i-1];
    }
    while(cin>>n>>q){
        clr(f,0);
        rep(i,1,n){
            scanf("%d%d",&x,&y);
            f[x][0]=max(f[x][0],y);
        }
        maxx=500000;
        rep(i,1,maxx){
            f[i][0]=max(f[i][0],f[i-1][0]);
            if(f[i][0]<=i)f[i][0]=0;
        }
//        puts("debug");
        rep(i,1,20){
            rep(j,0,maxx){
                if(f[j][i-1]!=0&&f[f[j][i-1]][i-1]!=0){
                    f[j][i]=f[f[j][i-1]][i-1];
                }
            }
        }
        while(q--){
            scanf("%d%d",&x,&y);
            int r=x;
            int ans=0;
            dep(i,20,0){
                if(f[r][i]==0)continue;
                if(f[r][i]<y){
                    ans+=fac[i];
                    r=f[r][i];
                }
            }
            if(f[r][0]>=y){
                printf("%d\n",ans+1);
            }else{
                puts("-1");
            }
        }
    }
}

 

标签:ch,线段,Cover,codeforces1175E,端点,include,Segment,ll,define
来源: https://www.cnblogs.com/mountaink/p/11593946.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有