首页 > 代码库 > AC日记——[USACO10MAR]仓配置Barn Allocation 洛谷 P1937
AC日记——[USACO10MAR]仓配置Barn Allocation 洛谷 P1937
[USACO10MAR]仓配置Barn Allocation
思路:
贪心+线段树维护;
代码:
#include <bits/stdc++.h>using namespace std;#define maxn 100005#define INF 0x3f3f3f3f#define maxtree maxn<<2struct QueryType{ int l,r; bool operator<(const QueryType pos)const { if(pos.r==r) return l<pos.l; return r<pos.r; }};struct QueryType qu[maxn];int n,m,ai[maxn],L[maxtree],R[maxtree],mid[maxtree],val[maxtree],tag[maxtree];inline void in(int &now){ char Cget=getchar();now=0; while(Cget>‘9‘||Cget<‘0‘)Cget=getchar(); while(Cget>=‘0‘&&Cget<=‘9‘) { now=now*10+Cget-‘0‘; Cget=getchar(); }}void build(int now,int l,int r){ L[now]=l,R[now]=r; if(l==r) { val[now]=ai[l]; return ; } mid[now]=l+r>>1; build(now<<1,l,mid[now]); build(now<<1|1,mid[now]+1,r); val[now]=min(val[now<<1],val[now<<1|1]);}void pushdown(int now){ val[now<<1]+=tag[now],tag[now<<1]+=tag[now]; val[now<<1|1]+=tag[now],tag[now<<1|1]+=tag[now]; tag[now]=0;}void updata(int now,int l,int r){ if(L[now]>=l&&R[now]<=r) { val[now]--,tag[now]--; return; } if(tag[now]!=0) pushdown(now); if(l<=mid[now]) updata(now<<1,l,r); if(r>mid[now]) updata(now<<1|1,l,r); val[now]=min(val[now<<1],val[now<<1|1]);}int query(int now,int l,int r){ if(L[now]>=l&&R[now]<=r) return val[now]; if(tag[now]!=0) pushdown(now);int res=INF; if(l<=mid[now]) res=min(res,query(now<<1,l,r)); if(r>mid[now]) res=min(res,query(now<<1|1,l,r)); return res;}int main(){ in(n),in(m); for(int i=1;i<=n;i++) in(ai[i]); for(int i=1;i<=m;i++) in(qu[i].l),in(qu[i].r); sort(qu+1,qu+m+1),build(1,1,n);int ans=0; for(int i=1;i<=m;i++) { if(query(1,qu[i].l,qu[i].r)) ans++,updata(1,qu[i].l,qu[i].r); } cout<<ans; return 0;}
AC日记——[USACO10MAR]仓配置Barn Allocation 洛谷 P1937
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。