zoukankan      html  css  js  c++  java
  • [BZOJ4653][NOI2016]区间

    BZOJ
    Luogu

    sol

    全国赛送分题?
    尺取+线段树
    离散。区间按权值排序。然后枚举选取的左起点,two points扫过去,当整棵线段树上的最大值等于m的时候停止(表示找到了),然后更新答案。
    线段树只有区间加和全局最大值,所以可以写标记永久化(这种东西写起来码量立刻少好多真的)

    code

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int N = 500005;
    int gi()
    {
    	int x=0,w=1;char ch=getchar();
    	while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    	if (ch=='-') w=0,ch=getchar();
    	while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    	return w?x:-x;
    }
    struct interval{
    	int l,r,val;
    	bool operator < (const interval &waiwaib) const
    		{return val<waiwaib.val;}
    }a[N];
    int tag[N<<3],mx[N<<3];
    int n,m,o[N<<1],tot,ans=1e9;
    void modify(int x,int l,int r,int ql,int qr,int v)
    {
    	if (l>=ql&&r<=qr)
    	{
    		tag[x]+=v;mx[x]+=v;
    		return;
    	}
    	int mid=l+r>>1;
    	if (ql<=mid) modify(x<<1,l,mid,ql,qr,v);
    	if (qr>mid) modify(x<<1|1,mid+1,r,ql,qr,v);
    	mx[x]=max(mx[x<<1],mx[x<<1|1])+tag[x];
    }
    int main()
    {
    	n=gi();m=gi();
    	for (int i=1;i<=n;i++)
    	{
    		a[i].l=gi();a[i].r=gi();
    		a[i].val=a[i].r-a[i].l;
    		o[++tot]=a[i].l;o[++tot]=a[i].r;
    	}
    	sort(a+1,a+n+1);
    	sort(o+1,o+tot+1);tot=unique(o+1,o+tot+1)-o-1;
    	for (int i=1;i<=n;i++)
    	{
    		a[i].l=lower_bound(o+1,o+tot+1,a[i].l)-o;
    		a[i].r=lower_bound(o+1,o+tot+1,a[i].r)-o;
    	}
    	for (int i=1,j=0;i<=n;modify(1,1,tot,a[i].l,a[i].r,-1),i++)
    	{
    		while (j<n&&mx[1]<m) j++,modify(1,1,tot,a[j].l,a[j].r,1);
    		if (mx[1]<m) break;
    		ans=min(ans,a[j].val-a[i].val);
    	}
    	printf("%d
    ",ans==1e9?-1:ans);
    	return 0;
    }
    
  • 相关阅读:
    第十一周作业
    第十周作业
    第九周作业
    第六周&java实验报告四
    第五周课程总结&试验报告(三)
    第四周课程总结&试验报告(二)
    第二周学习总结
    第三周课程总结&实验报告一
    2019年春第四次课程设计报告
    2019年春第三次课程设计实验报告
  • 原文地址:https://www.cnblogs.com/zhoushuyu/p/8306133.html
Copyright © 2011-2022 走看看