博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1828: [Usaco2010 Mar]balloc 农场分配
阅读量:4967 次
发布时间:2019-06-12

本文共 1477 字,大约阅读时间需要 4 分钟。

Description

bzoj1828.jpg

Input

第1行:两个用空格隔开的整数:N和M * 第2行到N+1行:第i+1行表示一个整数C_i * 第N+2到N+M+1行: 第i+N+1行表示2个整数 A_i和B_i

Output

* 第一行: 一个整数表示最多能够被满足的要求数

题解:

将请求按右端点排序,然后依次添加,用线段树判断是否能添加,不能的放弃。统计个数即可。

代码:

#include
#include
#include
//by zrt//problem:using namespace std;int minn[100005*4];int mark[100005*4];int c[100005];void pd(int o){ if(mark[o]){ minn[o<<1]-=mark[o]; minn[o<<1|1]-=mark[o]; mark[o<<1]+=mark[o]; mark[o<<1|1]+=mark[o]; mark[o]=0; }}void insert(int o,int l,int r,int L,int R){ if(l==L&&r==R){ mark[o]+=1; minn[o]-=1; return; }else{ pd(o); int m=(L+R)>>1; if(r<=m) insert(o<<1,l,r,L,m); else if(l>m) insert(o<<1|1,l,r,m+1,R); else insert(o<<1,l,m,L,m),insert(o<<1|1,m+1,r,m+1,R); minn[o]=min(minn[o<<1],minn[o<<1|1]); }}void build(int o,int l,int r){ if(l==r){ minn[o]=c[l]; }else{ int m=(l+r)>>1; build(o<<1,l,m); build(o<<1|1,m+1,r); minn[o]=min(minn[o<<1],minn[o<<1|1]); }}bool ok;void ask(int o,int l,int r,int L,int R){ if(l==L&&r==R) ok&=(minn[o]>0); else{ pd(o); int m=(L+R)>>1; if(r<=m) ask(o<<1,l,r,L,m); else if(l>m) ask(o<<1|1,l,r,m+1,R); else ask(o<<1,l,m,L,m),ask(o<<1|1,m+1,r,m+1,R); }}struct node{ int a,b;}q[100005];bool cmp(node a,node b){ return a.b

转载于:https://www.cnblogs.com/zrts/p/bzoj1828.html

你可能感兴趣的文章
牛客(59)按之字形顺序打印二叉树
查看>>
JavaScript 图表库 xCharts
查看>>
Android项目的目录结构
查看>>
C++中“引用”的底层实现
查看>>
Spring Cloud与微服务构建:微服务简介
查看>>
Babel 是干什么的
查看>>
20180418小测
查看>>
数字三角形
查看>>
前端笔记-基础笔记
查看>>
【LeetCode & 剑指offer刷题】查找与排序题6:33. Search in Rotated Sorted Array(系列)
查看>>
GNU/Linux超级本ZaReason Ultralap 440体验
查看>>
将github上托管的代码 在我的域名下运行
查看>>
【Manthan, Codefest 18 (rated, Div. 1 + Div. 2) C】Equalize
查看>>
【codeforces 767A】Snacktower
查看>>
【MemSQL Start[c]UP 3.0 - Round 1 C】 Pie Rules
查看>>
Ognl中“%”、“#”、“$”详解
查看>>
我对应用软件——美团的看法
查看>>
执行了的程序,才是你的程序.
查看>>
struts2.x + Tiles2.x读取多个xml 配置文件
查看>>
表单校验之datatype
查看>>