Barn
P1937 [USACO10MAR] Barn Allocation G
题意抽象
给定
思路
我们可以发现,对于区间按照右端点排序,那么可以选择这个区间,那么肯定是最优的(这个证明可能类似于每个位置只能被覆盖一次的弱化版本,因为你选了这个,右端点最小,对于后面的影响已经尽可能的小了)。然后我们只需要一个线段树,支持查询某个区间内的最小值,然后如果不为
#include<cstdio>
#include<algorithm>
using namespace std;
#define Ed for(int i=h[x];~i;i=ne[i])
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=l;i>r;--i)
#define Le(i,l,r) for(int i=l;i<=r;++i)
#define Re(i,l,r) for(int i=l;i>=r;--i)
#define L(i,l) for(int i=0;i<l;++i)
#define E(i,l) for(int i=1;i<=l;++i)
#define W(t) while(t--)
#define Wh while
const int N=100010,M=4*N;
int l[M],r[M],v[M],f[M],a[N],n,m;
#define pushup v[p]=min(v[p<<1],v[p<<1|1])
void pushdown(int p){
int &ff=f[p];
if(!ff)return;
v[p<<1]-=ff,v[p<<1|1]-=ff;
f[p<<1]+=ff,f[p<<1|1]+=ff;
ff=0;
}
void build(int p,int L,int R){
l[p]=L,r[p]=R;
if(L==R){
v[p]=a[L];
return;
}
int mid=L+R>>1;
build(p<<1,L,mid);
build(p<<1|1,mid+1,R);
pushup;
}
struct segment{
int l,r;
bool operator<(segment&A){
return r<A.r;
}
}seg[N];
void update(int p,int L,int R){
if(L<=l[p]&&r[p]<=R){
--v[p],++f[p];
return;
}
pushdown(p);
int mid=l[p]+r[p]>>1;
if(L<=mid)update(p<<1,L,R);
if(R>mid)update(p<<1|1,L,R);
pushup;
}
int query(int p,int L,int R){
if(L<=l[p]&&r[p]<=R)return v[p];
pushdown(p);
int mid=l[p]+r[p]>>1,res=1e9;
if(L<=mid)res=query(p<<1,L,R);
if(R>mid)res=min(res,query(p<<1|1,L,R));
return res;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
scanf("%d%d",&n,&m);
E(i, n)scanf("%d",a+i);
build(1,1,n);
E(i, m){
int a,b;
scanf("%d%d",&a,&b);
seg[i]={a,b};
}
sort(seg+1,seg+1+m);
int ans=0;
E(i, m)
if(query(1,seg[i].l,seg[i].r)){
++ans;
update(1,seg[i].l,seg[i].r);
}
printf("%d",ans);
return 0;
}
本文作者:wscqwq
本文链接:https://www.cnblogs.com/wscqwq/p/17724329.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步