zoukankan      html  css  js  c++  java
  • 【NOI2016】区间

    题面

    https://www.luogu.org/problem/P1712

    题解

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int N=500500;
    const int inf=1e9;
    struct point{
      int val,ord;
    } p[N*4];
    struct data{
      int len,ord;
    } a[N*4];
    int L[2*N],R[2*N],n,m,Right,cur=0;
    int tree[N*8],add[N*8];
    bool cmp1(point x1,point x2){
      return x1.val<x2.val;
    }
    bool cmp2(data x1,data x2){
      return x1.len<x2.len;
    }
    void down(int rt,int l,int r){
      if (!add[rt]) return;
      int ls=2*rt,rs=2*rt+1;
      tree[ls]+=add[rt];
      tree[rs]+=add[rt];
      add[ls]+=add[rt];
      add[rs]+=add[rt];
      add[rt]=0;
      return;
    }
    void update(int rt,int l,int r,int x,int y,int val){
      if(x>r||y<l) return;
      if(x<=l && y>=r) {
        tree[rt]+=val;
        add[rt]+=val;
        return;
      }
      int mid=(l+r)/2;
      down(rt,l,r);
      update(rt*2,l,mid,x,y,val);
      update(rt*2+1,mid+1,r,x,y,val);
      tree[rt]=max(tree[rt*2],tree[rt*2+1]);
    }
    int main() {
      scanf("%d %d",&n,&m);
      for (int i=1;i<=n;i++) {
        int u,v;
        scanf("%d %d",&u,&v);
        a[i].len=v-u;
        a[i].ord=i;
        cur++;p[cur].val=u;p[cur].ord=i;
        cur++;p[cur].val=v;p[cur].ord=i;
      }
      sort(p+1,p+cur+1,cmp1);
      int num=1;
      p[0].val=-1;
      for (int i=1;i<=cur;i++) {
        if (p[i].val!=p[i-1].val) num++;
        int u=p[i].ord;
        if (!L[u]) L[u]=num; else R[u]=num;
      }
      Right=num;
      sort(a+1,a+n+1,cmp2);
      int ans=inf,le=0,ri=0;
      while (1) {
        while (tree[1]<m && ri<=n) {
          ri++;
          int u=a[ri].ord,v=L[u],w=R[u];
          update(1,1,Right,v,w,1);
        }
        if (tree[1]<m) break;
        while (tree[1]>=m && le<=n) {
          le++;
          int u=a[le].ord,v=L[u],w=R[u];
          update(1,1,Right,v,w,-1);
        }
        ans=min(ans,a[ri].len-a[le].len);
      }
      if (ans==inf) puts("-1"); else printf("%d
    ",ans);
      return 0;
    }
  • 相关阅读:
    [no_code][Beta]事后分析
    [no_code][Beta]项目展示博客
    [no_code][Beta]测试报告
    [no_code][Beta]发布声明报告
    [no code][scrum meeting] Beta 12
    [no code][scrum meeting] Beta 11
    [no code][scrum meeting] Beta 10
    [no code][scrum meeting] Beta 9
    [no code][scrum meeting] Beta 8
    [no_code][Beta] 中期组内总结
  • 原文地址:https://www.cnblogs.com/shxnb666/p/11427258.html
Copyright © 2011-2022 走看看