首页 > 其他分享 >Barn

Barn

时间:2023-09-23 14:11:43浏览次数:36  
标签:int res Lmid 区间 Barn define

P1937 [USACO10MAR] Barn Allocation G

题意抽象

给定 \(m\) 个区间,\(n\) 个位置,每个位置有一个最大被覆盖次数。在每个位置的被覆盖次数都符合要求的情况下求最多能选择的区间个数。

思路

我们可以发现,对于区间按照右端点排序,那么可以选择这个区间,那么肯定是最优的(这个证明可能类似于每个位置只能被覆盖一次的弱化版本,因为你选了这个,右端点最小,对于后面的影响已经尽可能的小了)。然后我们只需要一个线段树,支持查询某个区间内的最小值,然后如果不为 \(0\) 就给这个区间每个数减去 \(1\),这是一个经典的操作。

#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;
}

标签:int,res,Lmid,区间,Barn,define
From: https://www.cnblogs.com/wscqwq/p/17724329.html

相关文章

  • 洛谷_[P4084]Barn Painting G题解
    题目链接这题我们可以定义一个二维的dp数组,在dp[i][j]中:i表示对于节点i,j有1,2,3三种状态,表示当点i选择被染成颜色j时,以i为根的这颗子树有多少种染色方法。那么根据乘法原理,节点i的方案数肯定等于i的每个儿子的方案数量之积。这道题整个挺简单的,剩下细节......
  • TZOJ3326--Barn Repair(优先队列,贪心)
    题目简述: 某天刮了一阵大风,把牛棚的门吹飞了,总共有s个牛棚,幸运的是并不是每个牛棚都有牛。现在你可以购买m块木板,商店里有各种型号的木板,木板长度为多少就需要多少金钱。木板用来给牛棚装上门。要求把所有有牛的牛棚都装上门,并且花的金钱最少。给了一正整数C,接下来C行每行一......
  • P1937 [USACO10MAR]Barn Allocation G
    BarnAllocationG题目描述农夫约翰最近开了一个新的牲口棚屋,并且现在接受来自奶牛的分配畜栏请求因为其中的一些畜栏有更好风景。畜栏包括N个畜栏(1≤N≤100,000),方便起见,我们把它们编号为1..N,畜栏i能容纳Ci只牛(1≤Ci≤100,000),第i只牛需要连续编号畜栏(从Ai到Bi)来漫......
  • P4084 Barn Painting G
    \(P4084\)\(Barn\)\(Painting\)\(G\)一、题目描述给定一颗\(N\)个节点组成的树,\(3\)种颜色,其中\(K\)个节点已染色,要求任意两相邻节点颜色不同,求合法染色方案数。二、......
  • 用snort+barnyard2+base 搭建入侵检测系统IDS
    前言吐槽:最近给老板干活编写攻防教材,恰好我负责校对的这部分出了问题……原本师兄直接拷贝的那篇博客是15年的……环境用的ubuntu12,其中的snort-mysql早被drop掉了,14......
  • POJ 3269 Building A New Barn
    BuildingANewBarnTimeLimit: 2000MS MemoryLimit: 65536KTotalSubmissions: 1886 Accepted: 609DescriptionAfterscrimpingandsavingforyears,Farmer......
  • FreeBSD环境中源码部署Snort+Barnyard2+MySQL+BASE
        在2019年发布的文章《手动打造Snort+barnyard2+BASE可视化报警平台》,目前已有20K+的浏览量,帮助了很多想深入了解Snort而又无法独立安装系统的同学遇到的各种困惑......
  • P4084 [USACO17DEC]Barn Painting G
    #include<bits/stdc++.h>usingnamespacestd;constlonglongmod=1e9+7;classDP_on_tree{public: #definelllonglong lln,k; llfree[100001]; llf......