首页 > 其他分享 >做题记录整理数据结构/线段树 P1712 [NOI2016] 区间(2022/10/17)

做题记录整理数据结构/线段树 P1712 [NOI2016] 区间(2022/10/17)

时间:2022-10-19 15:14:16浏览次数:79  
标签:10 lan 17 rs int ll P1712 for1 mx

P1712 [NOI2016] 区间

由于现在做题比较杂,所以就不标号码了

感觉应该算是思维题?
刚开始没想到完全用线段树后来看了题解
如果想到线段树的话这题剩下的东西就可以很自然的想到了
贪心的把区间按区间长度排序
然后用尺取法
看看数据范围会发现需要离散化
好像也不是很好想
至少不算难打

#include<bits/stdc++.h>
#define for1(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
struct node{
    int l;
    int r;
    int mx;
    int lan;
}s[2000005*4];
struct node2{
	int l;
	int r;
	int val;
}a[5000005];
int n,m;
int ll[5000005],rr[500005];
#define ls q*2
#define rs q*2+1

bool cmp(node2 x,node2 y)
{
	return x.val<y.val;
}
void build(int q,int l,int r)
{
	s[q].l=l;
	s[q].r=r;
	if(l==r)
	{
		s[q].mx=0;
		return ;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	return ;
}

void chuan(int q)
{
	if(s[q].lan)
	{
		s[ls].lan+=s[q].lan;
		s[ls].mx+=s[q].lan;
		s[rs].lan+=s[q].lan;
		s[rs].mx+=s[q].lan;
		s[q].lan=0;
	}
	return ;
}

void xg(int q,int l,int r,int k)
{
	if(s[q].l>=l&&s[q].r<=r)
	{
		s[q].mx+=k;
		s[q].lan+=k;
		return ;
	}
	chuan(q);
	int mid=(s[q].l+s[q].r)>>1;
	if(l<=mid) xg(ls,l,r,k);
	if(r>mid) xg(rs,l,r,k);
	s[q].mx=max(s[ls].mx,s[rs].mx);
}
int main()
{
	scanf("%d%d",&n,&m);
	
	for1(i,1,n)
	{
		scanf("%d%d",&a[i].l,&a[i].r);
		a[i].val=a[i].r-a[i].l;
		ll[i]=a[i].l;
		ll[i+n]=a[i].r;
	}
	
	sort(ll+1,ll+2*n+1);
	int ji=unique(ll+1,ll+2*n+1)-ll-1;
	for1(i,1,n)
	a[i].l=(lower_bound(ll+1,ll+ji+1,a[i].l)-ll);
	for1(i,1,n)
	a[i].r=(lower_bound(ll+1,ll+ji+1,a[i].r)-ll);

	
	build(1,1,ji);
	sort(a+1,a+n+1,cmp);
	int jl=1;
	int jr=0;
	int ans=1e9;
    while(jl<=n)
    {

        while(jr<n&&s[1].mx<m)
        {
        	    
		    jr++;
			xg(1,a[jr].l,a[jr].r,1);
		}
        if(jr==n &&s[1].mx<m) break;
        ans=min(ans,a[jr].val-a[jl].val);  
		    	xg(1,a[jl].l,a[jl].r,-1);
		jl++;     
    }
    printf("%d\n",(ans==1e9)?-1:ans);
	return 0;
 } 

标签:10,lan,17,rs,int,ll,P1712,for1,mx
From: https://www.cnblogs.com/yyx525jia/p/16806295.html

相关文章

  • 驱动开发:Win10枚举完整SSDT地址表
    在前面的博文《驱动开发:Win10内核枚举SSDT表基址》中已经教大家如何寻找SSDT表基地址了,找到后我们可根据序号获取到指定SSDT函数的原始地址,而如果需要输出所有SSDT表信息,则......
  • 10.23尤大直播分享:vue生态进展和展望
    前言大家好,我是村长,欢迎关注我的公众号村长学前端。最近在与DevUI团队一起做直播,给大家分享VueDevUI开源组件库的建设,欢迎大家关注我们直播,多给项目star支持一下!今天参加了......
  • quicker设置win11右键打开win10旧版的菜单
    设置--辅助功能--高级鼠标触发--添加鼠标动作:鼠标动作:单击鼠标键(短按)鼠标按钮:右键白名单:选择打开的文件管理器操作类型:发送快捷键:按键组合:shift+F10保存之......
  • win10录音机内录故障排查思路
    驱动问题声音->录制界面如果没有立体声混音选项,说明没有安装声卡驱动,前往主板制造商的官网下载独占问题若已安装声卡驱动,立体声混音选项出现,问题依然没有解决。进行如下......
  • 烂笔头笔记:Windows 10下配置ssh免密钥访问需要注意的事项
    目录​​简介​​​​开启ssh-agent服务​​​​密钥文件访问权限问题​​​​关于多个密钥如何使用​​​​关于多个服务器如何使用​​​​测试配置是否正确​​简介从Win......
  • 李沐老师深度学习安装环境-2022.10.19
    先把anaconda安装好打开PowershellPrompt首先是创建虚拟环境conda create-n(环境名字)python=(python版本号)接下来......
  • 10-git配置比较工具
    git配置比较工具1.修改.gitconfig文件[diff]tool=bc4[difftool]prompt=false[difftool"bc4"]cmd="\"C:/Users/xxx/AppData/Local/BeyondCompare4/BComp.ex......
  • imagemagick: 对损坏的gif图做拆分(ImageMagick 6.9.10)
    一,对正常的gif图拆分:[lhdop@blogimg2]$identifymaoshu.gifmaoshu.gif[0]GIF400x224400x224+0+08-bitsRGB256c0.000u0:00.001maoshu.gif[1]GIF400x22440......
  • 10.19
    Markdown学习标题三级标题四级标题字体Hello,World!Hello,World!Hello,World!Hello,World!引用选择狂神说Java,走向人生巅峰分割线图片![截图](C:\Users\Fhy0303\P......
  • 【2022.10.19】Linux(2)
    学习内容1.虚拟机关键配置名词解释2.远程连接工具3.xshell基本使用4.linux命令准则5.系统运行命令6.常用快捷方式7.文件命令操作8.快照功能9.文件编辑命令10.......