ICode9

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

洛谷$P1712\ [NOI2016]$区间 线段树

2019-09-16 12:02:03  阅读:255  来源: 互联网

标签:洛谷 int mid len P1712 NOI2016 ans include QwQ


正解:线段树

解题报告:

传送门$QwQ$

$umm$很久以前做的了来补个题解$QwQ$

考虑给每个区间按权值($r-l$从大往小排序,依次加入,然后考虑如果有一个位置被覆盖次数等于$m$了就可以把权值最大的那个删去直到被覆盖次数小于$m$,顺便更新答案

然后就做完辣!$QwQ$

放下代码趴,然后因为是去年的代码了所以码风可能有点丑,,,懒得改了$QwQ$

$over$

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n,m,b[2000009],c[2000009],d[1000009],mx[4000009],add[4000009],l=1,r=0,ans=0x7fffffff,num;
struct seg
{
    int x,y,len;
    inline bool operator <(const seg& rhs) const
    {
        return len>rhs.len;
    }
}a[500009];
inline int read()
{
    char ch=getchar();int x=0;
    while(ch>'9' || ch<'0')ch=getchar();
    while(ch<='9' && ch>='0')x=(x<<3)+(x<<1)+(ch^'0'),ch=getchar();
    return x;
}
inline void ins(int l,int r,int x,int y,int k,int v)
{
    if (x<=l&&y>=r)
    {
        add[k]+=v;
        mx[k]+=v;
        return;
    }
    int mid=l+r>>1;
    if (x<=mid) ins(l,mid,x,y,k<<1,v);
    if (y>mid) ins(mid+1,r,x,y,k<<1|1,v);
    mx[k]=max(mx[k<<1],mx[k<<1|1]);
    mx[k]+=add[k];
}
int low(int x)
{
    int l=1,r=num,mid;
    while (l<r)
    {
        mid=(l+r)>>1;
        if (b[mid]>=x) r=mid;
        else l=mid+1;
    }
    return l;
}
int main()
{
    n=read(),m=read();
    num=0;
    for (int i=1;i<=n;i++)
    {
        a[i].x=read();
        a[i].y=read();
        a[i].len=a[i].y-a[i].x;
        b[++num]=a[i].x;
        b[++num]=a[i].y;
    }
    sort(a+1,a+n+1);
    sort(b+1,b+num+1);
    for (int i=1;i<=n;i++) a[i].x=low(a[i].x),a[i].y=low(a[i].y);
    for (int r=1;r<=n;r++)
    {
        ins(1,num,a[r].x,a[r].y,1,1);
        while (mx[1]>=m)
        {
            ans=min(ans,a[l].len-a[r].len);
            ins(1,num,a[l].x,a[l].y,1,-1);
            l++;
        }
    }
    if (ans!=0x7fffffff) printf("%d\n",ans); 
    else printf("-1");
    return 0;
}
View Code

标签:洛谷,int,mid,len,P1712,NOI2016,ans,include,QwQ
来源: https://www.cnblogs.com/lqsukida/p/11526557.html

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

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

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

ICode9版权所有