传送门

把线段都读进来然后排序,先按右端点为第一关键字从小到大排序,后按左端点为第二关键字从小到大排序。

注意不能先按左端点后按右端点排序,否则会出现大包小的情况,如下:

——————

  ———

    —

然后直接线段树搞就行,先求区间最小值,如果大于零就更新统一减1。

——代码

 #include <cstdio>
#include <iostream>
#include <algorithm>
#define root 1, 1, n
#define ls now << 1, l, mid
#define rs now << 1 | 1, mid + 1, r const int INF = ~( << ), MAXN = ;
int n, m, ans;
int minn[MAXN << ], add[MAXN << ]; struct node
{
int a, b;
}p[MAXN]; inline void swap(int &x, int &y)
{
x ^= y ^= x ^= y;
} inline void push_up(int now)
{
minn[now] = std::min(minn[now << ], minn[now << | ]);
} inline void push_down(int now, int len)
{
if(!add[now]) return;
add[now << ] += add[now];
add[now << | ] += add[now];
minn[now << ] += add[now];
minn[now << | ] += add[now];
add[now] = ;
} inline void build(int now, int l, int r)
{
if(l == r)
{
scanf("%d", &minn[now]);
return;
}
int mid = (l + r) >> ;
build(ls);
build(rs);
push_up(now);
} inline bool cmp(node x, node y)
{
return x.b == y.b ? x.a < y.a : x.b < y.b;
} inline int query(int x, int y, int now, int l, int r)
{
if(x <= l && r <= y) return minn[now];
if(l > y || r < x) return INF;
push_down(now, r - l + );
int mid = (l + r) >> ;
return std::min(query(x, y, ls), query(x, y, rs));
} inline void update(int x, int y, int now, int l, int r)
{
if(x <= l && r <= y)
{
minn[now]--;
add[now]--;
return;
}
if(l > y || r < x) return;
push_down(now, r - l + );
int mid = (l + r) >> ;
update(x, y, ls);
update(x, y, rs);
push_up(now);
} int main()
{
int i, j;
scanf("%d %d", &n, &m);
build(root);
for(i = ; i <= m; i++)
{
scanf("%d %d", &p[i].a, &p[i].b);
if(p[i].a > p[i].b) swap(p[i].a, p[i].b);
}
std::sort(p + , p + m + , cmp);
for(i = ; i <= m; i++)
if(query(p[i].a, p[i].b, root) > )
ans++, update(p[i].a, p[i].b, root);
printf("%d", ans);
return ;
}

[luoguP3606] [USACO17JAN]Building a Tall Barn建谷仓(贪心 + 线段树)的更多相关文章

  1. [USACO17JAN]Building a Tall Barn建谷仓

    题目描述 Farmer John is building a brand new, NNN -story barn, with the help of his KKK cows ( 1≤N≤K≤101 ...

  2. 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)

    To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...

  3. 【洛谷】【线段树】P1047 校门外的树

    [题目描述:] 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L ...

  4. 洛谷 P5280 - [ZJOI2019]线段树(线段树+dp,神仙题)

    题面传送门 神仙 ZJOI,不会做啊不会做/kk Sooke:"这八成是考场上最可做的题",由此可见 ZJOI 之毒瘤. 首先有一个非常显然的转化,就是题目中的"将线段树 ...

  5. 【BZOJ】1696: [Usaco2007 Feb]Building A New Barn新牛舍(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1696 原题要求min(sum{|x-xi|+|y-yi|}),且一定要看题:“没有两头牛的吃草位置是 ...

  6. 洛谷P3374(线段树)(询问区间和,支持单点修改)

    洛谷P3374 //询问区间和,支持单点修改 #include <cstdio> using namespace std; ; struct treetype { int l,r,sum; ...

  7. 洛谷P5280 [ZJOI2019]线段树 [线段树,DP]

    传送门 无限Orz \(\color{black}S\color{red}{ooke}\)-- 思路 显然我们不能按照题意来每次复制一遍,而多半是在一棵线段树上瞎搞. 然后我们可以从\(modify\ ...

  8. BZOJ1828[USACO 2010 Mar Gold 2.Barn Allocation]——贪心+线段树

    题目描述 输入 第1行:两个用空格隔开的整数:N和M * 第2行到N+1行:第i+1行表示一个整数C_i * 第N+2到N+M+1行: 第i+N+1行表示2个整数 A_i和B_i 输出 * 第一行: ...

  9. 洛谷.T21778.过年(线段树 扫描线)

    题目链接或者这吧.. 被数据坑了 /* 操作按左端点排个序 依次进行即可 不是很懂 为什么不写Build 而在Add时改mp[rt]=p 会WA(too short on line 251..) 找到 ...

随机推荐

  1. python中的sort和sorted

    共同点 都有三个参数, cmp用户自定义(指定函数),每个元素都会调用,效率没key高 key带一个参数的函数,用来为每个元素提取比较值 reverse=True    翻转 sort sort作用的 ...

  2. Can't locate ExtUtils/MakeMaker.pm in @INC

    Can't locate ExtUtils/MakeMaker.pm in @INC 解决办法:yum install perl-devel

  3. execl, execlp, execle, execv, execvp - 执行某个文件

    总览 (SYNOPSIS) #include <unistd.h> extern char **environ; int execl( const char *path, const ch ...

  4. Vector(同步)和ArrayList(异步)异同

    //1 同步 异步 //未响应 = 假死 占用内存过多 内存无法进行处理 //请求的方式 :同步 异步 //网页的展现过程中(同步):1. css文件的下载 2.js文件的下载 3.下载你当前的htm ...

  5. qobject_cast

    void QLadderDiagramItem::GetMainForm(DoType sourceType){ for each (QWidget *w in qApp->topLevelWi ...

  6. Hibernate的核心配置

    Hibernate的设计思路 Hibernate是一种全自动化管理持久化对象的ORM框架,既提供了完全面向对象的封装完整的对象持久化接口(屏蔽db层的差异化,提升代码可移植性),也提供了操作HQL和S ...

  7. 10. InnoDB表空间加密

    10. InnoDB表空间加密 InnoDB支持存储在单独表空间中的表的数据加密 .此功能为物理表空间数据文件提供静态加密. 详细信息见官方文档

  8. memcached 经典问题或现象

    缓存雪崩现象及真实案例 缓存雪崩一般是由某个缓存节点失效,导致其他节点的缓存命中率下降, 缓存中缺失的数据 去数据库查询.短时间内,造成数据库服务器崩溃. 重启 DB,短期又被压跨,但缓存数据也多一些 ...

  9. 第一次:从今开始玩Linux,Ubuntu16.04

    首先声明,我的文章不配图,就靠文字描述,然后自己体会,摸着石头体验吧! 从今天开始玩Linux,Ubuntu16.04据说是比较稳定的,界面友好,类似与Windows界面,也有Linux的命令终端,用 ...

  10. php 快速导出大量CSV文件

    原文链接 https://segmentfault.com/a/1190000005366832 /** * 导出excel(csv) * @data 导出数据 * @headlist 第一行,列名 ...