[Section] NOI2016

Face questions

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

answer

#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\n",ans);
  return 0;
}

 

Guess you like

Origin www.cnblogs.com/shxnb666/p/11427258.html