zoukankan      html  css  js  c++  java
  • 【Luogu3602】Koishi Loves Segments(贪心)

    【Luogu3602】Koishi Loves Segments(贪心)

    题面

    洛谷

    题解

    离散区间之后把所有的线段挂在左端点上,从左往右扫一遍。
    对于当前点的限制如果不满足显然会删掉右端点最靠右的那根,拿一个堆维护一下就好了。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<vector>
    using namespace std;
    #define MAX 400400
    inline int read()
    {
    	int x=0;bool t=false;char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')t=true,ch=getchar();
    	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    	return t?-x:x;
    }
    int n,m,ans,S[MAX<<1],tot,L[MAX],R[MAX],P[MAX],X[MAX];
    int Bound(int x){return lower_bound(&S[1],&S[tot+1],x)-S;}
    int c[MAX<<1],lim[MAX<<1];
    vector<int> lk[MAX<<1];
    struct Heap
    {
    	int H[MAX],top;
    	void push(int x){H[++top]=x;push_heap(&H[1],&H[top+1]);}
    	void pop(){pop_heap(&H[1],&H[top--]);}
    	int Top(){return H[1];}
    }Q;
    int main()
    {
    	n=read();m=read();
    	for(int i=1;i<=n;++i)L[i]=read(),R[i]=read(),S[++tot]=L[i],S[++tot]=R[i];
    	for(int i=1;i<=m;++i)P[i]=read(),X[i]=read(),S[++tot]=P[i];
    	sort(&S[1],&S[tot+1]);tot=unique(&S[1],&S[tot+1])-S-1;
    	for(int i=1;i<=n;++i)lk[Bound(L[i])].push_back(Bound(R[i]));
    	for(int i=1;i<=tot;++i)lim[i]=1e9;
    	for(int i=1;i<=m;++i)P[i]=Bound(P[i]),lim[P[i]]=min(lim[P[i]],X[i]);
    	for(int i=1,t=0;i<=tot;++i)
    	{
    		t+=c[i];
    		for(int r:lk[i])c[r+1]-=1,t+=1,Q.push(r),++ans;
    		while(t>lim[i])c[Q.Top()+1]+=1,t-=1,Q.pop(),--ans;
    	}
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    Mybatis入门
    java开发七大原则
    常用的一些实用类
    sql语句大全
    jsp中9个隐含对象
    解决POST和GET方式的中文乱码问题
    Servlet跳转页面的重定向和转发
    通用增删改查的方式
    IDEA 部署spring Cloud
    Oracle基础语法
  • 原文地址:https://www.cnblogs.com/cjyyb/p/10571345.html
Copyright © 2011-2022 走看看