题目描述

Farmer John recently opened up a new barn and is now accepting stall allocation requests from the cows since some of the stalls have a better view of the pastures.

The barn comprises N (1 <= N <= 100,000) stalls conveniently numbered 1..N; stall i has capacity C_i cows (1 <= C_i <= 100,000). Cow i may request a contiguous interval of stalls (A_i, B_i) in which to roam (1 <= A_i <= N; A_i <= B_i <= N), i.e., the cow would like to wander among all the stalls in the range A_i..B_i (and the stalls must always have the capacity for her to wander).

Given M (1 <= M <= 100,000) stall requests, determine the maximum number of them that can be satisfied without exceeding stall

capacities.

农夫约翰最近开了一个新的牲口棚屋,并且现在接受来自奶牛的分配畜栏请求因为其中的一些畜栏有更好风景。

畜栏包括N个畜栏(1 ≤ N ≤ 100,000),方便起见,我们把它们编号为1..N,畜栏i能容纳Ci只牛(1 ≤ Ci ≤ 100,000),第i只牛需要连续编号畜栏(从Ai到Bi)来漫步其中,

(1 ≤ Ai ≤ N; Ai ≤ Bi ≤ N),换言之,这只牛想要在编号范围为Ai..Bi的畜栏漫步(所有它想要畜栏必须实施为它空出位置来供它散步)

给出M个畜栏分配请求(1 ≤ M ≤ 100,000),回答最多能满足多少只牛的要求(不增加另外畜栏)

考虑以下例子:

畜栏号:    1   2   3   4   5
+---+---+---+---+---+
容纳空间: | 1 | 3 | 2 | 1 | 3 |
+---+---+---+---+---+
Cow 1 XXXXXXXXXXX (1, 3)
Cow 2 XXXXXXXXXXXXXXX (2, 5)
Cow 3 XXXXXXX (2, 3)
Cow 4 XXXXXXX (4, 5)

约翰显然不能满足所有的牛,因为畜栏3,4请求太多了

经过试验,我们发现,我们能满足牛1,3,4需要,所以这组数据答案为3

输入输出格式

输入格式:

第一行包括两个以空格隔开的正整数:N,M

第二行到第N+1行:第i+1行包括一个整数:Ci

第N+2到第N+M+1行:第i+N+1 包括两个整数Ai、Bi

输出格式:

仅一行:能满足的最大需要

输入输出样例

输入样例#1:

5 4
1
3
2
1
3
1 3
2 5
2 3
4 5
输出样例#1:

3

说明

Source: USACO 2010 March Gold

Translator: @chrome01

分析:这道题其实和借教室那道题差不多,可以考虑用线段树来维护,我们考虑一个区间是只用考虑它的最小值的,如果最小值都能满足条件,那么肯定是能够满足条件的,那么怎么样才能让题目给定的区间不重复呢?考虑贪心,我们先按照右端点从小到大排序,再按照左端点从大到小排序,这样可以保证区间之间尽量不要互相影响,最后先查询最小值,再修改就好了.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath> using namespace std; const int inf = 0x7ffffff; int n,m,minn[],flag[],ans;
bool flag2 = false; struct node
{
int a,b;
}e[]; bool cmp(node x,node y)
{
if (x.b != y.b)
return x.b < y.b;
else
return x.a > y.a;
} void pushup(int o)
{
minn[o] = min(minn[o * ],minn[o * + ]);
} void pushdown(int o)
{
if (flag[o])
{
flag[o * ] += flag[o];
flag[o * + ] += flag[o];
minn[o * ] -= flag[o];
minn[o * + ] -= flag[o];
}
flag[o] = ;
} void build(int l,int r,int o)
{
if (l == r)
{
scanf("%d",&minn[o]);
return;
}
int mid = (l + r) >> ;
build(l,mid,o * );
build(mid + ,r,o * + );
pushup(o);
} void update(int l,int r,int o,int x,int y)
{
if (x <= l && r <= y)
{
flag[o]++;
minn[o]--;
return;
}
pushdown(o);
int mid = (l + r) >> ;
if (x <= mid)
update(l,mid,o * ,x,y);
if (y > mid)
update(mid + ,r,o * + ,x,y);
pushup(o);
} int query(int l,int r,int o,int x,int y)
{
if (x <= l && r <= y)
return minn[o];
pushdown(o);
int mid = (l + r) >> ,res = inf;
if (x <= mid)
res = min(query(l,mid,o * ,x,y),res);
if (y > mid)
res = min(query(mid + ,r,o * + ,x,y),res);
return res;
} int main()
{
scanf("%d%d",&n,&m);
build(,n,);
for (int i = ; i <= m; i++)
scanf("%d%d",&e[i].a,&e[i].b);
sort(e + ,e + + m,cmp);
for (int i = ; i <= m; i++)
{
if (query(,n,,e[i].a,e[i].b) <= )
continue;
update(,n,,e[i].a,e[i].b);
ans++;
}
printf("%d\n",ans); return ;
}

洛谷P1937 [USACO10MAR]仓配置Barn Allocation的更多相关文章

  1. 洛谷 1937 [USACO10MAR]仓配置Barn Allocation

    [题解] 贪心. 把区间按照右端点从小到大排序,右端点相同的按照长度从小到大排序,然后按顺序考虑,能放就放下去. 维护能不能放下去用线段树即可. #include<cstdio> #inc ...

  2. LUOGU P1937 [USACO10MAR]仓配置Barn Allocation

    传送门 解题思路 扫了一眼觉得是贪心+线段树,结果贪心的时候刚开始按区间长度排的序..这还有82分,后来叉了自己,换成按右端点排序过了. 代码 #include<iostream> #in ...

  3. AC日记——[USACO10MAR]仓配置Barn Allocation 洛谷 P1937

    [USACO10MAR]仓配置Barn Allocation 思路: 贪心+线段树维护: 代码: #include <bits/stdc++.h> using namespace std; ...

  4. 洛谷 P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat…(树规)

    题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...

  5. 洛谷 P2986 [USACO10MAR]Great Cow Gat…(树形dp+容斥原理)

    P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat… 题目描述 Bessie is planning the annual Great Cow Gathering for c ...

  6. 洛谷 P2986 [USACO10MAR]伟大的奶牛聚集(树形动规)

    题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...

  7. 洛谷P3066 [USACO12DEC]逃跑的Barn (线段树合并)

    题目描述It's milking time at Farmer John's farm, but the cows have all run away! Farmer John needs to ro ...

  8. 洛谷P3066 [USACO12DEC] 逃跑的Barn [左偏树]

    题目传送门 逃跑的Barn 题目描述 It's milking time at Farmer John's farm, but the cows have all run away! Farmer J ...

  9. Java实现 洛谷 P6183 [USACO10MAR]The Rock Game S(DFS)

    P6183 [USACO10MAR]The Rock Game S 输入输出样例 输入 3 输出 OOO OXO OXX OOX XOX XXX XXO XOO OOO PS: 因为每一位只有两种可能 ...

随机推荐

  1. Atom 插件 Sync Settings 备份与恢复

    当使用 Atom IDEA.随着使用的越来越多,安装的插件也越来越多,一旦电脑重装后需要复原开发环境,这将是一件比较头疼的事.「Sync Settings」插件可以帮助我们解决这个问题. 操作流程 安 ...

  2. 239. [LeetCode ]Sliding Window Maximum

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

  3. mac react-native从零开始android真机测试

    1. 安装android相关jdk,(https://blog.csdn.net/vvv_110/article/details/72897142) 2. 手机和mac使用usb连接, 手机开发者设置 ...

  4. node项目设置环境变量

    在UNIX系统中: $ NODE_ENV=production node app 在Windows中: $ set NODE_ENV=production $ node app 这些环境变量会出现在程 ...

  5. KETTLE监控

    kettle单实例环境下自身没有监控工具,但在集群下自带了监控工具. 一.集群自带的监控 kettle自带的集群监控工具可以监控转换的执行情况. 配置好集群后,打开浏览器:输入http://local ...

  6. java-HttpGetPost-图片字节流上传

    在java程序开发中经常用到与服务端的交互工作,主要的就是传递相应的参数请求从而获取到对应的结果加以处理 可以使用Get请求与Post请求,注意!这里的Get请求不是通过浏览器界面而是在程序代码中设置 ...

  7. ES6的新特性(10)——Class 的基本语法

    Class 的基本语法 简介 JavaScript 语言中,生成实例对象的传统方法是通过构造函数.下面是一个例子. function Point(x, y) { this.x = x; this.y ...

  8. Python--matplotlib 绘图可视化练手--折线图/条形图

    最近学习matplotlib绘图可视化,感觉知识点比较多,边学习边记录. 对于数据可视化,个人建议Jupyter Notebook. 1.首先导包,设置环境 import pandas as pd i ...

  9. preg_replace 以及弃用的e

    preg_replace (PHP 4, PHP 5) preg_replace — 执行一个正则表达式的搜索和替换 说明¶ mixed preg_replace ( mixed $pattern , ...

  10. Flip the Bits(思维)

    You are given a positive integer n. Your task is to build a number m by flipping the minimum number ...