C33 线段树+贪心 P1937 [USACO10MAR] Barn Allocation G

视频链接:219 线段树+贪心 [USACO] Barn Allocation G_哔哩哔哩_bilibili

 

Luogu P1937 [USACO10MAR] Barn Allocation G

复制代码
// 贪心+线段树 O(nlogn)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

#define ls u<<1
#define rs u<<1|1
const int N=100005;
int n,m,c[N],ans;
struct line{
    int l,r;
    bool operator<(line &b){
      return r<b.r;
    }
}s[N]; //区间
struct tree{
  int l,r,min,lazy;
}t[N*4]; //线段树

void pushup(int u){ //上传
  t[u].min=min(t[ls].min,t[rs].min);
}
void pushdown(int u){ //下传
  if(t[u].lazy){
    t[ls].min-=t[u].lazy;
    t[rs].min-=t[u].lazy;
    t[ls].lazy+=t[u].lazy;
    t[rs].lazy+=t[u].lazy;
    t[u].lazy=0; 
  }
}
void build(int u,int l,int r){ //建树
  t[u]={l,r,c[l]};
  if(l==r) return;
  int mid=l+r>>1;
  build(ls,l,mid);
  build(rs,mid+1,r);
  pushup(u);
}
void change(int u,int l,int r){ //区修
  if(t[u].l>r||t[u].r<l) return;
  if(t[u].l>=l&&t[u].r<=r){
    t[u].min--; t[u].lazy++;
    return;
  }
  pushdown(u);
  change(ls,l,r);
  change(rs,l,r);
  pushup(u);
}
int query(int u,int l,int r){ //区查
  if(t[u].l>r||t[u].r<l) return 2e5;
  if(t[u].l>=l&&t[u].r<=r) return t[u].min;
  pushdown(u);
  return min(query(ls,l,r),query(rs,l,r));
}
int main(){
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;i++) scanf("%d",&c[i]);
  for(int i=1;i<=m;i++)
    scanf("%d%d",&s[i].l,&s[i].r);
  sort(s+1,s+m+1); //按右端排序
  
  build(1,1,n);
  for(int i=1;i<=m;i++){
    int l=s[i].l,r=s[i].r;
    if(!query(1,l,r)) continue;
    change(1,l,r); 
    ans++;
  }    
  printf("%d",ans);
  return 0;
}
复制代码

 

posted @   董晓  阅读(213)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示