[luoguP3606] [USACO17JAN]Building a Tall Barn建谷仓(贪心 + 线段树)
把线段都读进来然后排序,先按右端点为第一关键字从小到大排序,后按左端点为第二关键字从小到大排序。
注意不能先按左端点后按右端点排序,否则会出现大包小的情况,如下:
——————
———
—
然后直接线段树搞就行,先求区间最小值,如果大于零就更新统一减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建谷仓(贪心 + 线段树)的更多相关文章
- [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 ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 【洛谷】【线段树】P1047 校门外的树
[题目描述:] 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L ...
- 洛谷 P5280 - [ZJOI2019]线段树(线段树+dp,神仙题)
题面传送门 神仙 ZJOI,不会做啊不会做/kk Sooke:"这八成是考场上最可做的题",由此可见 ZJOI 之毒瘤. 首先有一个非常显然的转化,就是题目中的"将线段树 ...
- 【BZOJ】1696: [Usaco2007 Feb]Building A New Barn新牛舍(贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=1696 原题要求min(sum{|x-xi|+|y-yi|}),且一定要看题:“没有两头牛的吃草位置是 ...
- 洛谷P3374(线段树)(询问区间和,支持单点修改)
洛谷P3374 //询问区间和,支持单点修改 #include <cstdio> using namespace std; ; struct treetype { int l,r,sum; ...
- 洛谷P5280 [ZJOI2019]线段树 [线段树,DP]
传送门 无限Orz \(\color{black}S\color{red}{ooke}\)-- 思路 显然我们不能按照题意来每次复制一遍,而多半是在一棵线段树上瞎搞. 然后我们可以从\(modify\ ...
- 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 输出 * 第一行: ...
- 洛谷.T21778.过年(线段树 扫描线)
题目链接或者这吧.. 被数据坑了 /* 操作按左端点排个序 依次进行即可 不是很懂 为什么不写Build 而在Add时改mp[rt]=p 会WA(too short on line 251..) 找到 ...
随机推荐
- nodejs+multiparty 文件上传
通过表单提交上传文件: html代码 <form action="/uploadFile" method="post" enctype=" ...
- Java-学完一个月总结(javaSe学习路线)
JavaSe的一个月 第一周 0410 基本数据类型:数据类型的转换:运算符:导入删除项目0411 分支结构if else:switch case ;while0412 do while ;for / ...
- 获得select被选中option的value和text
一:JavaScript原生的方法 1:得到select对象: var myselect=document.getElementById(“test”); 2:得到选中项的索引:var index=m ...
- Android开发二维码之坑
之前一直做的是.NET开发用的是C#语言,近段时间由于做一个APP这才用上了java,在二维码扫描整合到APP里面遇到扫描二维码之后没有返回值,经过反复的尝试最后终于拿到了返回值,之后觉得很有必要记录 ...
- resharper10 注册方法
注册工具:http://pan.baidu.com/s/1bnFjGfX 注册方法: 1 编辑Products.json文件,留下自己要注册的产品路径即可. 2 运行patch.exe 3 使用Ser ...
- 在2015年 开发一个 Web App 必须了解的那些事
在过去的一年里,我在从头开始开发我的第一个重要的Web应用.经验教会了很多以前不知道的东西,特别是在安全性和用户体验方面. 值得一提的是,我上一次尝试构建的任何合理复杂性是在2005年.所以,在安全防 ...
- Android(java)学习笔记173:服务(service)之绑定服务的细节
绑定服务的细节 1. 如果onbind方法返回值是null,onServiceConnect方法就不会被调用: 2. 绑定的服务,在系统设置界面,正在运行条目是看不到的: 3. 绑定的服务,不求同时生 ...
- 三大框架所使用的UI框架
- 利用条件运算符的嵌套来完成此题: 学习成绩>= 90分的同学用A表示, 60-89分之间的用B表示, 60分以下的用C表示。
题目:利用条件运算符的嵌套来完成此题: 学习成绩>= 90分的同学用A表示, 60-89分之间的用B表示, 60分以下的用C表示. 程序分析:(a> b)?a:b这是条件运算符的基本例子. ...
- JavaSE-29 Java8的Lambda表达式
概念说明 Lambda表达式是Java8提供的新特性,支持将代码块作为方法的参数. Lambda表达式支持使用简洁的代码创建只有一个方法的接口(函数式接口). 只包含一个方法的接口也称为函数式接口. ...